Home Process & Switch
Post
Cancel

Process & Switch

Process


Process


  • 하나의 작업 단위

program과 process


  • program은 저장장치에 저장된 정적인 상태
  • process는 실행을 위해 메모리에 올라온 동적 상태

Program 실행과 Process 관리


  • program을 실행하면 process가 메모리에 올라온다.
  • 이때 PCB ( 프로세스 제어 블록 ) 이 커널 영역에 올라온다.
    • 커널은 PCB Data Structure 을 이용해 process를 관리한다.

  • 커널은 하드웨어 정보 또한 Data Structure 로 관리한다.

PCB나 하드웨어 자료구조를 메타데이터라 부른다.

PCB


  • PCB에는 무슨 정보가 있을까?


중요한 것들을 보자.

  1. 프로세스 구분자 : PID
  2. 메모리 정보 : 프로세스의 위치 정보
  3. state vector save area : 각종 레지스터 정보
    • context change가 발생하면 자신의 상태를 저장해야 한다.

  • PCB는 위와 같이 사용된다.

Fork


  • process를 복사하는 시스템 콜이다.

  • 장점

    • 프로세스 생성 속도가 빠르다.
      • 하드디스크에서 프로그램을 새로 가져오지 않고, 기존 메모리에서 복사하기 때문에 생성 속도가 빠르다.
    • 추가 작업 없이 자원을 상속할 수 있다.
      • 부모가 사용하던 모든 자원을 추가 작업 없이 자식에게 상속 가능하다.
    • 시스템 관리를 효율적으로 할 수 있다.
      • 부모와 자식 관계를 가지기 때문에 자식이 죽으면, 자식이 사용한 자원을 부모가 정리하게 된다.
  • 단점

    • 복사에 많은 비용이 든다.

child process를 만들자


  1. 부모의 PCB 복사한다.
    • 부모의 리소스를 자식과 공유한다.
    • PID는 바뀐다.
    • PPID, CPID가 바뀐다.
      • 자식은 CPID = -1
  2. child process의 메모리 공간을 확보한다.
    • 메모리 관련 정보가 변한다.
  3. 디스크에서 이미지를 긁어온다.
    • 기존 부모의 이미지에 overlay한 뒤, 시작 지점부터 실행된다.



fork 코드의 이해


  • fork( )는 두 번 반환된다. ( ? )
    • 한번은 부모로, 한번은 자식으로
  • fork를 하면 프로세스가 복사되고, state vector가 복사되므로 자식 프로세스 또한 fork ( ) 반환부터 진행된다.
    • 즉 자식 프로세스는 fork( ) 위의 코드를 진행하지 않는다.


  • 두 번째 코드는 wait( ) 시스템 콜로 인해 자식이 먼저 실행된다.
    • cpu를 뺏기고 큐에 다시 들어간다.

Exec


  • fork는 부모 프로세스를 복사하는 과정이다.
  • 복사한 뒤 새로운 프로세스를 overlay 할 때 사용되는 시스템 콜이다.
    • 즉 내용을 바꿔버리는 것이다.

이유 ?


  • 프로세스의 구조체를 재활용하기 위함이다.
    • 만약 새로운 프로세스를 만들려면 제어 블록을 만들고 메모리 확보 과정이 필요하다. 게다가 메모리 청소를 위해 부모, 자식 관계를 만들어야 한다.
    • exec ( )은 복사한 뒤 코드 영역만 바꾼다.

동작 과정


  • 기존 코드 영역을 지우고 새로운 코드로 바꾼다.
  • 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋된다.
  • 각종 레지스터 값과 사용한 파일 정보가 리셋된다.
    • 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항은 변하지 않는다.

Wait 과 Exit


wait


  • wait는 자식 프로세스가 종료될 때까지 대기 상태에 빠진다 .
    • 커널 모드로 갔다가 돌아오지 않고 cpu를 넘긴다.

exit


  • 프로세스가 종료된다.
  • 이후 좀비 상태가 되고 부모에게 signal을 보내 회수되길 기다린다.

system call summary


  • fork
    • create a child(copy)
  • exec
    • overlay new image, analogous to goto
  • wait
    • sleep until child is done
  • exit
    • frees all the resources, notify parent

Context Switch


  • 프로세스마다 할당된 cpu 사용 시간이 있고, 만약 시간을 다 쓴다면 cpu를 넘겨야 한다. 이때 Context Switch가 발생한다.

이때 PCB가 사용된다. PCB는 다음에 정리하도록 하자.

  1. 우선 사용자가 터미널을 킨다.
  2. shell이 만들어진다.
  3. “ls” 명령어 입력하면 fork가 발생한다.
  4. 복사된 child가 ready queue에 담긴다.
  5. wait으로 인해 부모는 cpu를 뺏긴다 .
  6. 자식은 exec을 실행하고 디스크에서 코드를 불러와 오버레이한다.
  7. ls 실행 후 exit 실행된다.
  8. 커널이 부모를 dispatches 하고, 실행된다.

  • 커널 모드와 유저 모드의 흐름이다.

조금 더…


커널에서 프로세스를 관리할 때 pcb를 이용한다.

  • wait 시스템 콜이 발생하면 context switch가 시작된다.
  • 커널모드로 전환되고, 현재의 cpu state vector를 진행 중이었던 pcd에 저장을 한다. 이후 현 프로세스는 ready 상태로 바뀌고 cpu를 뺏긴다.
  • ready queue에서 우선순위가 높은 프로세스를 찾아 실행한다.
    • 이때 해당 프로세스의 pcb를 cpu에 로딩한다.
    • 해당 프로세스의 주소로 PC가 이동한다.

  • wait( ) 콜이 아닌 때에도 시스템 콜은 발생한다.
  • 즉 내부적으로 context switch를 해주는 시스템 콜이 존재한다.
  • schedule ( )이 그 역할을 한다.
    • wait -> schedule -> context switch

정리


Context switch



Process


Context


Demon


  • 데몬은 백그라운드 프로세스이다.

  • 메모리에 상주하며 대기타는 프로세스이다.

    • 즉 루프를 돈다.
  • init 프로세스가 실행하며 데몬 관련 프로그램 명령어는 d로 끝난다.

    • 서비스라 부르기도 한다.
  • 일부 리눅스 배포판에서는 init이 systemd로 대체된다.

    • 이때 -d 는 데몬을 나타낸다.
    • pstree 명령어를 치면 트리를 볼 수 있다.
    • 모든 프로세스는 systemd에서 fork된다.

밑 사진은 우분투 20.04 기준이다.

  • 쉘을 찾아보자.

    • ssh를 이용해 원격 접속을 하고있다.
    • 이때는 SSHD(Secure Shell Daemon)를 이용한다.
    • ssh 연결을 받기 위해 대기 타는 것이다.
  • pstree 실행 중임을 알 수 있다.

  • 열심히 돌고 있는 mysql 데몬도 볼 수 있다.

This post is licensed under CC BY 4.0 by the author.