프로세스의 생성
운영체제는 모든 프로세스를 생성하지 않는다. 부팅시 부모 프로세스는 운영체제가 직접 생성되지만 그 다음에 생성되는 자식 프로세스는 부모 프로세스를 복제해 생성된다. 따라서 프로세스는 계층 구조를 형성하게 된다. 자식 프로세스가 먼저 죽고 이에 대한 처리는 그 부모 프로세스가 담당한다.
프로세스가 작업을 수행하기 위해서는 자원이 필요한데 자원은 운영체제로부터 할당받거나 부모 프로세스와 자원을 공유해서 사용할 수도 있다.
프로세스 수행 모델
- 부모와 자식이 공존하며 수행하는 모델: 자식과 부모가 같이 CPU를 할당받기 위해 경쟁하는 관계가 됨
- 자식이 종료될 때까지 부모가 기다리는 모델: 자식 프로세스가 종료될 때까지 부모 프로세스는 아무 일도 하지 않고 봉쇄 상태에 있다가 종료되면 준비 상태가 되어 다시 CPU를 얻을 권한이 생김
처음 자식 프로세스가 생성될 때 부모 프로세스의 주소 공간 내용을 복사한 주소 공간에 새로운 프로그램의 주소 공간을 덮어씌워 실행한다.
- fork( ): 부모 프로세스(fork() 시스템 콜을 호출한 프로세스)의 PID를 제외한 나머지 문맥들을 복제하여 자식 프로세스를 생성
- 부모 프로세스로부터 PC값을 포함한 내용을 복제해오므로 부모 프로세스가 수행한 시점부터 수행하게 된다.
- exec( ): 위의 프로세스를 새로운 프로그램으로 주소 공간을 덮어 씌운다.
- wait( ): 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록할 때 사용된다.
- fork이후 wait를 호출하면 커널은 자식 프로세스가 종료될 때까지 부모 프로세스를 봉쇄 상태에 머무르게 하고 자식 프로세스가 종료되면 부모를 준비 상태로 변경시켜 작업을 재개하도록 할 수 있다.(부모 프로세스와 자식 프로세스 간의 동기화 유지)
프로세스의 종료의 두 가지
- exit( ): 자발적 종료, 프로그램이 끝나는 부분에 exit()를 넣어 운영체제에게 프로그램이 종료되었음을 알린다. (생략해도 컴파일러가 자동으로 생성)
- abort( ): 비자발적 종료, 부모 프로세스가 자식 프로세스의 수행을 강제적으로 종료시킨다.
- 자식 프로세스가 할당 자원의 한계를 넘는 양의 자원을 요구할 때
- 자식 프로세스에게 할당된 작업이 더 이상 필요하지 않을 때
- 부모 프로세스가 종료될 때, 자식 프로세스부터 단계적인 종료(필요에 따라 다른 부모 프로세스로 넘겨서 계속 수행될 수 있음)
프로세스 간의 협력
프로세스는 각자 독립적인 주소 공간을 가지며 다른 프로세스가 이 공간을 참조하는 것은 허용되지 않는다. 하지만 독립적인 프로세스들끼리 협력하고 통신해야할 때가 있다. 따라서 운영체제는 IPC(Inter-Process Communication)를 제공한다.
- IPC: 단일 컴퓨터 내에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신과 동기화를 이루기 위한 매커니즘
통신외에도 동기화를 보장해야 한다. 공유 데이터를 서로 다른 두 프로세스가 사용하게 되면 데이터 불일치 문제가 발생할 수 있기 때문이다.
IPC의 대표적인 예: shared memory, message passing
message passing
프로세스 간 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으며 통신하는 방식이다. 두 프로세스는 메시지를 직접 전달할 수 없기 때문에 커널이 대신 전달하게 된다. 메시지 통신을 하는 시스템은 커널에 의해 send(message), receive(message)라는 두 가지 연산을 제공받는다.
통신을 원하는 두 프로세스는 communication link를 생성한 후 send()와 receive() 시스템 콜을 이용해 메시지를 주고 받을 수 있게 된다.
메시지 전달을 통해 통신하는 방식
- 직접통신: 통신하려는 프로세스의 이름을 명시적으로 표시
- send(P, message): 프로세스 P에게 메시지 전송
- receive(Q, message): 프로세스 Q로부터 메시지를 전달받음
- 커뮤니케이션 링크는 자동 생성되고 한 쌍의 프로세스에 하나의 링크가 할당, 대부분 양방향
- 간접통신: 메시지를 mail box 또는 포트로부터 전달받음
- 각 메일박스마다 고유 ID가 있고 메일박스를 공유하는 프로세스들만 서로 통신 가능
- 하나의 링크가 여러 프로세스들에게 할당될 수 있으므로 링크는 공유 가능
- send(A, message): A라는 메일박스에서 메시지를 전송
- receive(A, message): A라는 메일박스로부터 메시지를 전달받음
shared memory
프로세스들이 주소 공간의 일부를 공유한다. 원칙적으로는 안되지만 운영체제는 공유메모리를 사용하는 시스템 콜을 지원하여 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록 한다.
이 공유메모리 영역은 각자의 주소 공간에 공통적으로 포함되는 영역이므로 여러 프로세스들이 읽고 쓰는 것이 가능하다. 편리하지만 서로의 데이터에 일관성 문제가 발생할 수 있는 문제점이 있다. 커널이 책임지지 않으므로 프로세스끼리 직접 공유메모리 접근에 대한 동기화 문제를 알아서 해결해야 한다.