프로세스에 대해 알아보자.
실행 중인 프로그램을 프로세스라는 것을 알고 있을터, 프로세스를 테스크(task)라고 부르는 시스템도 있다.
이 녀석이 어떤식으로 메모리에 올라가고, 어떻게 구성되어 있는지에 대해 알아볼 참이다.
먼저 프로그램이 실행되면, 메모리에 로드가 된다.
메모리에 올라온 모습을 보면, PCB(Process Control Block) 과 프로그램이 올라와 있다.
(메모리 로드 과정은 이미 여러번 설명했으니.. 블로그를 뒤져보시길..^.^)
PCB란 프로세스에 대한 정보를 담고 있는 테이블이다.
task_struct 라는 구조체를 참조하여 커널에 들어있는 프로세스에 대한 정보를 갖고온다.
PCB에 들어있는 프로세스 상태에 대한 그림을 함보자.
먼저 프로세스가 생성되고 (new), 프로세스가 할당되길 기다리고 있는 상태가 된다.(ready)
그후 프로세스가 디스패치되어 실행상태가 되고(running) 있다가 이벤트 대기 상태(waiting)가 될 수 있다.
이렇게 ready, running, waiting 상태가 순환되다가 완전히 프로세스가 종료되는 상태(terminated)가 된다.
중간에 실행중인 프로세스의 상태를 PCB에 보관하고 새로운 프로세스를 실행시키는 것을 Context switch 라고한다.
PCB가 task_struct 구조체를 참조한다고 했다.
잠깐 process 상태에 대한 task_struct에 매크로를 보면 아래와 같다.
멀티테스킹이 가능한 요즘 LINUX, UNIX 시스템에서 프로세스 목록을 확인해보면
아래와 같이 나온다. ( $ps -e : 모든 사용자의 프로세스 목록을 보여준다.)
빨간 네모친 부분이 보통 커널에서 조작하는 프로세스들이다.
그 밑에 숫자가 2만 3만 넘어가는 녀석들은 사용자 프로세스.
저 숫자들을 PID(Process ID) 라고 하는데, 각 프로세스들을 식별할 때 사용한다.
보통은 프로세스가 종료되면 PID를 재사용한다.
종료되자마자 너무 빨리 재사용하면 시스템에서 종료되기 이전의 프로그램으로 인식할 수도 있어
시스템에서는 재사용을 지연시키는 알고리즘도 구현되어 있다.
근데, 이렇게 일반 프로세스들의 PID는 재사용이 되지만 0번 1번 PID는 고정이다.
0번은 스케줄러 프로세스(=swapper),
1번은 init 프로세스 이다.
스케줄러 프로세스는 커널의 일부이다. (이런걸 시스템 프로세스 라고 한다.)
커널이라고 봐도 무방한데, 참.. 커널 자기자신을 프로세스라고 일컫는 것도 뭔가 어폐가 있는데,
(일단 프로세스 0번으로 할당을 해두었으니.. )
이 친구는 프로세스 스케줄링 즉, 컨텍스트 전환과 관련된 프로세스이다.
다음에 어떤 프로세스에게 CPU 점유권을 할당해줄 것인가? 에 대한 작업을 한다.
Swapper 라는 이름으로 부르기도 한다.
init 프로세스는 절대 죽지 않는 모든 프로세스의 엄마같은 프로세스이다.
init프로세스는 시스템 프로세스가 아니고, root권한을 가진 사용자 프로세스로,
시스템이 부팅되는 과정 마지막에 실행되며 UNIX/LINUX 시스템을 띄워주는 역할을 한다.
/sbin/init 프로그램이 실행되어 init 프로세스가 돌아간다.
위에서 엄마같은 프로세스라고 말했는데, 부모 프로세스가 종료되어 고아가된 프로세스들을
init 프로세스가 보듬어 준다. 나중에 포스팅 따로 하여 설명 드림.
이렇게 PID로 각각의 프로세스를 식별하게 되는데,
PID를 반환하는 함수들이 많이 있다. 이걸 또 모르고 가면 섭하지.
getpid (= get pid) : 자신의 pid 반환
getppid (= get parent pid) : 부모 프로세스의 pid 반환
getuid (= get uid) : ruid 반환
geteuid (= get euid) : euid 반환
getgid (= get gid) : rgid 반환
getegid (= get egid) : egid 반환
참고 자료:
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
윈도우 파일시스템 종류 (0) | 2021.04.18 |
---|---|
xinetd 데몬 (0) | 2021.04.18 |
리눅스 파일 시간값 (0) | 2021.04.18 |
하드 링크 / 심볼릭 링크 (0) | 2021.04.18 |
리눅스 프로세스의 파일 공유 (0) | 2021.04.18 |