1. [Unix/Linux] init 프로세스
ㅇ UNIX가 처음 시동될 때,
- 일련의 부팅 과정이 끝나고,
- 커널이 메모리에 로드되고, 제어권이 커널에 주어지고,
- 이후 커널이 여러 제반환경을 구축한 후에는,
- 오직 한 개의 프로세스 만이 있게 되는데, 이것을 init 라고 함
2. [Unix/Linux] init 프로세스의 특징
ㅇ init 프로그램 화일의 위치 : /sbin/init
ㅇ 커널이 시동된 후에, init의 모든 동작은,
- 대개 시스템 의존적인 초기화 화일들을 읽고 (/etc/rc*),
- 원하는 상태(다중 사용자 모드 등)로 시스템을 가져감
. 텍스트 콘솔과 그래픽 창을 시작하는 프로세스도 포함됨
- 이러한 동작들은, /etc/inittab 화일에 명시된 대로 실행됨
ㅇ 모든 프로세스의 부모 프로세스 임
- init는, 커널에 의해 직접 실행되는 프로세스이며, 모든 프로세스는 init로부터 출발함
- 즉, init는, 모든 프로세스의 부모 프로세스이고, 동시에 사용자 로그인 쉘의 부모 프로세스
3. [Unix/Linux] PID (Process IDentifier)
ㅇ init의 프로세스 식별자 즉, PID(Process IDentifier)는 1 임
ㅇ 한편, PID는 init가 1 인 것을 제외하고,
- 나머지 프로세스는, 2 부터 32768 사이의 양의 정수 값 임
4. [Unix/Linux] 프로세스 제어용 시스템 호출 : exec, fork
ㅇ 부팅 과정이 끝난 후 존재하는 단 한개의 init 프로세스는,
- 이로부터 fork 및 exec라는 시스템 호출을 통해,
- 결국, 수많은 프로세스들이 수행되게 됨
ㅇ fork : (프로세스 생성 실행, 프로세스 복제)
- 새로운 자식 프로세스를 `생성`할 때 사용하는 시스템 호출
. 현재 프로세스(부모 프로세스)의 사본(자식 프로세스)을 생성하고,
.. 자식 프로세스는 새로운 PID 부여 받음
. 그후 부모 및 자식 프로세스 모두에서, 현재 프로그램 카운터가,
fork() 문 바로 다음의 코드들을 실행하도록 가리키게 됨
* 자식 프로세스 생성 (복제) 이유 : 멀티태스킹 동작을 하기 위함
* 복제되는 정적인 정보들 : 힙 메모리, 정적 메모리, IPC 자원, 열린 파일, 시그널 마스크 등
ㅇ exec : (프로세스 대체 실행)
- 프로세스 내에서 새로운 프로그램을 실행시킴
- 즉, 현재의 프로세스를 새로운 프로그램으로 `대체`시켜 수행시키는 시스템 호출
. (대체되는 것들 : 코드,데이터,힙,스택 등)
. 현재 프로그램 카운터가, 새 프로그램의 main()부터 실행이 시작되도록 가리킴
. 호출 이후에도 PID 값이 변하지 않음
ㅇ clone : (스레드 생성)
- 자식 프로세스를 생성하나, 부모 프로세스와 모든 자원을 공유함
- 별도의 PID를 갖음 (ps 로 조회 시, 각각 조회됨)
- 호출된 프로세스의 종료는, 부모 프로세스에 영향을 주지 않음
- clone이 호출될 때, 부모 자식 태스크 간 자료구조를 얼마나 공유할지를 결정하는
플래그 집합이 전달됨