Researcher to Developer

프로세스 ID - pid, ppid 시스템 콜 및 관련 개념 본문

코딩/Basic

프로세스 ID - pid, ppid 시스템 콜 및 관련 개념

Probe29 2020. 12. 30. 17:18

#Program, Precess, Thread 개념

프로그램

binary, code image, 응용 프로그램, Application 또는 실행 파일을 의미한다.

 

프로세스

실행 중인 프로그램을 의미한다. (메모리 적재 + 프로세스 상태 정보,PCB 포함)

 

스레드

리눅스 프로세스는 기본 스레드를 포함한다.

싱글스레드 프로세스 - 기본 프로세스

멀티스레드 프로세스 - 여러 스레드가 있음

 

 

 

#pid 최대값

각 프로세스는 해당 시점에 유니크한 pid를 가진다.

형태는 숫자이고

pid 최대값은 32768이다.

32768이 최대값인 이유는 부호형(signed) 16비트 정수값을 사용하기 때문인데

2의 15 제곱 승이 32768 이다.

 

다음의 명령어로 32768인 것을 확인할 수 있다.

sudo vi /porc/sys/kernel/pid_max

 

 

 

#리눅스 프로세스 ID 할당 방식

최근 할당된 pid가 200이라면 그 이후에는 201, 202 ... 이런식으로 할당하게 된다.

즉, 1씩 올라가게 되고 32768 이 넘어갈 때 다시 처음으로 돌아와 1 부터 시작하게 된다.

 

 

 

#프로세스 계층(부모,자식 프로세스)

init 프로세스 (=pid 1)는 최초 프로세스이다.

init 프로세스는 부팅 시 운영 체제가 생성한다.

다른 프로세스는 또 다른 프로세스로부터 생성된다.

 

일반적으로 프로세스는 독단적으로 생성되는 것이 아니라 다른 프로세스의 공간을 copy해서

해당 공간에 실행 파일을 덮어씌우는 방식으로 프로세스를 만든다.

자식 프로세스가 여러 개 생길 수 있음

 

 

 

#ppid

ppid 값이 부모 프로세스의 pid를 뜻한다.

 

 

 

#ppid 값 확인하는 방법

ps -ef

-e 시스템 상의 모든 프로세스에 대한 정보를 출력하라.

-f 다음 목록을 출력해라 라는 의미(UID, PID, PPID, CPU%, STIME, TTY, TIME, CMD)'

여러 가지 정보 중에서

root       23297       1  0 Dec23 ?        00:00:11 /usr/lib/accountsservice/accounts-daemo
root       28857       2  0 Dec29 ?        00:00:02 [kworker/0:0-eve]
root       29672       2  0 Dec23 ?        00:00:00 [xfsalloc]
ubuntu   32218 32217  0 06:33 ?        00:00:00 (sd-pam)
ubuntu   32337 32215  0 06:33 ?        00:00:00 sshd: ubuntu@pts/0

왼쪽 숫자가 pid, 오른쪽 숫자가 ppid 이다.

 

ps -ef 입력 후

sudo vi /etc/passwd 를 입력하면 여러 정보가 나오는데

핵심은

사용자 ID를 하나밖에 만들지 않았는데, 컴퓨터 운영체제가 소유자들을 따로 만드는 경우가 있으며,

예를 들어 데몬 프로그램을 처리하기 위해서 별도의 소유자 계정을 만들기 위한 Defalut 과정이 있다는 것

 

여기서 팁으로 

/ubuntu 와 같이 슬래시 / 를 와 디렉토리명을 넣어주면 여러 정보에서

ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash 를 찾을 수 있다.

왼쪽 1000은 UID 사용자 ID를 의미하고

오른쪽 1000은 GID 소유자 그룹 ID를 의미한다.

소유자 그룹을 별도로 만들지 않았기 때문에 UID와 GID가 같은 것이다.

/home/ubuntu 는 사용자에 대한 홈 디렉토리이고

/bin/bash는 사용자가 로그인 할때 어떤 쉘 프로그램을 실행 시킬 것인지에 대한 실행 파일이다.

 

sudo vi /etc/shadow

패스워드를 문자열 형태로 저장한 것을 확인할 수 있다.

패스워드를 지정하지 않았다면 *로 표시된다.

 

 

 

#프로세스와 소유자(owner)관리

리눅스 내부에서는 프로세스를 관리할 때 프로세스의 소유자(사용자)와 그룹을 UID/GID (정수)로 관리한다.

사용자에 보여줄 때에만 UID와 사용자이름 매핑 정보를 기반으로 사용자 이름으로 제공한다.

 

파일은 inode 값으로 관리

프로세스는 pid 값으로 관리

inode, pid는 숫자(=정수)

컴퓨터는 숫자로 언어를 인식하기 때문에 숫자(=정수)로 문자를 매핑하는 것이다.

 


 

#프로세스 관리 관련 시스템 콜

* 우분투 리눅스에 gcc 설치가 필요하다. (+vi 에디터/한글 설정)

 

su do apt-get install gcc                    #gcc 설치 명령어
gcc --version                                   #설치된 gcc 버전 확인
gcc -o test.c test (=gcc test.c -o test)    #실행 파일 컴파일 여기서 test를 pidinfo2로 바꿈

 

 

 

#getpid()와 getppid()

getpid 현재 프로세스의 pid를 알아내는 시스템콜

getppid 현재 부모 프로세스의 ppid를 알아내는 시스템콜

 

함수는 다음과 같다.

#include <sys/types.h>
#include <unistd.h>
pid_t getpid (void);
pid_t getppid (void);

 

 

실습을 하기에 앞서 

vi pidinfo2.c 입력 후 

insert 를 누르고 다음의 코드를 작성해준다.

 

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main ()
{
           printf ("pid=%d\n", getpid());
           printf ("ppid=%d\m", getppid()));             # \는 슬래시의 반대방향으로 생긴 놈
           return 0;
}

코드를 작성한 다음

insert 를 누르고 

esc 를 누른 다음

:wq로 저장해준다.

 

gcc pidinfo2.c -o pidinfo2 를 입력해주면서 실행 하려는 파일을 컴파일 하게 된다.

 

ls -al 를 입력하면 초록색으로 pidinfo2 파일이 생성된 것을 확인 할 수 있고

gcc 로 컴파일을 하면 Default로 실행 권한이 들어가 있는 것을 확인 할 수 있다.

 

그 다음 ./pidinfo 를 입력하면

 

pid=513

ppid=32338 

 

과 같은 정보를 확인 할 수 있다.

* 커널에 시스템 콜을 통해서 pid를 물어보았고 사용자 영역으로 받아와서 화면에 출력하게 된 것

 

 

 

 

 

 

ㅁㄴㅇ