ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 임시 - Linux Kernel - 4장 : Process management( 1 ) ( 고건 교수님 OLC 강의 )
    Linux Kernel 2024. 7. 4. 22:12

     

    4장 - Process management ( 1 )

     

     

    지난 3장에 이어서 좀 더 알아두어야 할 점은

    • kernel stack이 어떻게 변화되는가?
    • context_switch( ) 에서의 내부 로직이다.

    부모 프로세스가 fork( )를 하게 되면 부모 프로세스의 커널 스택에는 fork( )가 들어가게 되고,

    PCB와 이미지가 복제되면서 자식 프로세스의 커널 스택에도 fork( )가 들어가게 된다.

     

     

    부모가 fork( )에 대해 return을 하게 되면, 커널 스택에서 fork( )는 사라지게 된다.

    부모 프로세스가 fork( )를 한 이후에, wait( ) 함수를 호출하면서 본인의 cpu 점유를 넘겨줄 때,

    wait( ) 함수는 context_switch ( ) 함수를 호출하게 된다.

    ( 더 정확히는 wait → schdule → context_switch )

     

     

    이 때, 부모 프로세스의 커널 스택에는 wait( ), context_switch ( ) 순으로 쌓이게 된다.

    context_switch( ) 내부에 들어가서 instruction을 수행하다가 부모 프로세스는 cpu를 뺏겨 버린다.

    ( context_switch( ) 가 이때는 return되지 않는다!!)

     

     

    따라서 커널 스택에는 여전히 wait( ), context_switch( )가 남아있다.

    cpu를 할당받은 자식 프로세스의 커널 스택에는 fork( ) 함수가 들어있기 때문에 이에 대한

    return address값을 받으면서 유저 모드로 돌아오게 된다. ( 커널 스택도 비게 된다. )

     

     

    자식 프로세스의 모든 작업이 끝난 후, 부모 프로세스가 다시 cpu를 할당 받으면,

    context_switch( )에서 return 되고 wait( )에서 return 되어 유저 모드로 돌아오게 된다.

     


     

    리눅스는 PCB 자료구조를 1개의 자료구조로 관리하는 것이 아니라,

    6개의 자료구조로 나누어서 관리한다.

    task basic info는 cpu에 대한 정보들,

    fs는 file system, tty는 해당 프로세스가 사용하는 터미널, mm은 메모리 정보를 담고 있다.

     

     

    이렇게 6개의 자료구조로 나누어 사용하는 이유는 ,

    Process의 생성에 오버헤드를 줄이고자 함이다.

     

     

    Process의 생성에 오버헤드가 생기는 요인 2가지는

    • PCB의 복사
    • 이미지의 복사

    인데, 자식 프로세스와 부모 프로세스가 만약 같은 터미널을 사용한다면

    굳이 새로 자료구조를 만들어 write하고 read할 필요 없이,

    기존에 있던 부모의 값을 포인터로 가리켜 read만 하면 되는 것이다.

     

     

    자식 프로세스가 부모 프로세스의 자료구조를 모두 복사하면 heavy-weight 생성이라고 하고,

    자식 프로세스가 부모 프로세스의 일부분만을 선택적으로 복사하면 light-weight 생성이라고 한다.

     

     

    복사 안한 다른 부분은 부모 프로세스의 자료구조를 포인터로 가리킨다.

    쓰레드의 경우 Light Weight Process라고도 불리는 이유가 여기에 있다.

     

     

    Thread의 경우 CPU에 대한 정보를 부모로 부터 복사하고 ( task basic info )

    다른 부분은 정말 최소한으로 복사한다.

     

     

    쓰레드를 만들 때, clone ( ) system call을 사용하게 되는데,

    clone 함수의 인자값이 1이면 부모의 자료구조를 복사하고, 0이면 포인터로 가리킨다.

    thread 의 경우 clone (00000) 을 함으로써, 최소한의 데이터만 복사할 수 있다.

     

Designed by Tistory.