본문 바로가기

정보보안/시스템 보안

[UNIX/Linux 기본학습] 프로세스 응용

프로세스란?
= 실행중인 프로그램

 

프로세스 생성 시, 발생하는 일
① 프로세스 생성 = 메모리 할당
- 프로세스가 생성(실행)되면 커널은 프로세스가 물리적 메모리에 접근 가능하도록 메모리를 할당한다.
② 커널(운영체제)은 프로세스별로 관리정보를 담고 있는 '프로세스 제어블록(PCB:Process Control Block)'을 생성한다.
- PCB의 주요 정보
프로세스 번호
(Process number)
프로세스 식별 ID(PID)
부모 프로세스 식별 ID(PPID)
프로그램 카운터(PC)
(Program Counter)
문맥교환 발생 시 다음에 실행할 명령어의 위치값 저장
레지스터 저장 영역
(Register save area)
문맥교환 발생 시 현재 프로세스의 실행상태정보(레지스터 정보) 저장
프로세스의 상태
(Process State)
프로세스의 현재 상태 정보 저장
- Ready : CPU 할당 대기
- Running : CPU 할당 받음
- Blocked  : 멈춤 상태
... 여긴 보안이므로 여까지
메모리 정보
(Memory limits)
프로세스가 사용하는 메모리(segment or page table) 정보

③ 프로세스별로 오픈한 파일을 관리하기 위한 '파일디스크립터 테이블(FDT:File Descriptor Table)'을 생성한다.
- 기본적으로 3개의 파일이 자동으로 오픈된다. (STDIN(0),STDOUT(1),STDERR(2))
- 프로세스 내에서 오픈한 파일을 식별하기 위한 양의 정수 값을 FD(File Descriptor)라고 한다.

④ 커널(운영체제)이 시스템 내에서 여러 프로세스에 의해 오픈된 파일들을 관리하기 위한 자료구조가 System open-file table이다.
- open_mode: 파일의 읽기/쓰기 모드
- offset: 파일 I/O를 수행하기 위한 현재 위치값(Position)
- reference_count: 해당 파일의 참조 개수/파일 복제가 발생하면 값이 증가한다.

⑤ Active vnode table은 해당 파일의 inode 정보를 가지고 있는 일종의 캐시 역할. 즉, 다양한 파일시스템의 inode 정보를 관리하기 위한 중계자 역할을 한다.

 

프로세스의 기본 요건
① 시스템 부팅을 담당하는 boot 프로세스(PID:0)를 제외한 모든 프로세스는 부모 프로세스를 가진다.
- 자식프로세스가 살아있는 데 부모가 죽으면 자식프로세스는 고아프로세스가 되며, 이 때, init 프로세스(PID:1)가 대리모가 된다.

② 프로세스 종료 시, 자신의 '종료상태정보'를 부모에게 반환(SIGCHLD)해야 정상적으로 소멸이 가능하다.
- 종료상태정보: PID, Exit Code(종료 시 반환값), CPU 사용시간 등의 정보를 말한다. 
- 종료상태정보를 전달할 때, 자식프로세스는 일시적으로 좀비프로세스가 된다.
- 좀비프로세스: 프로세스가 수행을 종료했지만, 커널오류 or 종료한 자식프로세스에 대한 처리오류 등으로인하여 소멸하지 않고 남아있는 상태. kill 시그널을 통해서도 소멸하지 않아 부모 프로세스를 강제로 종료시키거나 시스템 재기동을 통해 커널 정보를 초기화 하는 방법으로 제거
- 커널 관점에서 프로세스는 무한히 생성하지 못하므로, 좀비 프로세스가 너무 많아지면 시스템 가용성에 문제 발생

③ fork() 함수 : 자식 프로세스 생성함수
- 부모 프로세스 : 생성한 자식 프로세스의 PID 반환
- 자식 프로세스 : 0 반환

 

프로세스 정보 확인 명령어
(Process Status)

 

문법 ps [-flaAe] [-G gid_list] [-g egid_list] [-U uid_list] [-u euid_list] [-t terminal_list]
옵션 -f f형식으로 프로세스 정보 출력
-l l형식으로 프로세스 정보 출력
-exec 명령어 현재 시스템에서 동작중인 모든 프로세스 정보 출력 (every)
명시하지 않으면 현재 쉘에서 실행되어 동작중인 프로세스만 출력함

 

예문

 

ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:00 ?        00:00:10 /sbin/init
root       1001     1  0 10:05 tty1     00:00:00 /usr/bin/bash
user       1010  1001  0 10:05 pts/0    00:00:01 /usr/bin/ssh
user       1011  1001  0 10:05 pts/1    00:00:00 /usr/bin/top
UID User ID, EUID
PID Process ID, PID
PPID Parent Process ID
STIME Start Time, 프로세스 시작 시간('월 일' or '시:분:초')
TTY 프로세스와 연결된 터미널 타입
  • ? (물음표)
    • 의미: 프로세스가 터미널과 연결되지 않은 상태. 일반적으로 시스템의 백그라운드에서 실행되는 프로세스들이 ?로 표시됩니다. 예를 들어, 데몬(demon) 프로세스나 시스템 서비스는 터미널에 연결되지 않기 때문에 ?로 표시
  • /dev/ttyX (X는 숫자)
    • 의미: 프로세스가 특정 가상 콘솔(또는 실제 콘솔)과 연결되어 있다는 것을 의미합니다. 예를 들어, tty1, tty2, tty3 등은 시스템에서 사용할 수 있는 가상 콘솔
    • 예: tty1, tty2, tty3는 각기 다른 콘솔 세션을 의미. 사용자가 직접 Ctrl + Alt + F1 ~ Ctrl + Alt + F6을 눌러서 전환할 수 있는 콘솔
  • /dev/pts/X (X는 숫자)
    • 의미: pts는 pseudo-terminal slave(가상 터미널 슬레이브)를 의미. 주로 X 윈도우 시스템 또는 원격 접속(예: SSH)을 통해 생성되는 가상 터미널. pts는 가상 터미널 장치 파일이므로, 사용자가 ssh로 접속하거나 GUI 환경에서 터미널 프로그램을 사용할 때 나타남.
      • 예: /dev/pts/0, /dev/pts/1 등은 여러 개의 터미널 세션. SSH나 Xterm과 같은 터미널 에뮬레이터 프로그램에서 사용.
  • ttyS0, ttyS1, ... (시리얼 포트 장치)
    • 의미: 시리얼 포트. 이 값은 주로 시리얼 연결을 통해 실행된 프로세스나, 물리적 디바이스와 연결된 터미널을 나타냄.
    • 예: /dev/ttyS0는 첫 번째 시리얼 포트를 나타냄. 
  • ttyUSB0, ttyUSB1, ... (USB 시리얼 포트 장치)
    • 의미: tUSB 기반의 시리얼 포트 장치. USB-to-serial 어댑터나 USB 모뎀을 사용할 때 나타남.
    • 예: /dev/ttyUSB0는 USB 시리얼 장치에 연결된 터미널을 나타냄.
TIME CPU 사용 시간(시:분:초)
CMD 명령어 이름

 

ps -el

F S  UID   PID  PPID  C PRI  NI  ADDR  SZ WCHAN  TTY  TIME CMD
4 S  1000  2345  1234  0  80  0  1234  456 wait   tty1  00:00:02 bash
4 R  1000  2346  2345  5  80  0  5678  789 -      pts/1 00:00:00 top
0 Z  1000  2347  2345  0  80  0  0000  123 zombie ?    00:00:00 my_program
F (Flags) 프로세스의 상태 플래그. 이 값은 시스템이 프로세스의 동작 상태를 추적하는 데 사용.
S (State) 프로세스의 상태
  • R: 실행 중 (Running) 또는 실행 가능한 상태.
  • S: 대기 중 (Sleeping), I/O 작업을 기다리고 있음.
  • D: 불가침 대기 상태 (Uninterruptible Sleep), 하드웨어 I/O가 완료될 때까지 대기.
  • Z: 좀비 상태 (Zombie), 종료되었지만 부모 프로세스가 아직 상태를 확인하지 않은 프로세스.
  • T: 추적 상태 (Traced or Stopped), 프로세스가 중단되었거나 디버깅 중.
  • I: 유휴 상태 (Idle), 프로세스가 CPU를 사용하지 않고 유휴 상태.
UID User ID, EUID
PID Process ID
PPID Parent Process ID
C (CPU usage) 프로세스가 사용한 CPU 자원의 비율
PRI (Priority) 프로세스의 우선순위
값이 낮을수록 우선순위가 높음.
이 값은 운영 체제의 스케줄러가 프로세스를 언제 실행할지 결정하는 데 영향을 미침
NI (Nice value) 프로세스의 Nice 값
프로세스의 우선순위에 영향을 미침
ADDR (Memory address) 프로세스가 사용하는 메모리의 주소
시스템에 따라 출력되지 않을 수 있음
SZ (Size) 프로세스가 사용하는 가상 메모리의 크기를 킬로바이트(KB) 단위로 나타냄.
WCHAN (Waiting Channel): 프로세스가 대기 중인 자원이나 이벤트(예: I/O 작업)
    • 예: sleep은 프로세스가 대기 중이라는 의미
TTY (Terminal Type) 프로세스가 실행된 터미널. 
  • tty1, tty2, ..., tty7: 로컬 터미널 (가상 콘솔).
  • pts/0, pts/1: 원격 터미널(SSH 등) 또는 가상 터미널.
  • ?: 터미널에 연결되지 않은 프로세스(예: 데몬 프로세스).
TIME (Cumulative CPU Time) 프로세스가 사용한 총 CPU 시간
CMD (Command) 실행된 명령어