시스템프로그래밍 중간정리(lect9)
process
A program loaded in the memory.
//컴파일해서 실행파일을 만들면 디스크에 저장되게 되는데 디스크에 저장되어 있는 상태에서는 실행파일 또는 프로그램이라고 부릅니다.
process = body + process descriptor
body= code + data + stack
process descriptor = pid(process identifier) + state + mm(메모리 위치)
scheduler
어느 한순간에 메모리를 보면, 프로세스가 하나만 떠서 실행되는 경우는 거의 없다.
이때 각 프로세스를 어떤것부터 처리할 것인가를 scheduler라는 것이 결정해준다.
"current" is pointing to the current process running
System calls to manage processes
처음에 시스템이 부팅이되면 "운영체제"라는 프로그램 하나만 로딩이 된다. 첫번째 프로세스는 운영체제인 것.
fork와 exec을 통해 계속 child들을 만들고, 이들을 모두 합해서 현재 프로세스의 리스트를 이루게 된다.
•fork: duplicate a process
What happens when a program calls fork():
1) copy body
2) copy process descriptor
3) adjust child's process descriptor
4) return 0 to child //아이에게는 0이 리턴.
5) return child's pid to parent //부모에게는 아이의 pid가 리턴
ex1:
void main(){
int x;
x=fork();
if (x==0) printf("ok1\n");
else printf("ok2\n");
}
- the scheduler may schedule the child first
$ ./ex1
ok1
ok2
- or the scheduler may schedule the parent first
$./ex1
ok2
ok1
#include <stdio.h>
#include <stdlib.h>
void main(){
int x, i;
for(i=0;i<5;i++){
x=fork();
if (x==0){ // child
int k;
for(k=0;k<10;k++){
printf("%d-th child running %d-th iteration “, i, k);
fflush(stdout); // to make printf work immediately
sleep(1); // sleep 1 second
}
exit(0); // child exits after 10 iterations
}
}
// now parent
printf(“parent exits\n”);
}
이 코드는 fork() 시스템 호출을 사용하여 총 5개의 자식 프로세스를 생성하며, 각 자식 프로세스는 10번의 반복문을 실행한 후 종료합니다.
fork() 함수는 새로운 프로세스를 생성합니다. 부모 프로세스에서는 새로 생성된 자식 프로세스의 프로세스 ID를 반환받고, 자식 프로세스에서는 0을 반환받습니다. 그래서 이 코드에서 if (x==0) 구문은 자식 프로세스에서만 실행됩니다.
그러나 이 코드에는 주의할 점이 있습니다. 부모 프로세스는 자식 프로세스들이 모두 생성된 직후에 "parent exits"라는 메시지를 출력하고 종료합니다. 이 경우, 부모 프로세스는 자식 프로세스들이 완전히 종료될 것이라는 보장이 없기 때문에, 부모 프로세스가 자식 프로세스보다 먼저 종료될 수 있습니다.
만약 부모 프로세스가 자식 프로세스보다 먼저 종료되면, 그 자식 프로세스들은 "고아 프로세스(orphan process)"가 됩니다. 고아 프로세스는 부모 프로세스가 없는 프로세스를 의미하며, 이들은 시스템에 의해 'init' 프로세스 (프로세스 ID가 1인 프로세스)의 자식으로 채택됩니다.
'init' 프로세스는 시스템 부팅 시에 생성되며, 모든 프로세스의 부모가 될 수 있습니다. 부모 프로세스가 종료된 자식 프로세스는 'init' 프로세스에 의해 채택되어, 그들의 종료 상태는 'init' 프로세스에 의해 수집됩니다. 이를 통해 "좀비 프로세스(zombie process)" 생성을 방지합니다.
좀비 프로세스는 자신의 종료 상태를 부모 프로세스에게 전달하지 못하고 시스템에 남아있는 프로세스를 말합니다. 부모 프로세스가 종료 상태를 수집하지 않으면, 자식 프로세스는 종료되었지만 프로세스 테이블에 여전히 남아있게 되며, 이는 시스템 자원의 낭비를 초래합니다.
그러나 리눅스와 같은 대부분의 현대 운영체제에서는 이러한 고아 프로세스와 좀비 프로세스 문제를 자동으로 관리합니다. 그래서 일반적으로 부모 프로세스가 자식 프로세스보다 먼저 종료되는 것은 큰 문제가 되지 않습니다. 하지만 가능한 한 좀비 프로세스를 생성하지 않도록 주의하는 것이 좋습니다.
•exec: transform a process into another
•exit: stop the process
•wait: wait for the exit of the child process
•getpid: get process ID
•getppid: get parent process ID
'C||C++' 카테고리의 다른 글
| [Visual Studio 2026] 폰트 및 테마 변경하는 법 (0) | 2025.12.20 |
|---|---|
| 시스템프로그래밍 중간정리(lect8) (0) | 2023.05.29 |
| 시스템프로그래밍 중간정리(lect7) (0) | 2023.05.26 |
| 시스템프로그래밍 중간정리(lect 6) (0) | 2023.05.16 |
| 시스템프로그래밍 중간정리(lect 5) (0) | 2023.05.06 |