1. 프로세스 생성(Process Creation)
COW(Copy-on-Write)
한 프로세스가 있으면, 그 프로세스가 다른 프로세스를 생성한다. 부모 프로세스가 자식 프로세스를 생성한다는 것과 같다. 그 자식은 또 다른 자식 프로세스를 생성하고, 반복되다 보면 프로세스의 트리(계층구조)가 형성된다.
프로세스는 자원을 필요로 하는데, (1)운영체제로부터 (직접) 받거나, (2)부모와 자원을 공유하는 두 종류가 있다. 더 자세하게는 (1)부모와 자식이 모든 자원을 공유, (2)부모와 자식이 일부를 공유, (3)전혀 공유하지 않는 경우 세 가지가 있다. 보통은 (3)공유하지 않는 경우가 많다. 왜냐하면 프로세스가 생성된 순간, 부모-자식은 원칙적으로 독립적인 프로세스가 되어 CPU 할당을 위해 경쟁하기 때문이다.
생성된 프로세스들이 수행될 때, (1)부모-자식이 공존하여 수행하는 경우, (2)자식이 종료될때까지 부모가 기다리는 모델이 있다. 프로세스 수행에서 더 자세히 다룬다.
프로세스를 생성하는 방식은 위에 언급했든 부모가 자식을 생성하는데, 이때 (1)fork로 자식이 부모의 공간을 그대로 복사하고, (2)exec 시스템 콜로 새로운 프로그램을 자식에 덮어씌운다. process id를 제외하고는 거의 그대로 복붙한다. 만약 fork 없이 exec을 콜하면, 그 프로세스가 완전히 새로운 프로세스가 된다.
2. 프로세스 종료(Process Termination)
(1) exit() 프로세스가 마지막 명령을 수행한 수행한 후 운영체제에게 이를 알린다
- 자발적인 종료
- 자식이 부모에게 부모에게 데이터를 보낸다
- 부모는 데이터를 받는다. 부모는 wait 콜에 의해 자식이 종료될 때 까지 블록 상태로 대기
- 프로세스의 자원이 운영체제에게 반복된다
(2) abort() 부모가 자식의 수행을 모두 종료시킨다
- 자식이 할당 자원의 한계치를 넘어설 때(자원을 너무 많이 쓰니까)
- 자식에게 할당된 태스크가 필요하지 않을 때(시킬 일이 없으니까)
- 부모가 종료하는 경우: 부모 프로세스가 종료될 경우, 가장 아래 계층부터 모든 프로세스를 종료시킨다
3. fork() 시스템 콜
fork() 시스템 콜 ➡️ 프로세스 생성
int main(){
int pid;
pid = fork();
if(pid == 0) {
printf("child");
}
else if(pid > 0){
printf("parent");
}
}
위의 코드에서 pid = process id
fork()는 자식 프로세스를 생성한다. 즉 부모 프로세스를 그대로 복사한다. 리턴값은 무조건 양수.
조건문으로 내려가서, pid가 양수이면(fork의 리턴값) 부모, 0이면 자식이다.
프로세스가 생성되었을때의 pid는 0이다
4. exec() 시스템 콜
exec() 시스템 콜 ➡️ 프로세스를 새로운 내용으로 덮어씌움
int main(){
int pid;
pid = fork();
if(pid == 0) {
printf("child");
execlp();
}
else if(pid > 0){
printf("parent");
}
}
위의 코드에서 execlp()가 자식의 내용을 덮어씌운다.
5. wait() 시스템 콜
wait() 시스템 콜
➡️ 커널이 child가 종료될 때까지 프로세스를 sleep(block 상태)
➡️ 자식 프로세스 종료
➡️ 커널이 부모를 깨움(ready)
1에서 나온 내용 그대로, 자식 프로세스가 생성+실행되면 부모는 자식이 종료될때까지 대기한다.
6. exit() 시스템 콜: 프로세스의 종료
(1) 자발적 종료
- 마지막 문장 수행 후 exit() 콜을 통해
- 프로그램에 명시되어있지 않아도, main() 함수의 return 위치에 컴파일러가 넣어준다
(2) 비자발적 종료
- 부모가 강제로: 1)시킬 일이 없을때 2) 자원을 너무 많이 슬 때
- 입력으로 강제 종료
- 부모가 종료하는 경우 자식들 다 종료시키고 부모가 마지막에 종료
7. 프로세스간 협력
(1) 독립적 프로세스(Independent Process)
프로세스는 각자의 주소 공간을 가지고 수행되므로, 원친적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함(예시로 워드와 한글처럼)
(2) 협력 프로세스(Cooperating process) & 매커니즘
프로세스 협력 매커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
매커니즘은 아래와 같다.
1) 메세지 전달 - message passing
커널을 통해 메세지를 전달한다. 공유 변수는 일체 사용하지 않는다.
- [Direct Communication] 통신하려는 프로세스의 이름을 명시적으로 표시해서, 중간에 무언가를 거치지 않고 바로 목적지로 메세지를 전달
- [Indirect Communication] mailbox(|| port)를 통해 메세지를 전달한다. 잘 안 쓴다.
2) shared memory: 프로세스 사이에 일부 주소 공간을 공유하게 한다. 프로세스들의 메모리 공간을 중첩시켜서, 메모리에게 영역을 내어준 프로세스들에게 메모리가 접근할 수 있다
3) thread(프로세스 안 CPU 수행 단위가 여러개): 스레드는 사실상 하나의 프로세스이므로, 프로세스 간 협력으로 보기는 어렵지만, 프로세스를 구성하는 스레드 간에는 주소 공간을 공유하므로 협력이 가능하다. 굳이 위의 두 방법을 쓰지 않아도 서로간의 소통이 쉽다.
'Operating System' 카테고리의 다른 글
[운영체제] Deadlocks (0) | 2022.05.09 |
---|---|
[운영체제] System Structure & Program Execution (0) | 2022.04.04 |
[운영체제] Introduction to Operating System (0) | 2022.04.04 |