(1) 프로세스 개요
1) 개요

1. 프로세스 제어 블록(PCB Pocess Control Block)
프로세스가 생성되면 커널은 프로세스 별로 관리 정보를 담고 있는 PCB를 생성함
- 프로세스 번호(Process Number)
- 프로세스 식별 ID(PID), 부모 프로세스 식별 ID(PPID) 등
- 프로그램 카운터(Process Counter)
- 문맥교환 발생 시 다음에 실행할 명령어의 위치 값 저장
- 레지스터 저장 영역(Register Save Area)
- 문맥교환 발생 시 현재 프로세스의 실행 상태 정보(레지스터 정보) 저장
- 프로세스 상태(Process State)
- 프로세스의 현재 상태(Ready, Running, Blocked 등) 저장
- 메모리 정보(Memory Limits)
- 프로세스가 사용하는 메모리 정보(Segment 또는 Page 테이블 정보)
- 문맥교환(Context Switching)
: CPU에서 실행 중인 프로세스가 새로운 프로세스로 교환될 때 현재 실행 중인 프로세스의 상태 정보를 저장하고 새로운 프로세스의 상태 정보를 복원하는 과정
- 레지스터(Register)
: CPU내부에 있는 고속의 소용량 임시기억 장치
2. 파일 디스크립터 테이블(FDT File Descript Table)
프로세스 내에서 오픈한 각각의 파일을 식별하기 위한 양의 정수값
💡 프로세스가 생성되면 프로세스별로 오픈한 파일을 관리하기 위한 FDT가 생성됨
: 기본적으로 3개의 파일이 자동으로 오픈됨
- STDIN (표준입력) : 키보드 등의 입력장치
- STDOUT (표준출력) : 모니터 등의 출력 장치
- STDERR (표준에러) : 오류 발생 시 출력
3. System open-file Table
커널이 시스템 내에서 여러 프로세스에 의해 오픈된 파일들을 관리하기 위한 자료구조
- open_mode : 파일의 읽기/쓰기 모드
- offset : 파일 I/O를 수행하기 위한 현재 위치값(Position)
- reference_count : 해당 파일의 참조 개수(파일복제 시 증가)
4. Active vnode Table
해당 파일의 inode 정보를 가지고 있는 일종의 캐시역할
즉, 다양한 파일시스템의 inode 정보를 관리하기 위한 중계자 역할
2) 프로세스 기본 조건
- 테스트 코드

1. 프로세스 테스트 코드(C 프로그램 : process.c)
-
fork() 함수는 자식 프로세스를 생성하는 시스템 함수
→ 반환값을 통해 부모 프로세스의 수행 코드와 자식 프로세스의 수행 코드를 식별
-
PID와 PPID를 각각 출력하고 1,000초 동안 대기함
2. 모든 프로세스는 부모프로세스를 가짐
-
boot 프로세스(0번 프로세스) 를 제외한 모든 프로세스는 부모프로세스를 가짐
-
자식 프로세스가 살아있는 상태에서 부모 프로세스가 종료하게 되면 자식은 고아 프로세스가 되고 PID=1인 init 프로세스가 부모역할을 대신함
-
프로세스 종료 시에는 자신의 ‘종료 상태정보’를 부모에게 반환해야 정상적으로 소멸함
- 종료상태 정보
자신의 PID, Exit Code(종료시 반환하는 값), CPU 사용시간 등
3. 좀비 프로세스
커널 오류 또는 부모프로세스가 종료된 자식프로세스에 대한 처리 오류 등으로 소멸하지 않고 남아있는 상태

- 커널의 관점에서 프로세스는 무한히 생성할 수 있는 자원으로 좀비 프로세스가 과도하게 많아지면 시스템의 가용성에 문제 발생할 수 있음
- 좀비 프로세스 제거 방법
: 부모 프로세스를 종료 시키거나 시스템 재기동으로 커널 정보 초기화
- kill 시그널 사용 불가능
: 좀비 프로세스는 kill 시그널을 통해서도 소멸하지 않음
💡 모든 프로세스는 종료후 일시적으로 좀비 상태를 거친 후 소멸함
- 지속해서 좀비 상태가 나타난다면 부모 프로세스의 오류 또는 커널 오류에 의한 비정상적인 상태일 확률이 높음
3) 프로그램 실행 과정

1. 프로세스와 프로세스 그룹 동시 생성
- 프로세스 그룹
- 커널이 터미널 제어권을 관리하기 위한 목적으로 사용하는 프로세스들의 집합
- 쉘에서 실행된 프로세스와 그 자식 프로세스들이 하나의 프로세스 그룹
2. 포그라운드(Foreground)와 백그라운드(Background)
터미널과 연결되어 세션이 생성되면, 해당 세션 내에서는 하나의 포그라운드 프로세스 그룹과 하나 이상의 백그라운드 프로세스 그룹이 생성됨
- Foreground Mode
- Background Mode
3. 프로세스 관련 식별자
- Process ID
- 커널 내에서 프로세스를 식별하기 위한 고유한 ID
- Parent Process ID
- Process Group ID
- 프로세스 그룹을 식별하기 위한 ID
- 리더 프로세스(쉘로 부터 실행 된 프로세스)의 ID가 PGID로 결정됨
- Session ID
- 세션을 식별하기 위한 ID
- 터미널과 논리적인 연결상태를 세션이라 함
- 세션 내에는 다수의 프로세스 그룹과 프로세스 그룹에 속하는 프로세스들이 존재
- 해당 세션의 리더 프로세스의 PID가 SID로 결정됨(일반적으로 로그인 쉘)
(2) 프로세스 정보 확인
1) Process Status : ps
프로세스 정보를 확인할 때 사용하는 명령어

2) 필드 설명
💡 ps -ef 필드 설명

- UID필드 = UserID, 프로세스의 EUID(Effective User ID)
- PID필드 = Process ID
- PPID필드 = Parent Process ID
- STIME필드 = Start TIME, 프로세스가 시작된 시간
- TTY필드 = 프로세스와 연결된 터미널 타입( ? 는 제어터미널에 연결되지 않음을 의미)
- TIME필드 = CPU 사용 시간
- CMD 필드= 명령어 이
💡 ps -el 필드 설명

- S 필드
- Z = 좀비
- R = CPU를 점유하기 위해 대기중 또는 실행중
- S = 인터럽트 가능한 sleep 상태
- D= 인터럽트 불가능한 sleep 상태(일반적으로 IO 대기중 상태)
- T = 정지된 상태
- PRI 필드 = 프로세스의 우선순위
- SZ 필드 = 프로세스가 차지하는 메모리 크기
- WCHAN 필드 = sleep 상태의 프로세스가 기다리는 커널
- CMD 필드 = 명령어 이름
(3) 프로세스 간 통신(시그널)
1) 개요
시그널
시그널은 유닉스/리눅스 시스템에서 지원하는 프로세스간 통신 기법(IPC)중 하나
Inter-Process Communication[IPC]
커널 또는 프로세스가 다른 프로세스에 약속된 신호를 전달하여 통신하는 목적으로 사용
- 발생하는 경우
: 에러 상황, 외부 상황, 이벤트 발생, 인위적 발생 등…


💡 리눅스 기준 시스템에서 지원하는 주요 시그널