이 포스팅은 반효경 운영체제 강의 를 듣고 정리하는 글이다.
fork, exec실습 코드는 깃허브에 있다.
프로세스 생성
부모 프로세스는 1개만 존재하고, 자식 프로세스들을 생성한다.
copy on write (cow) 기법
주소 공간
자식은 부모의 공간을 복사한다.
자식은 그 공간에 새로운 프로그램을 올린다.
유닉스에서는 fork 시스템 콜 을 통해 부모 프로세스와 똑같이 복사한다.
수행
- 부모 자식이 공존하며 수행되는 모델
- 자식이 종료될 때까지 기다렸다가 수행되는 모델
프로세스 종료
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알린다. (exit)
- 자식이 부모에게 output data를 보낸다.
- 프로세스의 각종 자원들이 운영체제에게 반납됨
부모 프로세스가 자식의 수행을 종료시킨다. (abort)
- 자식 프로세스가 할당 자원의 한계치를 넘어설때
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지않음
- 단계적인 종료
자식을 전부 죽이고서 부모가 죽게되는 구조
wait()
프로세스가 wait() 시스템 콜을 호출하게 되면,
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킴 (block 상태)
- 자식 프로세스가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
exit()
프로세스의 종료
exit()을 만나는 순간 바로 종료가 되게 된다.
자바로 하게되면 System.exit(0);
자발적 종료
마지막 작업 수행 후 exit() 시스템 콜을 통해 수행
프로그램에 명시적으로 넣어주지 않아도 main 함수가 return되는 위치에 컴파일러가 삽입해준다.
비 자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 작업이 더 이상 필요하지 않음
- 키보드로 kill, break를 수행한 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료
프로세스간 협력
독립적 프로세스
프로세스는 각자의 주소 공간(코드, 스택, 데이터)을 가지고 수행되므로,
원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
협력 프로세스
프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스에 영향을 미칠 수 있다.
프로세스 협력 메커니즘 (IPC: Inter Process Communicaiton)
- 메세지를 전달하는 방법
message passing : 커널을 통하여 메세지를 전달
프로세스에게 직접 전달하는 방법, mailbox를 통한 전달방법 - 주소 공간을 공유하는 방법
shared memory : 서로 다른 프로세스 간에 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 존재 (이 부분도 커널에게 공유하겠다는 시스템 콜을 이용해야한다)
program은 CPU를 사용하는 단계 (CPU burst) -> I/O를 수행하는 단계 (IO burst)를 계속 반복하며 실행된다.
(물론 CPU만 사용하는 프로그램도 존재할 수 있음)
여러종류의 job(=process)가 섞여있어 CPU스케줄링이 필요하다.
Interactive job에게 적절한 응답 제공하기 위함
CPU와 입출력 장치등의 시스템 자원들을 골고루 효율적으로 사용하기 위함
CPU 스케줄러
ready 상태의 프로세스 중 이번에 CPU를 줄 프로세스를 고름
Dispatcher
CPU의 제어권을 CPU 스케줄러에 의해 선택된 프로세스에게 넘김
이 과정을 context switching(문맥 교환)이라 한다.
'CS > 운영체제' 카테고리의 다른 글
운영체제 2강 - 2 (0) | 2022.08.18 |
---|---|
운영체제 2강 - 1 (2) | 2022.08.11 |
운영체제 1강 (0) | 2022.08.11 |
프로세스 상태 (0) | 2022.08.10 |