프로세스 생성
- 부모 프로세스가 자식 프로세스 생성
- 복제 생성을 한다.
- 1대 n의 관계
- 구조가 트리형태로 구성된다.
- 프로세스는 자원을 필요로 한다.
- 운영체제로부터 받는다.
- 부모와 공유한다.
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델(원칙)
- 수행(Execution)
- 부모와 자식은 공존
- 자식이 종료될 때까지 부모가 기다리는(wait, blocked) 모델
- 주소 공간
- 자식은 부모의 공간을 복사함 (binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec () 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- 사용자 프로그램은 불가능하고 사용자가 OS에게 자식을 낳아달라고 부탁하는 경우
- fork() 시스템 콜이 새로운 프로세스를 생성
프로세스 종료
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
- 자식이 부모에게 output data를 보냄 (via wait).
- 프로세스의 각종 자원들이 운영체제에게 반납됨.
- 부모 프로세스가 자식의 수행을 종료시킴 (abort)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 테스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
- 자식이 먼저 종료되야하므로 자식들을 먼저 종료시키고 부모가 종료된다. (단계적인 종료)
- Copy-on-write (COW) 기법
- 부모와 메모리 공간을 공유하다가 write(원래 있는 내용이 변경될 때)가 발생했을 때 copy를 하도록 하는 것.
- 조각난 데이터에 write가 발생하면 그 부분만 copy가 발생함
프로세스와 관련된 시스템 콜
- fork() : create a child (copy)
- exec() : overlay new image
- wait() : sleep until child is done
- exit() : frees all the resources, notify parent
fork() 시스템 콜
- 프로세스는 fork() system call에 의해 생성된다.
- caller의 주소공간을 복사해서 새로운 주소공간을 만든다.
- Program counter도 그대로 복사하므로 자식 프로세스는 fork() 실행 이후부터 실행된다.
- fork()의 생각할 수 있는 문제점
- 부모와 자식을 어떻게 구분할 것인가?
- 구분을 위해, 부모는 pid > 0을 return 받고, 자식은 pid = 0을 반환받는다.
- 똑같은 제어흐름을 따르는 프로그램
- pid의 구분으로 exec하지 않아도 같은 코드 내에서 다른 일을 시킬 수 있다. (조건문으로 pid > 0일때, 0일때를 구분하는 경우 등)
- exec 시스템 콜을 통해서 다른 프로그램을 실행할 수 있도록 한다.
- 부모와 자식을 어떻게 구분할 것인가?
exec() 시스템 콜
- 프로세스가 다른 프로그램을 실행할 수 있도록 하는 시스템 콜
- 프로그램의 시작 부분부터 다시 시작한다.
- exec을 반드시 fork와 같이 써야하는 것은 아니다.
- 프로그램을 덮어씌우는 용도로 사용
- 프로그램이 덮어씌워지는 의미이므로 exec 이후의 코드는 실행되지 않는다.
wait() 시스템 콜
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(block 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
- 자식이 종료될 때까지 기다리는 시스템 콜
- 자식이 종료될 때까지 부모가 기다리는 모델에 해당된다.
- 리눅스의 command line은 wait() 시스템 콜을 호출하는 모델이다.
- 프로그램이 실행이 완료될 때까지 다른 프로그램을 호출할 수 없음
exit() 시스템 콜
- 프로세스의 종료
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해 종료
- 프로그램에 명시적으로 적지 않아도 compiler가 main 함수가 리턴되는 위치에 exit()을 호출함.
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 테스크가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 친 경우
- Ctrl + C, alt+F4 등
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자발적 종료
프로세스 간 협력
- 독립적 프로세스
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘(IPC : Interprocess Communication)
- 메시지를 전달하는 방법
- message passing : 커널을 통해 메시지 전달
- 프로세스 간 직접 메시지 전달은 불가능
- 주소 공간을 공유하는 방법
- shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- 메시지를 전달하는 방법
*thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보긴 어려우나, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능.
Message Passing
- Message system
- 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
- Direct Communication
- 통신하려는 프로세스의 이름을 명시적으로 표시
- ex) Process P(Send(Q,message)) → (커널의 개입) → Process Q(Receive (P, message))
- Indirect Communication
- mailbox (또는 port)를 통해 메시지를 간접 전달
- 통신 대상이 명시되어있지 않음
- ex) Process P(Send(M,message)) → Mailbox M → Process Q(Receive (M, message))
Shared Memory
- 커널의 도움을 받아 두 프로세스가 주소 공간을 공유할 수 있도록 허락 받음
- 한번 shared 되면, 다음부터는 프로세스 간에 커널 없이 직접적으로 data를 주고 받을 수 있음.
'Computer Science > 운영체제' 카테고리의 다른 글
프로세스와 스레드의 개념과 이해 - CPU 스케줄러 구현하기 (Java) (3) | 2023.02.07 |
---|---|
반효경 운영체제 - 4. CPU Scheduling (0) | 2023.01.15 |
반효경 운영체제 - 2.2 쓰레드 (0) | 2023.01.04 |
반효경 운영체제 - 2.1 프로세스 (0) | 2023.01.03 |
반효경 운영체제 - 1. 시스템 구조와 프로그램 실행 (0) | 2023.01.03 |