학부 수업 정리/시스템프로그래밍 (21-2)
[시스템] 1. Processes - 생성과 삭제
퐁키조아
2021. 12. 28. 17:32
1. Context Switch
프로세스들은 같은 시스템 내에서 동시에 실행될 수 있는데, 이는 Context Switch에 의해서 일어난다. 각 프로세스들은 자신만의 Control flow 가 존재하는데 Context Switch 가 발생하면 저장하고 다른 프로세스를 실행한 뒤에, 다시 원래 저장된 정보를 환원하여 실행한다.
2. fork: Creating new processes
$\verb|pid_t fork(void)|$
- fork는 부모 프로세스와 똑같은 자식 프로세스를 생성한다.
- 자식 프로세스는 0을 리턴하고, 부모 프로세스는 자식의 pid를 리턴한다.
- 두 프로세스로 나뉘어 실행되지만, 어느 것이 먼저 실행되는지는 모른다.
- getpid(): 현재 진행되는 자신의 프로세스 아이디를 리턴한다.
부모와 자식은 동시에 새로운 코드를 실행한다. 시작될 때 초기상태는 똑같지만, 각자 자신만의 공간이 생기기 때문에 상대방에 더이상 영향을 미치진 않는다. 하지만 자식과 부모 중 누가 먼저 실행되는지는 알 수 없다.
#include <stdio.h>
#include <unistd.h>
void fork1()
{
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
}
else {
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n", getpid(), x);
}
/*
Parent has x = 0
Bye from process 2087 with x = 0
Child has x = 2
Bye from process 2088 with x = 2
*/
3. exit: Destroying Process
$\verb|void exit(int status) / int atexit(void (*function)(void))|$
- exit()는 프로세스를 종료하는 함수로, 일반적으로 0을 리턴한다.
- main() 함수가 일반적으로 0을 리턴하는 것도 이 함수 때문이다.
- atexit(cleanup)는 exit이 될 때 cleanup 이라는 함수가 호출된다는 의미로, 함수의 유언장 같은 것이다.
#include <stdio.h>
#include <unistd.h>
void cleanup(void) {
printf("Cleaning up\n");
}
void fork6()
{
atexit(cleanup);
fork();
exit(0);
}
/*
Cleaning up
Cleaning up
*/