Linux Process

mohadang·2023년 3월 11일
0

Linux System Programming

목록 보기
6/9
post-thumbnail

Process ID(PID)

프로세스에 부여된 식별 번호

Parent process(부모 프로세스)

자신을 생성한 프로세스. 모든 프로세스는 부모 프로세스가 있음. 단 kernel은 최상위 process로서 부모 프로세스가 없음
Parent Process ID(PPID)
Linux 시스템에서는 명령어를 실행 할때마다 프로세스 실행 되며 이런 패턴은 Linux 시스템에서 흔하다.
그래서 Linux 시스템에서 부모 프로세스와 자식 프로세스간의 관계는 중요하다.

Process group

관련된 process들을 묶은 것. 하나의 job 수행을 목적으로 하는 process들이다.
ex) Shell scrip 내부의 명령어들
ex) 부모와 자식 프로세스등

Process group에 전달 된 signal은 그룹 내 모든 프로세스에게 전달 된다.

  • 프로세스 그룹으로 묶으면 동시에 여러 프로세스를 제어할 수 있다
    • ex) 여러 프로세스로 병렬 처리 할 경우
  • Job 단위 프로세스 제어를 위해 활용된다

Process group leader

process group에 속한 process 중 하나

Process Group ID(PGID)

PGID : process group에 부여 된 고유 번호. group leader의 PID이다.

부모 프로세스와 자식 프로세스는 하나의 그룹이다.

어떤 프로세스가 자식 프로세스를 생성하면 부모 프로세스는 프로세스 그룹의 리더이고 자식 프로세스는 프로세스 그룹에 포함된다.

Ex)
터미널에서 다음 스크립트(test.sh)를 작성하고 실행

다른 터미널로 접속하여 Process ID들 확인

  • $ ps j -e

스크립트를 실행한 bash는 부모 프로세스가 됨가 동시에 본인 PID와 같은 467 프로세스 그룹의 리더가 된다.
그리고 스크립트에서 실행중인 ping 명령어는 PGID 467의 멤버로 된다.

Kill Process Group Leader

PID와 PGID를 사용하여 종료하는 방식은 다르다. 만약 프로세스 그룹 리더를 종료하고 싶다면
$ kill -9 -groupID 방식을 사용해야 한다.

PID 467 종료

  • $ kill -9 467

PGID 467 종료

  • $ kill -9 -467

setpgid

int setpgid(pid_t pid, pid_t pgid);

프로세스 그룹 변경하기. pid proceess를 pgid 그룹으로 옴긴다
그룹 이동은 setssion 내 group 사이 만 가능

기본값은 0으로 사용 가능
pid = 0으로 주는 경우 -> current process를 의미
pgid = 0으로 주는 경우 -> pgid를 pid로 설정(현재 프로세스를 그룹 리더로 설정)

Session

사용자가 로그인해 작업하고 있는 터미널 단위로 프로세스 그룹을 묶은 것
관련된 process group을 묶은 것이다.

세션 리더는 여러개의 그룹 리더 프로세스중 하나이다.
세션 리더 ID는 여러 PGID중 하나이다.

사용자가 로그인 하면 새로운 session이 생성된다.
process group과 interrupt unit(keyboard, keyboard)을 연결하는 방법이다.

foreground process group, backgound process group

session은 하나의 foreground process group가 0개 이상의 background process group을 가진다.
foreground process group이 최소 하나인 이유는 명령을 입력 받는 shell 때문이다.

foreground process group : 사용자의 입력을 받는 process group. Terminal을 통해 전달 되는 signal을 전달 받음(Ctrl + c / z)
background process group : foreground process group 이외의 process group. output은 terminal에 출력됨

session leader

세션에도 리더가 있다. session id는 session leader의 pid이다.
일반적으로 세션 리더는 login shell process이다.

667 ID는 PGID(그룹 리더)이면서 SID(세션 리더)이다.

session id 설정

#include <unistd.h>
pid_t setsid(void);

새로운 session 생성한다. setsid를 호출한 process가 현재 session의 리더가 아니면, 새로운 session을 생성하고 생성된 session의 리더가 된다
생성된 session은 controlling terminal을 갖지 않는다

Running time of a process

Process running time = system running time + user running time

system running time

kernel code를 수행한 시간(system call에 소요된 시간)

user running time

사용자 모드에서 수행한 시간(사용자 작성 코드를 실행하는데 걸린 시간

실행시간 측정 및 사용 시간에 따른 요금 부과 등에 활용 가능

Running time 가져오기

#include <sys/times.h>
clock_t timess(struct tms* buf);
  • 프로세스의 자식 프로세스 시간들도 확인 가능

return 값은 특정 시점(ex: 부팅 이후)부터 경과한 시간. Clock tick 단위(software clock)이다.
두 시점의 return 값의 차를 이요해 수행 시간 측정 가능

Ex
Real time : 5.5초에서 5초는 sleep(5)로 인하여 CPU 유휴 시간이다. 0.5초만이 Running time이다.
User time : Running time 0.5중 0.3은 User Time
System time : Running time 0.5중 0.2는 System time

환경 변수

Process 실행환경(shell)에 정의되어 있는 변수.

  • Login name, Login shell, pathname등

환경변수 명은 관례적으로 대문자 사용.

환경변수 목록 확인 : env
환경 변수 선언 : export 환경변수명=값

로그인 시, 자동으로 환경변수 설정하기

  • Home directory의 .bashrc 파일 마지막에 "export 환경변수명=값" 추가

환경 변수 추가

#include <stdlib.h>
int putenv(char* string);
int setenv(const char* name, const char* value, int overwrite);

Process에 의해 추가된 환경 변수는 자신과 자식 프로세스에서만 유효하다.
Parent process(=shell)에서는 유효하지 않음

profile
mohadang

0개의 댓글