프로세스
프로세스의 메모리 영역은 User 영역과 Kernel 영역으로 나뉜다. 프로세스가 생성되면 커널 운영체제
은 프로세스 별로 관리정보를 담고 있는 프로세스 제어 블록(PCB, Process Control Block)을 생성한다.
프로세스 제어 블록 PCB
- Process number : 프로세스 식별(PID), 부모 프로세스 식별(PPID)
- Program counter(PC) : Context Switching 발생 시 다음에 실행할 명령어의 위치값 저장
- register 저장 영역 : Context Switching 발생 시 현재 프로세스의 실행 상태 정보(레지스터 정보) 저장
- Process state : 프로세스의 현재 상태 정보(Ready, Running, Blocked 등) 저장
- Memeory limits : 프로세스가 사용하는 메모리(Segment or Page 테이블) 정보
✅ 문맥교환 Context Switching
CPU에서 실행 중인 프로세스가 새로운 프로세스로 교환될 때 현재 실행 중인 프로세스의 상태정보를 저장하고 새로운 프로세스의 상태 정보를 복원하는 과정
✅ 레지스터 Register
CPU 내부에 있는 고속의 소용량 임시 기억장치로, CPU 명령 처리에 필요한 명령어, 데이터, 연산결과 등을 임시로 저장하기 위해 사용
프로세스가 생성되면 프로세스별로 오픈한 파일을 관리하기 위한 FDT(File Descriptor Table) 가 생성된다. 기본적으로 3개의 파일 표준입력 STDIN
, 표준출력 STDOUT
, 표준에러 STDERR
이 자동으로 오픈된다. 프로세스 내에서 오픈한 각각의 파일을 식별하기 위한 양의 정수값을 FD(File Descriptor) 라고 한다.
커널이 시스템 내 여러 프로세스에 의해 오픈된 파일들을 관리하기 위한 자료구조가 System open-file table이다.
- open_mode : 파일 읽기/쓰기 모드
- offset : 파일 I/O를 수행하기 위한 현재 위치값
- reference_count : 해당 파일의 참조 개수를 의미. 파일 복제가 발생하면 하나 증가
Active vnode table은 해당 파일의 inode 정보를 가지고 있는 일종의 캐시 역할을 한다. 즉, 다양한 파일시스템의 inode 정보를 관리하기 위한 중계자 역할을 한다.
프로세스 상태 전이도 (Process State Transition)
- 생성
New
Create
: 프로세스가 생성되어 메모리를 할당받고 PCB가 생성된 상태 - 준비
Ready
: 프로세스가 필요한 자원을 모두 할당받은 상태에서 CPU를 할당받기 위해 대기하는 상태 - 실행
Running
: CPU를 할당받아 실행되고 있는 상태 - 대기
Wait
: 실행 중 대기가 필요한 입출력 작업이나 자원을 요청할 경우 CPU 자원을 반납하고 대기하는 상태 - 종료
Terminated
Exit
: 프로세스 실행이 완료되어 할당된 자원을 커널에 모두 반납한 상태 - Dispatch : Ready ➜ Running
- Timer runout(할당 시간초과) : Running ➜ Ready
- Wake up: Wait ➜ Ready
프로세스 기본 조건
① 모든 프로세스는 부모 프로세스를 가진다.
시스템 부팅을 담당하는 boot 프로세스(0번 프로세스)를 제외한 모든 프로세스는 부모 프로세스를 가진다. 자식 프로세스가 살아있는 상태에서 부모 프로세스가 종료하기 되면 자식 프로세스는 고아 프로세스가 되며, 이 경우 대리모 프로세스(init 프로세스)가 부모 역할을 한다.
init 프로세스 (PID: 1)
- 시스템 run-level 에 따른 시스템 초기화
- 대리모 프로세스 : 부모가 먼저 종료되어 생긴 고아 프로세스의 부모 프로세스가 된다.
PID가 28991인 부모 프로세스가 있을 때, kill -9 28991
or kill -KILL 28991
명령을 통해 부모 프로세스 강제 종료 시 자식 프로세스의 PPID 는 28991에서 1로 변경된다.
SIGKILL(9) : 시그널 강제 종료
kill -9 [pid] or kill -KILL [pid]
② 프로세스 종료 시, 자신의 종료 상태정보(PID, Exit Code, CPU 사용시간 등)를 부모 프로세스에 반환해야 정상적으로 소멸할 수 있다.
프로세스가 수행을 종료했지만, 커널 오류 또는 부모 프로세스가 종료한 자식 프로세스에 대한 처리 오류로 인해 소멸하지 않고 남아있는 상태를 좀비 프로세스라고 한다.
커널 관점에서 프로세스는 무한히 생성할 수 없는 제한된 자원으로 좀비 프로세스가 과도하게 많아지면 시스템 가용성에 문제가 발생한다.
ps -l
명령을 통해 프로세스의 상태 정보 필드를 알 수 있다. 좀비 프로세스는 Z 로 설정되고 명령어 이름 필드(CM)에 <defunct>
표시가 추가된다.
S 필드는 프로세스의 현재 상태 정보를 나타낸다
Z
: 좀비상태R
: CPU를 점유하기 위해 대기중인 상태(Ready)이거나 실행 중인 상태(Running)S
: 인터럽트 가능한 Sleep 상태
🧟♀️ 좀비 프로세스 제거
좀비 프로세스의 부모 프로세스를 종료시키거나 시스템을 재기동하여 커널 정보를 초기화한다.
ps -ef | grep defunct
명령을 통해 좀비프로세스의 부모 프로세스(PPID) 검색kill -9 ppid
명령을 통해 부모 프로세스 강제 종료하여 대리모 프로세스인 init process에 의해 좀비 프로세스 소멸
💡 총 정리
UNIX/LINUX 시스템의 모든 프로세스는 작업을 종료하면 커널을 통해 종료 사실을 부모 프로세스에 알린다. 이때 부모 프로세스가 자식 프로세스의 종료 사실을 확인해주어야 해당 프로세스가 정상적으로 소멸할 수 있다. 따라서 모든 프로세스는 종료 후 일시적으로 좀비 상태를 거친 후 소멸한다. 하지만 지속해서 좀비 상태가 나타난다면 대부분 부모 프로세스가 적절한 시그널 처리를 해주지 않았거나 커널 오류에 의한 비정상적인 상태일 확률이 높다.
좀비 프로세스는 kill 시그널을 통해 소멸하지 않는다. 따라서 부모 프로세스를 강제로 종료시키거나 시스템 재기동을 통해 커널 정보를 초기화하는 방법으로 제거할 수 있다.
시스템 런 레벨 Run-Level
시스템에서 런 레벨(Run level)이란 시스템 운영 수준을 말하는 것으로 여러 수준으로 구분한다. 관리자가 필요에 의해 런 레벨을 변경하여 네트워크를 사용하지 못하게 하거나 일반 사용자의 접근을 차단하고 관리자만 접근하도록 할 수 있다.
Run Level | 시스템 운영 수준 | |
3 | Full multiuser mode (CLI 환경) | 네트워크를 지원하는 다중 사용자 모드 |
5 | X11 (GUI 환경) | X-Window을 사용하는 다중 사용자모드 |
- init 프로세스는 /etc/inittab 파일에 정의된 런 레벨에 따라 해당 Run Level 디렉터리에 있는 스크립트를 실행하여 초기 환경 구성
runlevel
who -r
: 현재 시스템의 Run Level 확인 명령어
시스템 종료
shutdown
: 시스템 종료 명령어
'InfoSec > 정보보안기사' 카테고리의 다른 글
[Linux] 사용자 및 그룹 관리 (0) | 2024.04.17 |
---|---|
[Linux] 프로세스 관련 식별자 (0) | 2024.04.16 |
[Linux] 파일 검색 find (0) | 2024.03.28 |
[Linux] 파일과 접근 권한 관리 (0) | 2024.03.20 |
[Linux] 파일 시스템 File System 과 링크 (hard link & symbolic link) (0) | 2024.03.14 |