데이터 엔지니어
[OS Chapter 4] Process Management 본문
컴퓨터 과학(Computer science)/운영체제(Operating System)
[OS Chapter 4] Process Management
kingsmo 2020. 10. 20. 15:12
4번째 챕터입니다.
이번 챕터에서는 Process의 생성과 삭제를 코드로 설명해주십니다.
문제나 다른 정리본을 참고하실려면 아래 깃헙 레포를 참고해주세요.
깃헙 레포: github.com/smothly/OS-study-7week-challenge
프로세스
프로세스 생성
- 부모 프로세스를 복제하여 자식 프로세스를 만듭니다.
- 복제라는 것은 프로세스의 문맥을 그대로 복사하는 것이다.
- Copy-on-write(COW) write가 발생했을 때 copy하겠다.
- PC만 공유하다가 부모와 자식의 내용이 달라지면 그때 새로운 자식 프로세스를 만든다.
- 부모는 하나 자식은 여러개로 프로세스의 트리 구조(계층 구조)가 형성됨
프로세스는 자원을 필요로 함
- 운영체제로부터 받는다
- 부모와 공유는 경우에 따라, 원칙적으로는 공유하지 않음
자원의 공유
- 부모와 자식이 모든 자원 공유
- 일부 공유
- 전혀 공유하지 않음
수행(Execution)
- 부모 자식 공존하며 수행되는 모델
- 프로세스가 실행이 될 때 자식이 종료 될 때까지 부모가 기다리는 모델
주소공간
- 자식은 부모의 공간을 복사 (binary + OS data except PID)
- 복제된 공간에 새로운 프로그램을 올림
유닉스의 예
- fork() 시스템 콜 :새로운 프로세스 생성, 부모를 그대로 복사 + 주소공간 할당
- exec() 시스템 콜: 새로운 프로세스를 메모리에 올림
- 두개는 독립적인 명령임
프로세스 종료
- exit() 시스템 콜
- 코드에서 중괄호를 닫는 부분이 exit을 자동으로 된다.
- 자식이 부모에게 output data를 보냄(wait 시스템 콜)
- 프로세스의 각종 자원들이 운영체제게에게 반납됨
- abort
- 비 자발적인 종료
- 자식이 할당 자원의 한계치를 넘어섬
- 자식 태스크가 필요하지 않는 경우
- 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되지 않도록 한다. 밑에서부터 위로 단계적인 종료가 이루어진다.
Fork와 Exec 실제 코드 설명
fork() 시스템 콜
fork() 설명
- 자식 프로세스는 코드 처음부터가 아니라 fork를 실행한 이후 지점부터 실행하게 된다. 부모프로세스의 문맥을 복사하기 때문이다.
- 만약에 fork지점 부터가 아니라 처음부터하면 fork 자식프로세스가 무한대로 생성된다.
문제점
- 부모와 자식의 구분이 안생김
- return value가 다름. pid가 0이냐 0보다 크냐의 차이가 생김. 이로써 부모와 자식 프로세스의 분리가능
- fork이후 부분부터 시작하는 걸로도 구분할 수 있음.
- 모두 다 똑같은 제어흐름
- 위로 부모와 자식을 구분은 가능하지만 제어흐름은 똑같다. 그래서 exec 시스템콜이 있다.
exec() 시스템 콜
exec() 설명
- execlp가 exec 시스템 콜이다.
- 새출발하는거다. 다시 돌아올 수 없다.
- /bin/date라는 프로그램 이다.
- date라는 프로그램을 덮어씌우고 date프로그램에서 끝난다.
- echo도 프로그램으로 사용 가능
- 예시 execlp("echo", "echo", "hello", "3", (char *) 0) argument전달 형식이다.
- (char *) 0은 argument null pointer이다.
- exec 이후에 코드는 실행이 안되는 것이다.
wait() 설명
- 프로세스를 잠들게 하는 거다.
- 자식 프로세스가 종료될 때까지 기달리면서 프로세스 A를 sleep(block)시키는 것이다
- 자식 프로세스가 종료되면 커널은 프로세스 A를 깨운다.(ready 상태)
- 결국, wait라는 시스템 콜은 자식이 종료될 때 까지 대기
exit() 설명
- 프로세스를 종료할 때 명시
- 굳이 exit을 명시하지 않아도 마지막 동작을 수행 후 exit() 시스템 콜을 넣어줌
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜 (명시적으로 적어주지 않아도 됨)
- 비자발적 종료(외부에서 종료)
- 부모가 자식을 강제종료(자식 프로세스의 한계치를 넘어서는 자원 요청, 자식에게 할당된 태스크가 더 이상 필요하지않음)
- 키보드로 kill break 선언 ex) ctrl + c
- 부모가 종료하기 전에 자식이 먼저 종료
프로세스 간 협력
- 독립적 프로세스(Independent process) - 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스(Coopertating process) - 영향을 미침
- 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
- Message Passing: 메시지를 전달하는 방법
- 커널을 통해 전송, 공유 변수를 사용하지 않고 통신하는 시스템
- Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시
- Indirect Communication: mailbox나 port를 통해 메시지를 간접 전달
- Shared Memory: 주소 공간을 공유하는 방법
- Process A와 B가 일부영역을 공유한다.
- 초기설정에 커널의 도움을 받지만, 이후에는 프로세스간의 공유이다.
- Message Passing: 메시지를 전달하는 방법
주의!
thread는 process간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는
주소 공간을 공유하므로 협력이 가능
CPU 스케줄링
CPU burst와 I/O burst를 하는 단계가 번갈아가면서 사용
- CPU를 오랫동안 쓰는 job을 CPU bound job (점유) 계산 위주의 job
- I/O를 자주하는 job은 I/O bound job (빈도) I/O에 많은 시간이 필요한 job
여러 job이 섞여 있기 때문에 CPU 스케줄링(얼만큼 시간을 주고 뺏을 것이냐)이 필요하다.
CPU Scheduler & Dispatcher
CPU Scheduler
- Ready상태 프로세스 중에서 CPU를 줄 프로세스를 고르는 역할
Dispatcher
- CPU의 제어권을 CPU Scheduler로 부터 선택된 프로세스에 넘긴다.
- 이 과정을 Context Switch라고 한다.
주의! 둘다 하드웨어가 아니라 운영체제 안에 있는 거다
스케줄링이 필요한 경우
- Running -> Blocked (I/O요청하는 시스템 콜)
- Running -> Ready (timer interrupt)
- Blocked -> Ready (I/O완료 후 인터럽트)
- Terminate
1, 4는 nonpreemptive 강제로 빼앗지 않고 자진 반납
2, 3은 preemptive 강제로 빼앗음
'컴퓨터 과학(Computer science) > 운영체제(Operating System)' 카테고리의 다른 글
[OS Chapter 6] Process Synchronization (0) | 2020.11.01 |
---|---|
[OS Chapter 5] CPU Scheduling (0) | 2020.10.29 |
[OS Chapter 3] Process (0) | 2020.10.19 |
[OS Chapter 2] System Structure & Program Execution (0) | 2020.10.12 |
[OS Chapter 1] Introduction to Operating Systems (0) | 2020.10.11 |
Comments