Search
🏫

[Unix 시스템] 8. 프로세스 관리

Tags
CS
Linux
Last edited time
2024/12/07 07:01
2 more properties
Search
[Unix 시스템] 8. 프로세스 관리
CS
Linux
2024/12/03 12:59
[Unix 시스템] 8. 프로세스 관리
CS
Linux
2024/12/03 12:59

1. 프로세스

1.1. 프로세스 정의

커널에 등록되어 관리받는 '실행 중인 프로그램'
커널은 프로세스 관리 블록(PCB)에 프로세스에 관한 정보를 저장
프로세스는 시스템 자원을 사용하며 여러 상태 변화를 겪음
각 프로세스는 유일한 PID를 가짐
프로세스 예
systemd 프로세스는 PID가 1
모든 사용자 프로세스의 조상 프로세스
로그인을 하거나 터미널 창을 열면 bash 프로세스가 할당됨
필요에 따라 프로세스는 자식 프로세스를 생성함
데몬 프로세스는 서비스 요청을 처리하기 위한 백그라운드 프로세스

1.2. 프로세스 관리 블록

프로세스 관리 블록(PCB)
커널에 등록된 각 프로세스에 대한 정보를 저장하는 영역
프로세스들은 모두 커널 공간에 자신의 정보를 가짐
PCB에 저장되는 정보
PID와 PPID
UID와 EUID 및 GID와 EGID
프로세스의 현재 상태
실행/준비/보류/지연 등의 상태 정보와 CPU 사용 시간 등
프로세스 우선순위
프로세스가 사용 중인 자원에 관한 정보
메모리 주소, 입출력 장치, 파일 등
모든 대기 중인 시그널의 목록
문맥 교환 정보

1.3. 명령의 실행과 프로세스의 생성

셸에서 명령을 실행하면 새로운 프로세스가 만들어져 처리됨
시스템 호출 fork()를 호출하여 기존 부모 프로세스가 자신의 복사본 자식 프로세스를 만듦
자식 프로세스는 시스템 호출 exec(program)에 의해 새로운 프로그램으로 대체되어 실행됨
프로그램이 종료되면 자식 프로세스가 종료됨
부모 프로세스는 보류 상태에 있다가 자식 프로세스가 종료되면서 깨어남-
터미널 창에서 ls 명령을 실행하면
fork()를 호출하여 셸의 복사본(자식 프로세스)을 생성함
자식 프로세스는 exec(ls)를 호출하여 ls 명령을 실행함
pstree 명령은 프로세스 트리를 보여주는 명령

1.4. 포어그라운드 프로세스

셸 프롬프트에서 명령을 실행하면 포어그라운드 모드로 수행됨
포어그라운드 프로세스는 터미널에 대한 제어권을 가짐
포어그라운드 프로세스는 키보드 입력 및 화면 출력이 가능함
터미널로부터 키보드 입력을 받을 수 있는 프로세스는 하나뿐임
포어그라운드 프로세스가 끝나기 전에는 다른 명령을 수행할 수 없음
포어그라운드 실행 중인 프로세스를 강제 종료하려면 Ctrl + C를 입력하여 강제로 중지
포어그라운드 실행 중에 멈춤(또는 지연) 상태로 전환하려면 Ctrl + Z를 입력하면 백그라운드로 전환되며 "중지" 상태가 됨
fg jobId 또는 bg jobId 명령을 실행하여 실행 상태로 복구 가능

1.5. 백그라운드 프로세스

백그라운드로 실행하려면 셸 프롬프트에서 명령의 끝에 &를 추가하여 실행
백그라운드 프로세스를 실행시키면 셸은 즉시 명령 대기 상태가 됨
백그라운드 프로세스는 터미널 출력은 가능하나 키보드 입력은 받을 수 없음
백그라운드 프로세스가 키보드 입력이 필요하면 지연 상태가 됨
입력 없이 장시간 실행되어야 하는 경우 주로 사용
터미널 창을 종료하면 연결된 모든 백그라운드 프로세스도 종료됨
백그라운드 프로세스를 포어그라운드로 전환하는 방법
셸에서 fg jobId를 실행
jobs 명령으로 백그라운드 프로세스의 상태를 점검할 수 있음
jobs -l 명령은 PID를 함께 보여줌

1.6. 특수권한

SetUID
일반 사용자가 passwd 명령어로 비밀번호를 수정하면, 결국 /etc/passwd 또는 /etc/shadow 파일이 수정되어야 함(권한 상승 필요)
실행 파일에 SetUID가 설정되어 있으면, 해당 파일이 실행될 때 실행시킨 사용자가 아닌 파일의 소유자 권한으로 실행됨
프로세스의 EUID는 파일의 소유자가 됨
파일의 접근권한에서 소유자의 실행 권한에 x가 아닌 s가 표시됨
$ ls -l /etc/passwd -rw-r--r--. 1 root root 2161 811 01:51 /etc/passwd $ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 32656 515 2022 /usr/bin/passwd
Shell
복사
설정 방법
chmod 4755 file chmod u+s file
Shell
복사
해제 방법
chmod 0755 file chmod u-s file
Shell
복사
SetGID
파일의 접근권한에서 그룹의 실행 권한에 s가 표시됨
SetGID가 설정된 파일을 실행하면, 실행자의 그룹 권한이 아닌 파일 소유자의 그룹 권한으로 실행됨
디렉터리에 설정된 경우
디렉터리에 파일을 만들 때, 파일의 소유 그룹이 디렉터리의 소유 그룹으로 지정됨
그룹 구성원의 공유 공간으로 사용 가능
설정 방법
chmod 2775 file chmod g+s file
Shell
복사
StickyBit
파일의 접근권한에서 기타 사용자의 실행 권한에 t가 표시됨
주로 공유 디렉터리에 설정되며:
누구나 디렉터리에 파일을 생성 가능
파일의 소유자만 삭제할 수 있음
설정 방법
chmod 1777 file chmod o+t file
Shell
복사
예시
$ ls -ld /tmp drwxrwxrwt. 18 root root 4096 911 11:57 /tmp
Shell
복사

2. 프로세스의 상태

2.1. 프로세스의 상태 변화

제한된 자원 하에 멀티태스킹을 지원하는 운영체제에서 프세스는 여러 상태 변화를 겪음

2.2. ps 명령

프로세스의 현재 상태를 확인하는 명령
특정 순간에 활동 중인 프로세스의 상태를 보여줌
ps [options]
옵션 없이 ps 명령을 실행하면 현재 터미널과 연결되어 있는 프로세스 중 프로세스의 EUID가 현재 사용자의 UID와 같은 프로세스를 선택하여 보여줌.
ps -efps aux 명령은 모든 사용자의 모든 프로세스에 관한 많은 정보를 보여줌.
결과에서 PPID는 부모의 PID, STIME은 시작 시간, TTY는 터미널, TIME은 CPU 누적 사용 시간.
예시)
$ ps -ef -forest UID PID PPID C STIME TTY TIME CMD <중간 생략> root 1 0 0 11:19 ? 00:00:03 /usr/lib/systemd/systemd rhg kdhong 2100 1 0 11:21 ? 00:00:00 /usr/lib/systemd/systemd --user kdhong 2930 2100 0 11:21 ? 00:00:04 \_ /usr/libexec/server kdhong 2962 2930 0 11:21 pts/0 00:00:00 | \_ bash kdhong 9100 2962 0 12:01 pts/0 00:00:00 | \_ ps -ef --forest
Bash
복사
옵션
옵션
설명
a
터미널과 연결된 모든(all) 사용자의 모든 프로세스를 출력함.
-A 또는 -e
모든(every) 사용자의 모든 프로세스를 출력함.
u
현재 사용자의 프로세스를 사용자 친화적(user-oriented)으로 자세히 출력함.
x
현재 사용자가 소유한 모든 프로세스를 출력함. 데몬 프로세스처럼 터미널과 연결되어 있지 않은 프로세스도 출력함.
-u users / U users / --user=users
EUID가 주어진 users(사용자명이나 UID)와 같은 프로세스를 출력함. 여러 사용자를 표시할 때는 콤마(,)나 빈칸으로 구분함.
-p PIDs
주어진 PID를 가진 프로세스를 출력함.
e
프로세스 정보에 환경변수 정보를 포함시켜 출력함.
l 또는 -l 또는 -f
프로세스에 관한 많은(long or full) 정보를 출력함.
o format 또는 -o format
출력을 원하는 항목을 지정하여 출력함. 예: ps -o pid,ppid,uid,cmd

3. 프로세스 관리

3.1. top 명령

현재 실행 중인 프로세스의 모니터링과 관리를 위한 대화식 도구
현재 실행 중인 개별 프로세스의 실시간 상황을 주기적으로 보여줌
프로세스의 상태, CPU와 메모리 사용량 및 시스템의 부하 등을 확인
ps 명령의 동적-대화식 버전
top [options]
옵션
-d delay: 초 단위로 주기를 지정
-p pids-u user: 특정 프로세스나 사용자 프로세스로 한정
-S: 총 누적 CPU 사용 시간(자식 프로세스 포함)을 출력
사용 예시
기본적으로 CPU 사용량이 많은 프로세스를 먼저 보여줌

3.2. killkillall명령

kill 명령
프로세스에 시그널을 보내는 명령
다른 프로세스에게 시그널을 보내도록 커널에게 요청하는 것
시그널은 프로세스를 관리 방법이고 프로세스 간 통신 수단
여러 종류의 시그널이 존재하며 기본 시그널은 TERM
kill [-signal] pids
kill [-s signal] pids
signal: 시그널의 이름 또는 시그널 번호
kill pids 명령은 TERM 시그널을 보냄
예: kill -STOP 3188 → 해당 PID를 가진 프로세스에게 멈춤 시그널을 보냄
killall 명령
특정 프로세스에 한꺼번에 시그널을 보내는 명령
killall [options] [-s signal] [-u user] names
프로그램이나 프로세스의 이름을 사용
예: killall -i -s 9 -u kdhong bash
kdhong 계정의 bash 프로세스에서 확인을 거쳐 KILL 시그널을 보냄

3.4. 시그널의 종류

번호
이름
의미
1
HUP
터미널이 종료될 때 터미널에 연결된 모든 프로세스에게 보냄. 또는 데몬 프로세스가 설정 파일을 다시 읽어 재시작하게 만들 때 사용하는 시그널
2
INT
Interrupt의 의미로 터미널에서 Ctrl+C를 누르는 것과 같음
9
KILL
Kill의 의미로 프로세스를 강제로 즉시 종료시킴
15
TERM
Terminate의 의미로 kill 명령의 기본 시그널. 정상적인 종료 방법으로 끝내게 함
18
CONT
Continue의 의미로 STOP 시그널로 중단된 프로세스를 재개시킴
19
STOP
Stop의 의미로 프로세스를 잠시 중단시킴
20
TSTP
Terminal Stop의 의미로 터미널에서 Ctrl+Z를 누르는 것과 같음

3.5. nicerenice 명령

‘nice 우선순위(NI) 값’을 조정하는 명령
NI 값은 20(가장 높은 우선순위) ~ 19(가장 낮은 우선순위)
우선순위가 높으면 CPU를 점유할 확률이 높음
기본 NI 값은 0임
nice [option] [command]
명령을 실행할 때 NI 값을 조정하는 명령
일반 사용자는 NI 값을 0 이상으로만 지정할 수 있음
옵션
-n adjustment 또는 -adjustment: 조정 수치만큼 NI 값을 조정
예: nice -n +5 top 또는 nice --+5 top → NI 값을 5 증가시켜 우선순위를 낮춤
renice priority [options]
실행 중인 프로세스의 NI 값(절댓값)을 바꾸는 명령
일반 사용자는 자신이 소유한 프로세스의 우선순위를 낮출 수만 있음
옵션
-p pids: 프로세스를 지정
-g gids: 그룹을 지정
-u users: 사용자를 지정
예: renice 10 -u jjpark → 관리자(또는 본인)가 jjpark 계정이 소유한 모든 프로세스의 NI 값을 10으로 조정

3.6. nohup 명령

HUP 시그널과 무관하게 백그라운드 명령이 스스로 종료될 때까지 계속 수행시키는 명령
로그아웃을 하거나 터미널 창을 끝내면 백그라운드 프로세스에도 HUP 시그널이 보내짐
nohup 명령을 실행하는 경우, 명령 행의 끝에 &를 붙여 백그라운드로 실행해야 함
nohup find -size +100k > log.txt &
표준 출력과 표준 에러 출력이 필요한 경우 ~/nohup.out에 리다이렉션되어 덤프됨