-
[OS] 프로세스의 생성과 프로세스 간의 협력Computer Science/OS 2023. 1. 12. 18:56
시스템이 부팅 된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그 다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 됩니다.
이 때 프로세스를 생성한 프로세스를 부모 프로세스라고 하고, 새롭게 생성된 프로세스를 자식 프로세스라고 한다.
프로세스의 세계에선, 자식이 먼저 죽고 이에 대한 처리는 자식을 생성했던 부모 프로세스가 담당하는 방식으로 진행된다.
프로세스 생성(Process Creation)
- 부모 프로세스가 자식 프로세스 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 작업을 수행하기 위해서는 자원을 필요로 함
- 자원 획득 방법
- 운영체제로부터 받는다
- 부모와 공유한다
- 자원 획득 방법
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행(Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
- 주소 공간(Address space)
- 처음 주소 공간을 생성할 때에는 자식은 부모의 공간을 복사(binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 프로세스의 생성 절차에 대한 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary) → 부모 프로세스와 자식 프로세스는 비록 주소 공간을 따로 갖게 되지만 주소 공간 내에는 동일한 내용을 가지게 된다.
- 주소 공간 할당
- 부모를 그대로 복사 (OS data except PID + binary) → 부모 프로세스와 자식 프로세스는 비록 주소 공간을 따로 갖게 되지만 주소 공간 내에는 동일한 내용을 가지게 된다.
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- fork() 시스템 콜이 새로운 프로세스를 생성
프로세스 종료- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
- 자식이 부모에게 output data를 보냄(via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 자식이 부모에게 output data를 보냄(via wait)
- 부모 프로세스가 자식의 수행을 종료시킴(abort)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 테스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다
- 단계적인 종료
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다
- 자식이 할당 자원의 한계치를 넘어섬
fork() 시스템 콜운영체제는 자식 프로세스의 생성을 위해 fork() 시스템 콜을 제공한다.
프로세스가 fork() 시스템 콜을 하게 되면 CPU의 제어권이 커널로 넘어가게 되고, 커널은 fork()를 호출한 프로세스를 복제해 자식 프로세스를 생성하게 된다 . (부모 프로세스의 주소 공간 이외에도 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제)
→ 부모 프로세스가 현재 수행한 시점(프로그램 카운터 시점)부터 수행하게 됨
exec() 시스템 콜exec() 시스템 콜은 프로세스가 지금까지 수행했던 상태를 잊어버리고 그 주소 공간을 완전히 새로운 프로그램으로 덮어씌운 후 새로운 프로그램의 첫 부분부터 다시 실행을 시작하도록 하는 시스템 콜이다.
wait() 시스템콜wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용된다.
- block 상태로 오래걸리는 이벤트를 기다리고 CPU 상태를 얻을 수 있는 ready 상태로 변경시켜 작업을 재개할 수 있도록 한다.
exit() 시스템콜프로세스는 명령을 모두 수행한 후, 프로그램이 마쳐지는 코드부분에 exit()라는 시스템 콜을 넣어주도록 되어 있다.
프로세스의 종료에는 2가지가 있다.
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해
- 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 마지막 statement 수행 후 exit() 시스템 콜을 통해
- 비자발적 종료( 밖에서 종료 시킬 때)
- 부모 프로세스가 자식 프로세스를 강제 종료 시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 키보드로 kill, break 등을 친 경우
- 부모 프로세스가 자식 프로세스를 강제 종료 시킴
프로세스와 관련된 시스템콜
- fork()
- create a child (copy)
- 프로세스를 복재 생성하는
- exec()
- overlay new image
- 새로운 프로그램을 덮어 씌우는
- wait()
- sleep until child is done
- 자식이 종료될 때까지 기다리는
- exit()
- frees all the resources, notify parent
- 자원을 반납하고 프로세스를 종료시키는
프로세스 간 협력
원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미칠 수 없다.
그러나, 업무의 효율에 따라 독립적인 프로세스들이 협력할 경우가 있다.
따라서, 운영체제는 프로세스 간의 협력 메커니즘을 제공해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있게한다.
- 독립적 프로세스(Independenet process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스(Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
- 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신 → 정보를 주고받을 수 있는 방법
프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
IPC의 대표적인 방법에는 2가지가 있다.
- 메시지를 전달하는 방법(message passing)
- 커널을 통해 메시지 전달
- 필요한 공유자원이 필요할 시, 메시지를 주고받으며 통신하는 방식
- 종류
- 직접 통신
- 간접 통신
- 커널을 통해 메시지 전달
- 주소 공간을 공유하는 방법(shared memory)
- 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- 프로세스 간 공유가 되도록 설정해놓은 메모리
- 처음 생성 시에만, 시스템 호출을 사용하기 때문에 속도가 빠르다.
- 서로의 데이터에 일관성 문제가 유발 될 수 있어, 동기화 문제를 책임져야한다.
why? 프로세스 A와 B가 독자적인 주소 공간을 가지고 있지만, 이 주소 공간이 물리적 메모리에 매핑될 때, 공유메모리 주소 영역에 대해서는 동일한 물리적메모리 주소로 매핑되기 때문에 일관성 문제가 유발될 수 있다. - thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는 주소 공간을 공유하므로 협력이 가능하다
- 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
'Computer Science > OS' 카테고리의 다른 글
[OS] CPU 스케줄링 - 2 (스케줄링 알고리즘) (0) 2023.01.17 [OS] CPU 스케줄링 - 1 (CPU 스케줄러, 스케줄링 성능평가) (0) 2023.01.17 [OS] 쓰레드와 멀티쓰레드 (0) 2023.01.05 [OS] 운영체제 프로세스, 스케줄러 (0) 2022.12.29 [OS] 시스템 구조와 프로그램 실행 (0) 2022.12.29