ESL 연구실 활동/Kernel of Linux

리눅스커널강의 3~4강

천숭이 2022. 4. 15. 14:38

# pid가 뜻하는 값

pid < 0 : error

pid == 0 : child process

pid > 0 : parent proces

 

# wait, exit 시스템콜에 따른 전환

P1. 사용자의 명령어를 실행하기 위해서, fork를 통해 새로운 프로세스 생성. 부모쉘의 PCB와 쉘을 복사 (cpu가 부모쉘에 있는 상황)

 

C1. 자식 쉘이 ready queue에서 기다리는 상태가 됨

 

P2. wait() system call로 부모 프로세스가 cpu를 반납하고 sleep

 

C2. ready queue에서 생성된 자식프로세서가 기다림

C3. (부모 쉘이  sleep으로 wait하고 있을때) 자식프로세스의 코드가 실행됨

C3. 자식 코드 실행

C4. exec()를 통해 디스크에서 명령어에 해당하는 코드를 찾고 코드 load. (코드 overwrite)

     자식 프로세서의 동작이 모두 수행됨

C5. 자식 프로세서 종료 (exit() 시스템 콜)

     CPU가 반환되며 다른 프로세스에게 부여

 

P3. 자식 프로세서가 종료됐으므로 wait를 멈추고 복귀

 

# CPU&PCB 관점의 전환 <- schedule()의 임무

프로세서1이 block되면 wait(2) 시스템 콜. 

wait(2) 시스템 콜은 CPU 상태를 커널 내부에 있는 프로세스1 PCB에 저장.

CPU는 다른 프로세스를 찾고, 프로세스2를 발견.

프로세스2의 PCB에 저장된 CPU를 불러오고 실행시킴

 

# schedule()

 - 커널 내부에서만 실행 가능한 함수.

- 다음에 실행할 프로세스를 부르고 실행

- 그리고 context_switch() 함수 실행

 -> 현재 CPU상태를 저장후(parent), 다음 실행될 PCB(child)를 통해 CPU레지스터를 불러오는 역할

 -> read(), wait(), exit()과 같은 함수를 통해서 불려진다

schedule() {
save old state vector
  choose next process
  load new state vector
  return  }

 

** fork시 발생하는 전환의 전체 과정 **

 

 

# "프로세스" 개념

- 실행중인 프로그램

-  a.out (private 주소 공간)

- main 코드

- 스케줄링의 단위

- 자원 할당

- user mode / kernel mode (os Kernel, system call)

 

# Daemon (or server) 프로세스

- a.out의 형식

- request가 요청될때만 이러나고 나머지는 sleep

 


4강 - Linux PCB

 

# (코드) 구조체와 해당 내용을 가리키는 포인터

struct task_struct {
    volatile long state;
    struct thread_info               *thread_info;
    unsigned long flags;
    int prio, static_prio;
    // 6개의 struct
    struct list_head tasks;
    struct mm_struct                 *mm;
    struct task_struct               *parent;
    struct list_head children;
    struct list_head sibling;
    struct tty_struct
    
/* ipc stuff */
    struct sysv_sem sysvsem;
/* CPU-specific state of this task */
    struct thread_struct thread;
/* file system information */
    struct fs_struct
/* open file information */
    struct files_struct              *fs;
    signals                          *files;
/* namespace */
    struct namespace                 *namespace;
/* signal handlers */
    struct signal_struct             *signal;
    struct sighand_struct            *sighand;
};

PCB 리눅스 구조체

 

# PCB가 6개의 구조체로 나뉜 이유

 read/write 시간을 줄이기 위해

 

# 리눅스 "스레드"

 = LWP (light-weight process)

자식 스레드가 생성될 시 Task basic info만 복사됨. 

그 이유는 하위 내용이 같으므로 부모 스레드를 참고하면 되기 때문 -> 시간 절약

1에 해당하는 영역만 clone

 

 

parent의 이미지가 가리키는 테이블 page mapping table만 child로 복사

결과 : child는 이미지만 가지고 있음.

child가 write할때 문제가 발생 

'ESL 연구실 활동 > Kernel of Linux' 카테고리의 다른 글

리눅스커널강의 7~9강 (작성중)  (0) 2022.04.17
리눅스커널강의 5~6강  (0) 2022.04.15
리눅스 커널 강의 1~2강  (0) 2022.04.15
리눅스 커널 강의 0  (0) 2022.04.15