본문 바로가기
카테고리 없음

[System Programming] 6장 프로세스 식별과 시간 측정

by winter_sunshine 2023. 10. 30.
  • 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 검색하기

PID, PPID 검색: getpid(), getppid()

 

PPID(bash): 2342
PID(bash): 2342

<예제 6-2 관전 Point>

  • ★ 사용자가 쉘에서 실행하는 모든 프로세스는 'bash(bourne-again-shell)' 밑에서 실행됨. ★
    • 즉, 쉘에서 실행하는 모든 프로세스(명령어 포함)의 부모 프로세스가 "bash"라는 것을 의미
      • 쉘(shell): 커널과 사용자간의 다리역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 수행
        • 쉽게 말해, 윈도우의 cmd처럼 우분투 리눅스에서 명령어를 입력하는 환경을 의미
          ex) ~$ 
      • bash(bourne-again-shell) : 리눅스 표준 쉘우분투 리눅스 환경에서 기본 쉘이 "bash"임.

 

3.  PGID 검색 : getpgrp(2), getpgid(2)

PGID 검색: getpgrp(), getpgid()

  • getpgrp()  함수의 특징
    • 이 함수를 호출하는 프로세스가 속한 그룹의 PGID를 리턴
      • PGID: Process Group ID
    • 단순히 현재 프로세스의 PGID를 반환하므로, 인자가 필요없음
  • getpgid()  함수의 특징
    • pid 인자로 지정한 프로세스가 속한 그룹의 PGID를 리턴
    • 만일 인자가 0이면 getpgid() 함수를 호출한 프로세스의 PID를 리턴
      • =>  즉, 인자가 0이면 getpgrp()랑 같음

 

◼  [예제 6-3]   getpgrp(), getpgid() 함수로 PGID 검색하기

PGID 검색: getpgrp(), getpgid()
실행 결과: 모두 같음

 

<예제 6-3 관전 Point>

  • PID와 PGID가 같음을 알 수 있음
    • 이는 현재 프로세스가 단독 프로세스여서 프로세스 그룹에 홀로 속해 있기 때문
  • getpgid(0)와  getpgrp()결과가 같음을 알 수 있음

 

 

4.  PGID 변경 :   setpgid(2)

  • setpgid()  함수의 특징
    • pid가 가리키는 프로세스의 PGIDpgid로 지정한 값으로 지정
    • 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 검색하기

세션 ID 검색:  getsid()
실행 결과
bash의 PID = 현재 프로세스의 세션 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() 함수실행 시간 측정하기

실행 시간 측정:  times()
실행 결과