본문 바로가기

프로그래밍/ 리눅스

프로세스

프로세스란

실행중인 프로그램이다.

 

프로그램이란

실행시에 프로세스를 어떻게 만들지에 대한 정보를 담고 있는 파일이다.

 

커널 관점에서 보면 프로세스는 프로그램 코드와 해당 코드가 사용하는 변수를 담고 있는 사용자 공간 메모리와, 프로세스 상태에 대한 정보를 관리하는 각종 커널 데이터 구조로 이뤄진다.

 

프로세스 ID와 부모 프로세스 ID

각 프로세스는 고유 ID가 있다. ID는 양의 정수이다.

#include "unistd.h"
pid_t getpid(void); // 호출하는 프로세스의 프로세스 ID를 리턴한다.

 

프로세스 ID는 32,767로 제한되며 다음 가용 ID로 순차증가 한다. MAX값이 되면 ID CNT를 300으로 리셋하여 작은 정수부터 재할당한다.

(64비트 플랫폼에서는 2의22승(대략 4백만)까지 조정 할 수 있다. /proc/sys/kernel/pid_max 에 설정)

 

각 프로세스에는 부모가 있으며 getppid() 로 부모의 id를 알아 낼 수 있다.

이런식으로 계속 따라가다 보면 모든 프로세스의 조상인 프로세스1인 init가 나온다. pstree(1) 명령으로 볼수있다.

 

부모 프로세스가 종료되면 init 프로세스로 편입되어 자식에서 getppid를 호출하면 1을 리턴한다.

 

프로세스 메모리 레이아웃

각 프로세스에 할당된 메모리는 여러 세그먼트로 나뉜다.

text segment - 프로세스가 실행하는 기계어 명령을 담고 있다.

initialized data segment - global 변수와 static 변수를 담는다.

uninitialized data segment - 명시적으로 초기화되지 않은 전역 변수, 정적 변수를 담고 있다.

stack - 스택프레임에는 함수의 지역변수, 인자, 리턴값이 저장 된다.

heap - 동적 메모리 할당, 힙의 꼭대기를 program break 라고 한다.

 

 

 

 

 

'프로그래밍 > 리눅스' 카테고리의 다른 글

I/O - select  (0) 2013.03.24
I/O 모델 종류..  (0) 2013.03.24
파일디스크립터..  (0) 2013.03.24
소켓 : 유닉스 도메인  (0) 2013.03.20
리눅스 API의 모든것  (0) 2013.03.20