1. 프로세스 생성
부모 프로세스가 자식 프로세스를 생성 ☞ 프로세스의 트리 계층 구조 형성
모든 프로세스는 자원을 필요로 함
- 1. 운영체제로부터 직접 자원을 전달받음
- 2. 부모 프로세스와 자원을 공유함
→ 부모와 자식이 모든 자원을 공유하는 모델
→ 일부를 공유하는 모델
→ 전혀 공유하지 않는 모델 (일반적)
UNIX의 예
- fork() 시스템 콜
→ 부모 프로세스는 해당 시스템 콜을 통해 자신의 복사본을 자식 프로세스로 생성
→ 이때 자식 프로세스는 프로세스 ID를 제외한 부모 프로세스의 모든 정보 (문맥)를 복사 - exec() 시스템 콜
→ 자식 프로세스는 해당 시스템 콜을 통해 자신의 메모리 영역을 새로운 프로그램으로 덮어씌움
2. 프로세스 종료
자발적 종료
- exit() 시스템 콜
→ 운영체제에 자신이 종료됨을 통보하는 시스템 콜
→ 운영체제는 자원을 회수
비자발적 종료
- abort() 시스템 콜
→ 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시키는 시스템 콜 - 1. exit() 시스템 콜을 통해 부모가 종료하는 경우
→ 운영체제는 부모가 종료하는 경우 더 이상 자식이 수행되도록 두지 않음
→ 최하단 자식부터 차례대로 종료됨 (단계적 종료)
→ 고아 프로세스 : 부모가 먼저 종료된 자식 프로세스 - 2. 자식이 할당 자원의 한계치를 넘어서는 요구를 할 경우
- 3. 자식에게 할당된 Task가 더 이상 필요하지 않은 경우
3. fork() 시스템 콜
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() 이후의 코드부터 실행한다.
- 또한 fork() 시스템 콜은 부모 프로세스의 경우 자식 프로세스의 PID (양수)를 반환하고, 자식 프로세스의 경우 0을 반환한다.
4. exec() 시스템 콜
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");
}
- 부모 프로세스가 fork() 시스템 콜을 통해 자식 프로세스를 생성한다.
- 그 후 자식 프로세스가 execlp() 시스템 콜을 통해 메모리 공간을 새로운 프로그램으로 덮어씌운다.
5. wait() 시스템 콜
int main() {
int pid;
pid = fork();
if (pid == 0) {
/* code for child process */
}
else if (pid > 0)
wait();
}
- wait() 시스템 콜은 "자식이 종료될 때까지 부모가 기다리는 모델"에서 프로세스 간 동기화를 위해 사용된다.
- 부모 프로세스가 wait() 시스템 콜을 호출하면 커널은 자식 프로세스가 종료될 때까지 부모 프로세스를 Blocked 상태로 만든다.
- 그 후 자식 프로세스가 종료되면 커널은 부모 프로세스를 Ready 상태로 만든다.
6. 프로세스 간 통신
프로세스 간 통신 (IPC, Inter-Process Communication)이란?
- 프로세스는 각자의 메모리 영역을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함 (독립적)
- 프로세스 간 통신 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음 (협력적)
메시지를 전달하는 방식
- 메시지 전달 (Message Passing)
→ 메시지를 프로세스끼리 직접 주고받을 수 있다면 원하지 않는 메시지를 전달해 다른 프로세스에 악영향을 미칠 수 있으므로 운영체제는 메시지를 주고받는 연산을 특권 명령으로 규정해 커널을 통해서만 가능하도록 설계
→ Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
→ Indirect Communication : Mailbox 또는 Port를 통해 메시지를 간접 전달
메모리 영역을 공유하는 방식
- 공유 메모리 (Shared Memory)
→ 서로 다른 프로세스 간에도 일부 메모리 영역을 공유 - 스레드 (Thread)
→ 스레드는 사실상 하나의 프로세스이므로 프로세스 간 통신으로 보기는 어려움
→ 동일한 프로세스를 구성하는 스레드 간에는 메모리 영역을 공유하므로 통신 가능
이화여자대학교 반효경 교수님의 운영체제 강의를 정리한 글입니다.
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09
또한 반효경 교수님의 "운영체제와 정보기술의 원리" 책을 참고하였습니다.
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=238716482
'OS' 카테고리의 다른 글
6. 프로세스 동기화 (0) | 2024.01.03 |
---|---|
5. CPU 스케줄링 (0) | 2023.12.30 |
3. 프로세스 (0) | 2023.12.25 |
2. 컴퓨터 시스템 구조 & 프로그램 실행 (0) | 2023.12.21 |
1. 운영체제 소개 (2) | 2023.12.20 |