- 프로세스 생성
- 부모가 자식을 복제 생성
- 문맥을 복제 (메모리, PC 등)
- 그러나 쓰레드에서 본 것과 같이, 똑같은 내용을 2copy 만드는 것은 메모리 낭비
- Copy on Write
- 이로 인해, 자식 프로세스가 생성되면 부모 프로세스와 메모리를 공유하게됨
- 자식이 명령어를 수행하면서 내용이 바뀔 때마다 copy
- 즉, write를 할 때마다 copy
- 최대한 공유하며 잘게 쪼게진 단위로만 copy
- fork, exec
int main()
{
int pid;
pid = fork();
if (pid == 0) printf("\n Hello, I am child!\n");
else if (pid > 0) printf("\n Hello, I am parent!\n");
}
- fork() 시스템 콜
- 자식 프로세스는 fork() 이후 부터 실행
- 자식 프로세스 생성은 문맥 전체를 복사(Program Counter) - 부모는 pid > 0
- 자식은 pid == 0
- 자식 프로세스는 fork() 이후 부터 실행
int main()
{
int pid;
pid = fork();
if (pid == 0){
printf("\n Hello, I am child! Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char *)0);
}
else if (pid > 0) printf("\n Hello, I am parent!\n");
}
- exec() 시스템 콜
- /bin/date의 시작부분부터 실행
- 자식을 만들어야 실행할 수 있는 것은 아님
- wait() 시스템 콜
- 부모는 자식이 종료될 때까지 blocked
- 자식이 종료되면 ready
- exit() 시스템 콜
- 자발적 종료
- 마지막 명령 수행 후 (main의 마지막) -> 컴파일러가 삽입
- 중간에 exit() 명령을 만나는 경우
- 비자발적 종료
- 부모 프로세스가 자식을 강제종료
- kill을 치는 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들을 먼저 다 죽이고 죽음
- 자발적 종료
- 프로세스간 협력
- 독립적 프로세스
- 보통 프로세스들은 다른 프로세스에게 영향을 미치지 못함 - 협력 프로세스
- 협력 메커니즘(IPC)으로 다른 프로세스 수행에 영향을 미침 - IPC(Interprocess Communication)
- 1. message passing
- 커널을 통해 메시지를 전달 - 2. shared memory
- 주소공간을 두 프로세스가 공유
- 일부 영역을 mapping할 때, 두 프로세스가 같은 영역에 mapping
- 1) 처음에 두 프로세스가 커널에게 shared memory를 사용하겠다고 알림
- 2) 그 이후로는 커널없이 두 프로세스가 공유된 메모리로 데이터를 주고 받음 - * Thread
- IPC로 보긴 어려우나, 프로세스 내의 쓰레드들은 주소 공간을 공유하므로 협력이 가능
- 1. message passing
- 독립적 프로세스
- Message Passing
- 프로세스 사이에서 공유 변수를 사용하지 않고 통신하는 시스템
- 모두 커널을 통해 메시지를 전달
- 1. Direct Communcation
- 통신하려는 프로세스의 이름 명시 - 2. Indirect Communication
- mailbox에 메시지를 저장
- CPU 스케줄링
- 프로그램의 보편적인 path
- 1) CPU 사용 (instruction 실행)
- 2) I/O
- 두 가지가 번걸아가며 진행 - I/O bound job
- CPU를 짧게 쓰고 I/O가 끼어드는 job
- 빈도가 매우 높음 - CPU bound job
- CPU만 오래 쓰는 job
- 빈도가 낮음 - CPU 스케줄링이 필요한 이유
- 여러 종류의 job이 섞여있음
- I/O bound job은 주로 사람과 interaction이 있는 job
- 따라서, response time을 줄이기 위해 I/O bound job에게 CPU가 우선적으로 많이 가는 것이 중요
- 프로그램의 보편적인 path
- CPU Scheduler & Dispatcher
- CPU Scheduler와 Dispatcher는 운영체제의 커널 코드
- CPU Scheduler
- 어떤 프로세스에게 CPU를 할당할지 결정 - Dispatcher
- CPU scheduler가 선택한 프로세스에게 CPU를 넘겨주는 역할
- CPU 스케줄링이 필요한 경우
- 1. Running -> Blocked : I/O와 같이 오래 걸리는 작업을 하러 간 경우 (자진해서 CPU 반납)
- 2. Running -> Ready : 시간 만료 (CPU를 빼앗는 경우)
- 3. Blocked -> Ready : I/O 완료 (우선순위가 높은 프로세스라면 바로 실행)
- 4. Terminate
- 1번과 4번 : 자진 반납 (non-preemptive)
- 2번과 3번 : 강제로 빼앗김 (preemptive)
'CS > 운영체제' 카테고리의 다른 글
[운영체제] KOCW 반효경 교수님 강의 - 11. CPU Scheduling 2 (0) | 2022.04.12 |
---|---|
[운영체제] KOCW 반효경 교수님 강의 - 10. CPU Scheduling 1 (0) | 2022.04.06 |
[운영체제] KOCW 반효경 교수님 강의 - 8. Process Management 1 (0) | 2022.03.30 |
[운영체제] KOCW 반효경 교수님 강의 - 7. Process 3 (0) | 2022.03.30 |
[운영체제] KOCW 반효경 교수님 강의 - 6. Process 2 (0) | 2022.03.28 |