- PID는 0번부터 시작
- 0번 프로세스:
- 스케줄러
- 프로세스에 CPU 시간을 할당하는 역할 수행, 커널의 일부분이므로 별도의 실행 파일은 없음
- 1번 프로세스:
- init 프로세스
- 프로세스가 새로 생성될 때마다 기존 PID와 중복되지 않은 번호를 할당
- 현재 프로세스의 PID를 검색하려면 getpid() 함수를 사용
1. PID 검색 : getpid(2)
- getpid() 함수의 특징
- 이 함수를 호출한 프로세스의 PID를 리턴
2. PPID 검색 : getppid(2)
- 0번 프로세스를 제외한 모든 프로세스에는 자신을 생성한 "부모 프로세스" 가 존재
- PPID : 부모 프로세스의 PID
- 부모 프로세스의 PID를 검색하려면 getppid() 함수를 사용
◼ [예제 6-2] getpid(), getppid() 함수로 PID와 PPID 검색하기
<예제 6-2 관전 Point>
- ★ 사용자가 쉘에서 실행하는 모든 프로세스는 'bash(bourne-again-shell)' 밑에서 실행됨. ★
- 즉, 쉘에서 실행하는 모든 프로세스(명령어 포함)의 부모 프로세스가 "bash"라는 것을 의미
- 쉘(shell): 커널과 사용자간의 다리역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 수행
- 쉽게 말해, 윈도우의 cmd처럼 우분투 리눅스에서 명령어를 입력하는 환경을 의미
ex) ~$
- 쉽게 말해, 윈도우의 cmd처럼 우분투 리눅스에서 명령어를 입력하는 환경을 의미
- bash(bourne-again-shell) : 리눅스 표준 쉘, 우분투 리눅스 환경에서 기본 쉘이 "bash"임.
- 쉘(shell): 커널과 사용자간의 다리역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 수행
- 즉, 쉘에서 실행하는 모든 프로세스(명령어 포함)의 부모 프로세스가 "bash"라는 것을 의미
3. PGID 검색 : getpgrp(2), getpgid(2)
- getpgrp() 함수의 특징
- 이 함수를 호출하는 프로세스가 속한 그룹의 PGID를 리턴
- PGID: Process Group ID
- 단순히 현재 프로세스의 PGID를 반환하므로, 인자가 필요없음
- 이 함수를 호출하는 프로세스가 속한 그룹의 PGID를 리턴
- getpgid() 함수의 특징
- pid 인자로 지정한 프로세스가 속한 그룹의 PGID를 리턴
- 만일 인자가 0이면 getpgid() 함수를 호출한 프로세스의 PID를 리턴
- => 즉, 인자가 0이면 getpgrp()랑 같음
◼ [예제 6-3] getpgrp(), getpgid() 함수로 PGID 검색하기
<예제 6-3 관전 Point>
- PID와 PGID가 같음을 알 수 있음
- 이는 현재 프로세스가 단독 프로세스여서 프로세스 그룹에 홀로 속해 있기 때문
- getpgid(0)와 getpgrp()가 결과가 같음을 알 수 있음
4. PGID 변경 : setpgid(2)
- setpgid() 함수의 특징
- pid가 가리키는 프로세스의 PGID를 pgid로 지정한 값으로 지정
- pid와 pgid가 같다면 pid에 해당하는 프로세스가 그룹 리더가 됨
- 만일 pid가 0이면 이 함수를 호출하는 현재 프로세스의 PID를 사용
- pgid가 0이면 pid로 지정한 프로세스가 PGID
5. 세션
- 세션의 정보
- POSIX 표준에서 제안한 개념으로 사용자가 로그인해 작업하고 있는 터미널 단위로 프로세스 그룹을 묶은 것
- 프로세스 그룹이 관련 있는 프로세스를 그룹으로 묶은 개념이라면
- 세션은 관련 있는 프로세스 그룹을 모은 개념
6. 세션 검색 : getsid(2)
- getsid() 함수의 특징
- pid로 지정한 프로세스가 속한 세션의 ID를 리턴
- 만일 pid가 0이면 현재 프로세스의 세션 ID를 리턴
◼ [예제 6-4] getsid() 함수로 세션 ID 검색하기
<예제 6-4 관전 Point>
- PID와 PGID가 같음을 알 수 있음 ( getpid() == getpgrp() )
- 세션 ID는 "bash"의 PID로 이 세션의 리더가 "bash"임을 알 수 있음
7. 세션 생성 : setsid(2)
- setsid() 함수의 특징
- setsid() 함수를 사용하면 새로운 세션을 만들 수 있음
- setsid() 함수를 호출하는 프로세스가 프로세스 그룹 리더가 아니면 새로운 세션을 만들어 세션 리더가 됨
- 새로운 세션에서 프로세스 그룹 리더가 됨
- setsid() 함수를 호출한 프로세스가 새로운 세션과 프로세스 그룹의 유일한 프로세스가 됨
- 호출에 성공하면 새로운 세션 ID를 리턴하고 오류가 발생하면 –1 을 리턴
[프로세스 실행 시간 측정의 의의 & 방법]
- 시간 정보를 이용해 프로세스 실행 시간을 측정할 수 있으며, 이것은 시스템 사용 요금을 결정하는 데 활용할 수 있음
- 프로그램에서 많은 시간을 소비하는 부분을 찾아 개선하는 데도 활용할 수 있음
- 프로세스 실행 시간은 times() 함수를 사용해 측정할 수 있음
- 프로세스 실행 시간은 커널 모드에 서 실행한 시간과 사용자 모드에서 실행한 시간을 합해 구할 수 있음
- times() 함수는 커널 모드에 서 실행한 시간과 사용자 모드에서 실행한 시간을 구분해서 알려줌
[프로세스 실행 시간의 구성]
- 시스템 실행 시간:
- 프로세스에서 커널의 코드를 수행한 시간
- 시스템 호출로 소비한 시간을 의미
- 사용자 실행 시간:
- 사용자 모드에서 프로세스를 실행한 시간
- 프로그램 내부의 함수나 반복문처럼 사용자가 작성한 코드를 실행하는 데 걸린 시간
※ 프로세스 실행 시간 = 시스템 실행 시간 + 사용자 실행 시간
8. 실행 시간 측정: times(2)
- times() 함수의 특징
- 프로세스 실행 시간을 인자로 지정한 tms 구조체에 저장
- times() 함수가 알려주는 시간 단위는 시계의 클록 틱
- times() 함수는 임의의 시점으로부터 경과된 클록 틱 수를 리턴하고 오류가 발생하면 –1을 리턴
◼ [예제 6-5] times() 함수로 실행 시간 측정하기