3 min read

<운영체제> Context Switch and Process Creation

<운영체제> Context Switch and Process Creation

<Context Switch>

  • When CPU switches to another process, the system must save the state of the old process and load the saved state for the new precess
    • save하고 load하는 대상이 무엇인가?
      1. System context(3가지) : Process data structure allocated by kernel
        -> PCB, Page/Segment Table, File table, etc.
      2. Hardware Context : Register information such as Programe counter, stack pointer, etc
      3. Memory space, a.out image in disk -> process image
  • Context-switch time is purely overhead, the system does no useful work while switching
  • time slice to execute를 적절하게 조정해서 context switching time을 결정해야한다
    • time slice가 너무 크면 process가 길게 실행되어 사용자가 mutitasking이 안되는것처럼 느낌
    • time slice가 너무 작으면 전체 실행 시간 중 overhead인 context-switching에 할당하는 시간이 너무 늘어남
PCB = task structure

<Process Creation>

  • Parent process create children processes
  • Resource sharing type in process hierarchy
    • Parent and children share all resuoures(UNIX) : 부모,자식이 모든 리소스를 공유
    • Children share subset of parent's resoureces : 일부만 공유
    • Parent and child share no resources : 공유안함
  • Execution
    • Parent and children execute concurrently
    • Parent watis until children terminate(UNIX) -> 자식이 종료되면 부모 프로세스 시작
  • Address space
    • Child process duplicates parent process address space-> 주소공간의 모든것을 그대로 복제함 -> fork()
    • Child's program is loaded into into its duplicated address space -> 복제된 모든것이 동일한 주소공간에 child process를 호출한 프로그램의 image를 덮어쓴다.

<Fork, Exec, Wait>

  • fork() system call
    • only way to increase the number of processes -> 프로세스를 증가시키는 유일한 방법
    • create a copy of itself : copy a.out image(binary image),kernel data structure(PCB), 두가지를 그대로 복사
    • all environment are inherited : file offset, program counter까지 전부 다 복사!
      • program counter : program를 어디서부터 읽은지 결정하는 책갈피 같은 거라 이해
    • only PID(주민등록번호) differs plus...lock attribure(컴퓨터의 지문 같은 느낌으로 이해하자..)
  • exec() system call
    • Rerieve a file form disk(program file을 가져옴)
    • overlay on old a.out image(기존의 바이너리 파일을 덮어쓴다)
    • Jump to start location(program counter를 제일 앞으로 -> 당연히 새로운 image니까 처음부터 읽어야함!)
  • wait() system call
    • If PA invokes wait() -> the kernel blocks PA
      • until child terminates
      • when child terminates, kernel wakes up the parent
      • kernel puts the parent into ready queue
      • parent is dispatched later

<fork와 exec예제 - 리눅스에서 실행해보기>

#include <stdio.h>

int main(){
        int pid;
        pid = fork();
        //wait() 이거 하고 안하고의 차이는??
        if(pid == 0){

        printf("\n hello child \n");
                }
        else{
        printf("\n hello parent \n");
        }
}

include <stdio.h>

main()
{
        char *arg[] = {"ls", "-l", (char*)0};
        printf("before executing ls -l \n");
        execv("/bin/ls",arg);
        printf("after executing ls -l \n");
}