Operating System Ch 3 : Process Management

이정빈·2023년 12월 29일
0

OS

목록 보기
3/15

3.1 Process Concept

프로세스

하나의 프로그램을 실행시키면 운영체제가 여러 자원을 지원해야하는데, 이런 작업이나 CPU 활동을 프로세스라고함, 또는 실행중인 프로그램이라고함

3.1.1 The Process

텍스트 - 실행코드
데이터 - 전역 변수
힙 - 동적으로 할당되는 메로리
스택 - 함수를 호출할 때 임시 데이터 저장 장소

텍스트, 데이터 부분의 크기는 고정됨

스택, 힙은 크기 고정x

  • 함수를 호출 할때마다 지역변수, 매개변수 및 복귀 주소를 포함하는 활성화 레코드가 스택에 푸시됨

또한, 실행 파일이 메모리에 적재되야, 프로그램은 프로세스가 되는 것이다.

3.1.2 Process State


프로세스는 실행 중에 상태가 변한다.

새로운 : 프로세스 생성
실행 : 명령들이 실행
대기 : 프로세스가 어떤 이벤트가 일어나기를 기다림
준비 : 프로세스가 처리기에 할당되기를 기다림
종료 : 프로세스의 실행이 종료

3.1.3 Process Control Block


각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현된다. (PCB)
(프로세스의 구조라고 이해)

프로세스 상태 : 새로운, 준비, 대기, 실행, 종료
프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
레지스터 : 레지스터에는 다양한 정보가 포함되는데, 프로그램 카운터와 레지스터 상태 정보는, 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 작동하도록 인터럽트 발생 시 저장되어야함
CPU 스케줄링 정보 : 프로세스 우선순위
메모리 관리 정보 : 운영체제가 사용하는 메모리 시스템
회계 정보 : CPU 사용 시간, 프로세스 번호
입출력 상태 정보 : 이 프로세스에 할당된 입출력 장치들과 연린 파일의 목록

프로세스 제어 블록 (PCB)는 CPU 사용 시간, 프로세스를 시작시작시키거나 다시 시작시키는데 필요한 모든 데이터를 위한 저장소의 역할

PCB에는 위와 같은 정보를 저장한다.

3.1.4 Threads

단일 스레드는 문자를 입력하면서, 동시에 검사를 실행할 수 없다.
하지만 최근에는 다수의 실행 스레드를 프로세스가 가진다.

다중 스레드에서는 입력하면서 검사까지 할 수 있고, PCB는 각 스레드에 관한 정보를 포함하도록 확장되야 한다.

PCB가 여러 스레드도 관리해야 한다.

3.2 Process Scheduling

멀티 프로그로맹으로 CPU를 최대한 이용할 수 있고, 여러 프로그램이 실행되면 여러 프로세스가 생성되는데, 여러 프로세스들 사이에 CPU코어를 계속 교체하는 것

교체하기 위해서는 프로세스 스케줄러가 필요하다.
프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중 1개의 프로세스를 택한다. (CPU 코어는 1번에 1개의 프로세스만 실행 가능)

그래서 단일 코어에서는 한 번에 2개 이상의 프로세스가 실행할 수 없다.

코어보다 많은 프로세스가 있으면, 프로세스가 기다려야 하는 상황이 일어나고, 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 함

I/O 바운드 프로세스는 계산에 소비하는 것보다 I/O에 더 많은 시간 소요
CPU 바운드 프로세스는 계산에 더 소비

3.2.1 Scheduling Queue


프로세스가 준비 큐에 들어가서 준비 상태가 되어 실행되기를 기다린다.
스케줄러가 어떤 프로세스를 먼저 사용할지 결정
준비 큐 헤더에는 PCB에 대한 포인터가 저장

시스템에는 다른 큐도 존재
특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐에 삽입

프로세스가 준비 큐에 들어가고, CPU 코어가 할당되고 실행상태가 된다.
그러면 여러 이벤트 중 하나가 발생할 수 있다.

프로세스가 I/O 요청을 하면 I/O 대기 큐에 놓임
프로세스가 새 자식 프로세를 만들고 자식의 종료를 기다리면 대기 큐에 놓임

이 2경우에는 프로세스가 결국 대기에서 준비로 전환된 다음에 준비 큐에 들어감

준비 큐에 있던 것들이 실행될 수도 있고, 어떤 이벤트가 발생하면 대기큐에 들어갈 수 있다. 대기 큐에서는 준비 상태로 전환된 후에, 다시 준비 큐에 들어감

3.2.2 CPU Scheduling

CPU 스케줄러는 준비 큐에 있는 프로세스 1개를 CPU 코어에 할당하고, 새 프로세르를 자주 선택해야한다.

스와핑

  • 중간 형태의 스케줄링
  • 때로는 멀티 프로그래밍이 어느 정도 감소하는 것이 유리할 때 작용된다.
  • 프로세스를 나중에 다시 메모리에 적재하면 중단 위치에서 실행시킬 수 있음
  • 일반적으로 메모리가 초과 사용될 때

3.2.3 Context Switch

인터럽트가 발생하면, 인터럽트 처리 후 다시 context로 복구를 해야하는데, 그렇게 하기 위해선 애초에 프로세스의 context를 저장해야함

이런 정보들은 PCB에 저장됨
CPU의 현재 상태를 저장하고, 복구하는 작업을 수행한다.

CPU 코어를 다른 프로세스로 교환하려면, 저장, 복구를 해야하고 이 작업을 context switch라고 한다.

context switch가 일어나면, 커널이 PCB에 문맥을 저장하고, 새로은 프로세의 저장된 문맥을 복구한다. 그동안 overhead임

3.3 Operating on Processes

3.3.1 Process Creation


PID가 1인 프로세스가 부모 프로세스이다.
시스템이 부팅되면, 부모 프로세스로부터 다양한 프로세스가 생성된다.

자식 프로세스를 생성할 떼, 자식 프로세스는 자신의 임무를 달성하기 위해 자원이 필요하다.
OS로부터 가져오거나, 부모 프로세스가 가진 자원의 부분 집합을 사용

부모 프로세스는 일부분만 자식한테 주어서 과부화를 방지한다.

프로세스가 새로운 프로세스를 생성할 때, 두 프로세스를 실행시키는 두가지 방법
1. 부모는 자식과 병행하게 실행을 계속
2. 부모는 일부 또는 모든 자식이 실행을 종료할 떄까지 기다린다.

두가지 가능성
1. 자식 프로세스는 부모 프로세스의 복사본
2. 자신에게 적재될 새로운 프로그램을 가지는 경우

새로운 프로세스는 fork를 통해 생성되는데, 새로운 프로세스는 원래의 프로세스의 복사본이다.
그래서 통신이 쉽게 가능하고, 대신 PID가 다르다.
자식 프로세스는 0임

한 프로세스가 exec()를 사용하면 자신의 메모리 공간을 새로운 프로그램으로 교체한다.
exec는 이진 파일을 메모리에 적재하고, 그 프로그램의 실행을 시작한다.

자식 프로세스는 자원뿐 아니라 특권과 스케줄링 속성을 부모로부터 상속받는다.
그 후에 execlp를 사용하여 자신의 주소 공간으로 덮어씀

부모는 wait로 자식 프로세스가 끝나기를 기다린다.

3.3.2 Process Tremination

프로세스가 실행을 끝내고, exit를 사용하여 자신의 삭제를 요청하면 종료한다.
그리고 부모는 wait를 통해 상태 값을 반환할 수 있따.

window의 termiateprocess는 다른 프로세스의 종료를 발생시킴
보통, 프로세스 종료는 부모만이 가능함
또한, 부모도 자신을 죽이긴 위해서 PID를 알아야 한다.
그래서, 자신이 생기면 PID가 부모에게 전달됨

자식 중 하나가 실행이 종료되는 경우
1. 자식이 자신에게 할당된 자원을 초과할때
2. 자식이 할일 없을 때
3. 부모가 exit를 하는데, 운영체제가 자식이 실행하는 것을 허용하지 않을 때

부모프로세스가 wait를 호출할 때까지 프로세스는 남아있고, 이런것들을 좀비 프로세스라고 한다.

부모프로세스가 wait를 호출하지 않고 종료하면 자식 프로세스를 고아 프로세스라고 한다.

3.4 Interprocess Communication

프로세스는 독립적이지만, 다른 프로세스들끼리 영향을 주고 받을 수 있따.
정보공유, 계산 가속화, 모듈성을 이유로 협력하기도 한다.

프로세스간 통신 IPC 기법이 필요하다.
IPC에는 공유 메모리, 메시지 전달 모델이 있다.

공유 메모리 도델은 협력 프로세스들에 의해 공유되는 메모리 영역이 구축된다.
메시지 전달 모델에서는 통신이 협력 프로세스들 사이에 교환되는 메시지를 통하여 이루어진다.

메시지 전달 모델은 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하기 유용, 구현도 쉽다.
대신 속도는 공유메모리가 더 빠름, 공유 메모리는 커널의 도움이 필요없이 메모리 접근 가능

3.5 IPC in Shared Memory Systems

공유 메모리를 사용하려면 프로세스 간에 공유 메모리 영역을 프로세스 사이에 구축을 해야한다.
공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치한다.
이 공유 메모리 세그먼트를 프로세스들의 자신의 주소공간에 추가한다.
그런 후에 이용가능

생산자 프로세스는 정보를 생산, 소비자 프로세스는 정보를 소비한다.
ex) 컴파일러는 어셈블리어를 생산, 어셈블러는 이것을 소비

생산자 소비자는 공유 메모리를 사용하고, 대신 동기화를 꼭 해줘야한다.
생산자와 소비자 사이의 버퍼가 있어야함

무한버퍼 : 생산자 소비자 문제에서는 버퍼의 크기에 실질적인 한계가 없고, 소비자는 새로운 항목을 기다려야만 할 수도 있지만, 생산자는 항상 새로운 항목을 생산할 수 있다.

유한 버퍼 : 버퍼의 크기가 고정되어 있다고 가정하고, 버퍼가 비어 있으면 소비자는 반드시 대기해야 하며, 모든 버퍼가 채워져 있으면 생산자는 대기해야 한다.


in은 버퍼 내에서 다음으로 비어 있는위치, out은 버퍼 내에서 첫번쨰로 채워져 있는 위치


생산자 프로세스는 다음번에 생산되는 item을 저장하고 있다.
소비자는 다음번에 소비되는 것을 저장

프로세서들이 메모리 영역을 공유할 것을 필요로 하며, 공유 메모리에 접근하고 조작하는 코드에 의해 명시적으로 작성되어야 한다.

3.6 IPC in Message-Passing Systems

메시지 전달 방식은 동일한 주소 공간을 사용하지 않고도 프로세스들끼리 통신하고 동기화할 수 있음, 작은것에 이용+ 구현 쉬움

프로세스 P,Q가 통신을 하려면, 통신 연결이 설정되어야 한다.
send, receive를 구현해야함

  1. 직접, 간접 통신
  2. 동기식, 비동기식 통신
  3. 자동, 명시적 버퍼링

3.6.1 Naming

간접 통신, 직접 통신을 사용, 통신을 원하는 프로세스들은 서로를 가리킬 수 있어야함


직접 통신, 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 한다.

  1. 통신을 원하는 각 프로세스의 쌍들 사이에 연결이 자동으로 구축되고 상대방의 PID만 알면된다.
  2. 연결은 정확히 두 프로세스만 연관
  3. 정확하게 하나의 연결이 존재해야함

송신자와 수신자 프로세스가 모두 통신하려면 서로의 이름을 알아야하는 대칭성이 보이고, 송신자만 수신자의 이름을 지명하는 비대칭도 사용할 수 잇다.

대칭적, 비대칭적 기법은 서로의 프로세스를 지정하는 방식때문에 모듈성을 제한하므로 하드코딩 방식이므로 비추천



간접 통신에서는 메일박스, 포트로 송신되고, 수신자는 그것을 수신한다.
각 메일박스는 고유의 ID를 가진다.
그래서 다른 프로세스들과 통신할 수 있다.

  1. 한쌍의 프로세스들 사이의 연결은 공유 메일박스를 가질때만 구축됨

  2. 연결은 2개 이상의 프로세스들과 연관가능

  3. 다수의 서로 다른 연결이 존재하고, 각 연결은 하나의 메일박스가 있어야 한다.

  4. 하나의 링크는 최대 2개의 프로세스가 연관된다.

  5. 한 순간에는 최대 하나의 프로세스가 receive 연산이 가능하다.

  6. 어느 프로세스가 메시지를 수신할지는 시스템이 임의로 선택

메일 박스를 소유하고 있는 프로세스가 종료할 때, 메일 박스는 사라진다
그 후에 이 메일박스로 메시지를 송신하는 모든 프로세스는 더는 메일 박스가 존재하지 않는다는 사실을 반드시 통보받아야 한다.

반면에, 운영체제가 소유한 메일박스는 자체적으로 존재한다.
새로운 메일박스를 생성하는 프로세스는 디폴트로 메일박스의 소유자가 된다.

3.6.2 Synchronization

메시지 전달은 봉쇄형(동기식), 비봉쇄형(비동기식)으로 나뉨

3.6.3 Buffering

통신이 직접, 간접에 상관없이 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어가 있음

  1. 무용량 : 큐의 최대 길이가 0이다. 링크는 자체 안에 대기하는 메시지들을 가질 수 없다. 이 경우에, 송신자는 수진자가 메시지를 수신할 때까지 기다려야함
  2. 유한 용량 : 최대 n개의 메시지가 있을 수 있다. 링크가 가득차면 송신자는 큐 안에 공간이 이용 가능할 때까지 반드시 봉쇄된다.
  3. 무한 용량 : 송신자는 절대 봉쇄되지 않음

3.7 Examples of IPC Systems

3.7.1 POSIX Shared Memory

3.7.2 Mach Message Passing

3.7.3 Windows

3.7.4 Pipes

3.8 Communication in Client-Server Systems

3.8.1 Socket

소켓은 통신의 극점(endpoint)를 뜻한다.
두 프로세스가 각각 소켓을 가지고 잇음
각 소켓은 IP주소+포트 번호

서버는 지정된 포트에 클라이언트 요청을 기다리고, 요청이 수신되면 연결 요청을 수락한다.
클라이언트 프로세스가 연결을 요청하면, 호스트 컴ㅍ터가 포트번호를 부여한다.

모든 연결은 유일해야 하며, 다른 클라이언트 프로세스가 위와 동일한 웹 서버와 통신을 하면, 다른 포트 번호를 부여받는다.

3.8.2 RPC

3.9 Summary

프로세스는 실행 중인 프로그램이며, 프로세스의 현재활동상태는 프로그램 카운터와 다른 레지스터로 나뉜다.

메모리에서 프로세스의 구조는 텍스트, 데이터, 힙, 스택

프로세스가 실행되면 상태가 변경된다. 준비, 실행, 대기, 종료

프로세스 제어 블록 (PCB)는 운영체제의 프로세스를 나타내는 커널 데이터 구조

프로세스 스케줄러의 역할은 CPU에서 실행할 수 있는 프로세스를 선택하는 것

운영체제는 한 프로세스에서 다른 프로세스로 실행이 전활될때 context switch라고 한다.

fork는 프로세스를 생성하는데 사용

프로세스 간 통신에 공유 메모리를 사용하는 경우, 두 개 이상의 프로세스가 동일한 메모리 영역을 공유 (POSIX)

메시지 전달을 사용하여 두 프로세스가 서로 메시지를 교환하여 통신할 수 있다. (Mach), window

파이프는 두 프로세스가 통신할 수 있는 통로를 제공한다. 일반 및 지명 파이프의 두 가지 형태가 있다. 일반 파이프는 부모-자식 관계가 있는 프로세스 간의 통신을 위해 설계, 지명 파이프가 더 일반적이며, 여러 프로세스가 통신할 수 있다.

UNIX는 파이프 시스템 콜을 통해 일반 파이프를 제공

0개의 댓글