학부 수업 정리/시스템프로그래밍 (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
*/