Process
Process
- 하나의 작업 단위
program과 process
- program은 저장장치에 저장된 정적인 상태
- process는 실행을 위해 메모리에 올라온 동적 상태
Program 실행과 Process 관리
- program을 실행하면 process가 메모리에 올라온다.
- 이때 PCB ( 프로세스 제어 블록 ) 이 커널 영역에 올라온다.
- 커널은 PCB Data Structure 을 이용해 process를 관리한다.
- 커널은 하드웨어 정보 또한 Data Structure 로 관리한다.
PCB나 하드웨어 자료구조를 메타데이터라 부른다.
PCB
- PCB에는 무슨 정보가 있을까?
중요한 것들을 보자.
- 프로세스 구분자 : PID
- 메모리 정보 : 프로세스의 위치 정보
- state vector save area : 각종 레지스터 정보
- context change가 발생하면 자신의 상태를 저장해야 한다.
- PCB는 위와 같이 사용된다.
Fork
process를 복사하는 시스템 콜이다.
- 복제가 아닌 process를 만드는 것은 많은 자원이 소모된다.
- https://kldp.org/node/57233
- https://www.bell-labs.com/usr/dmr/www/hist.html
장점
- 프로세스 생성 속도가 빠르다.
- 하드디스크에서 프로그램을 새로 가져오지 않고, 기존 메모리에서 복사하기 때문에 생성 속도가 빠르다.
- 추가 작업 없이 자원을 상속할 수 있다.
- 부모가 사용하던 모든 자원을 추가 작업 없이 자식에게 상속 가능하다.
- 시스템 관리를 효율적으로 할 수 있다.
- 부모와 자식 관계를 가지기 때문에 자식이 죽으면, 자식이 사용한 자원을 부모가 정리하게 된다.
- 프로세스 생성 속도가 빠르다.
단점
- 복사에 많은 비용이 든다.
child process를 만들자
- 부모의 PCB 복사한다.
- 부모의 리소스를 자식과 공유한다.
- PID는 바뀐다.
- PPID, CPID가 바뀐다.
- 자식은 CPID = -1
- child process의 메모리 공간을 확보한다.
- 메모리 관련 정보가 변한다.
- 디스크에서 이미지를 긁어온다.
- 기존 부모의 이미지에 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는 다음에 정리하도록 하자.
- 우선 사용자가 터미널을 킨다.
- shell이 만들어진다.
- “ls” 명령어 입력하면 fork가 발생한다.
- 복사된 child가 ready queue에 담긴다.
- wait으로 인해 부모는 cpu를 뺏긴다 .
- 자식은 exec을 실행하고 디스크에서 코드를 불러와 오버레이한다.
- ls 실행 후 exit 실행된다.
- 커널이 부모를 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 데몬도 볼 수 있다.