프로세스 개념
프로세스(Process)
: 실행 중인 프로그램. 시분할 시스템에서의 작업 단위. 능동적 실체
- 프로세스의 집합체 = 시스템 : OS에 의해 CPU는 프로세스들 간에 다중화하여 시스템 효율성을 높임
- 사용자 프로세스: 사용자 실행 프로그램 (⊕ 프로그램(Program): 보조기억장치에 저장된 파일. 수동적 존재)
- 시스템 프로세스: 사용자 관리, 메모리 관리, 네트워크 접속 관리 등 다양
프로세스 간의 관계
- 프로세스들은 부모-자식 관계를 가짐: 부모 프로세스(Parent process), 자식 프로세스(Child process)
- 필요에 따라 부모 프로세스는 자식 프로세스를 생성
- 자식 프로스세는 또다른 자식 프로세스 생성 가능
- 모든 프로세스는 자신을 생성한 부모 프로세스를 가짐(단, 부팅시 스케줄러가 실행한
init와kthreadd프로세스는 예외)
- 자식 프로세스는 주어진 일을 끝내면 부모 프로세스에게 결과를 돌려주고 종료

프로세스 번호
: PID(Process IDentification number)
- 각 프로세스는 고유한 번호를 가짐
- 1번부터 시작
- 1번:
init, 모든 시스템 프로세스의 부모 프로세스 - 2번:
kthreadd, 모든 스레드의 부모 프로세스
- 1번:
- 시스템 부팅 후 프로세스 생성 시 1씩 증가하면서 부여
프로세스 종류
- 실행 프로세스 : 정상적인 실행을 하는 프로세스
- 종료 시 부모 프로세스에게
exit status를 보냄 ➡ 부모 프로세스는 이 정보를 받으면 프로세스 테이블 목록에서 해당 자식 프로세스를 삭제
- 종료 시 부모 프로세스에게
- 데몬(deamon) 프로세스: 특정 서비스를 제공하기 위한 프로세스
- 평소에는 대기 상태 → 서비스 요청이 들어오면 해당 서비스 제공
- 커널에 의해 실행됨
- 고아(orphan) 프로세스 : 부모 프로세스가 먼저 종료된 자식 프로세스
- 1번 프로세스가 새 부모 프로세스가 되어줌
- 좀비(zombie) 프로세스: 자식 프로세스가 종료했는데도 부모의 프로세스 테이블에서 삭제되지 않는 경우
- 부모 프로세스가 종료 정보를 제대로 처리하지 못했기 때문에 발생
- 실제 실행되지는 않으나 프로세스 테이블 목록 차지 ➡ 목록이 차면 다른 프로세스를 실행하지 못하게 될 수도 있음
- 프로세스 목록에
defunct process라 나오기도 함
프로세스 관리 명령
프로세스 목록 보기
: Commad format /bin/ps [옵션] - 현재 실행중인 프로세스의 목록 출력
- 세 가지 유형의 옵션 지원
- 유닉스(SVR4): 붙임표로 시작
- BSD 옵션: 붙임표로 시작하지 않음
- GNU 옵션: 붙임표 두 개로 시작
- 각 옵션은 섞어 사용 가능하나 상반된 속성을 가진 옵션끼리 사용하면 충돌 발생 → 나에게 맞는 옵션 조합 선택해 사용해야 함
ps의 옵션
- 유닉스 옵션
-e: 실행 중인 모든 프로세스의 정보 출력-f: 프로세스에 대한 자세한 정보 출력-u uid: uid 사용자에 대한 모든 프로세스 정보 출력-P pid: pid 프로세스에 대한 정보 출력
- BSD 옵션
a: 터미널에서 실행한 프로세스의 정보 출력u: 프로세스 소유자명/CPU 사용량/메모리 사용량 등 출력x: 실행 중인 모든 프로세스의 정보 출력
- GNU 옵션
--pid PID: PID 프로세스의 정보를 출력
ps의 기본 출력
- Command format : ps

: 현재 쉘이나 터미널엣 실행한 사용자 프로세스 목록 출력
- PID : 프로세스 번호
- TTY : 현재 터미널 번호
- TIME : 프로세스가 사용한 CPU 시간 양
- CMD : 실행중인 명령
상세 정보 출력
- Command format : ps -f
: 프로세스의 상세 정보 출력

| 항목 | 의미 | 항목 | 의미 |
| UID | 프로세스를 실행한 사용자 ID | STIME | 프로세스의 시작 날짜나 시간 |
| PID | 프로세스 번호 | TTY | 프로세스가 실행된 터미널의 종류와 번호 |
| PPID | 부모 프로세스 번호 | TIME | 프로세스 실행 시간 |
| C | CPU 사용량(% 값) | CMD | 실행되고 있는 프로그램 이름(명령) |
전체 프로세스 목록 출력
- Command format ps -e : 실행중인 전체(entire) 프로세스 목록 출력 (TTY가 ?인 것은 데몬 프로세스)
- Command format ps -ef : 실행중인 전체 프로세스의 자세한 정보 출력

특정 프로세스 정보 출력
- Command format ps -p <PID> : 지정한 PID를 갖는 프로세스의 정보 출력 (f 옵션 함께 부여시 p 앞쪽에)
- Command format ps -ef | grep <프로세스정보>

상세 상태 정보 출력
- Command format: ps a
: 터미널에서 실행한 프로세스의 상태 정보 출력 (STAT: 프로세스 상태)


자원 사용량 정보 출력
- Command format: ps u
: 프로세스 소유자명/CPU 사용량/메모리 사용량 등 출력


상태 및 자원 사용량 출력
- Command format: ps au
: 터미널에서 실행한 프로세스들의 상태 및 자원 사용량 출력

전체 프로세스 목록 출력(BSD 옵션)
- Command format ps ax : 실행중인 모든 프로세스 출력 (ps -e와 유사)
- Command format ps aux : 실행중인 모든 프로세스의 자세한 정보 출력 (ps -ef와 유사)
시그널(Signal)
: 프로세스에 무언가 발생했음을 알리는 간단한 메시지
- 무엇이 발생했는지 나타내는 미리 정의된 상수 사용
- 각 시그널은 번호로 구분되면 이름을 가짐: SIGXXX
- 시그널을 받은 프로세스는 기본적으로 종료 (e. ^c: 중단하라는 인터럽트 신호) - 시그널에 따라 프로세스 내부에서 처리 방법을 달리 할 수도..
시그널의 종류
: $ kill -l
- 주요 시그널
| 시그널 | 번호 | 기본 처리 | 의미 |
| SIGHUP | 1 | 종료 | 터미널과 연결이 끊겼을 때 발생한다. |
| SIGINT | 2 | 종료 | 인터럽트로 사용자가 Ctrl+c를 입력하면 발생한다. |
| SIGQUIT | 3 | 종료, 코어덤프 | 종료 신호로 사용자가 Ctrl+\을 입력하면 발생한다. (코어덤프: 죽는 순간의 정보값. 후일 디버깅에 사용) |
| SIGKILL | 9 | 종료 | 이 시그널을 받은 프로세스는 무시할 수 없으며 강제로 종료된다. (=SIGSTOP) |
| SIGALRM | 14 | 종료 | 알람에 의해 발생한다. |
| SIGTERM | 15 | 종료 | kill 명령이 보내는 기본 시그널이다. |
PID를 이용한 프로세스 종료
- Command format: /bin/kill [시그널] <PID>
: 지정한 시그널을 PID 프로세스에게 보냄
- 사용자가 소유한 프로세스만 종료 가능 - root는 모든 프로세스 종료 가능
- [시그널]
-15: 프로세스가 관련된 파일을 정리하고 안전한 종료 (기본값. 무시될 수 있음)-9: 무조건 강제 종료-2: 인터럽트 (ctrl+c)
작업 제어
프로세스 실행 형태
- 포그라운드 작업(Foreground Jobs)
- 사용자와 대화식으로 수행되는 프로세스들 - 한 번에 하나씩 실행됨(실행되는 동안 사용자 대기)
- 일반적으로 사용자가 명령을 실행하는 방식
- 백그라운드 작업(Background Jobs)
- 명령 처리가 끝나는 것과 무관하게 바로 프롬프트가 출력됨 (입출력이 필요한 경우 일반적으로 리다이렉션 이용 필요)
- 한 번에 여러 프로세스를 동시 실행 가능
- 명령 실행시 끝에 &를 붙여줌
작업 제어
: 한 터미널에서 동시에 여러 프로세스를 실행/관리하기 위해 개발
- 작업 전환: 포그라운드 작업 ↔ 백그라운드 작업
- 작업 일시 중지: 작업을 임시 중단함. 추후 재개 가능한 상태
- 작업 종료: 프로세스를 종료
작업 목록 보기
- Command format : jobs [%작업번호]
: 백그라운드 작업들의 목록 출력
- 특정 작업 번호를 지정하면 해당 작업의 정보만 출력
%번호: 해당 번호의 작업 정보를 출력%+또는%%: 작업 순서가 +인 작업 정보를 출력%-: 작업 순서가 -인 작업 정보 출력
jobs 명령의 출력 항목
| 항목 | 출력 예 | 의미 |
| 작업 번호 | [1] | 작업 번호로서 백그라운드로 실행할 때마다 순차적으로 증가한다. ([1], [2], [3], ...) |
| 작업 순서 | + | 작업 순서를 표시한다. · + : 가장 최근에 접근한 작업 · - : + 작업보다 바로 전에 접근한 작업 · 공백: 그 외의 작업 |
| 상태 | 실행 중 | 작업의 상태를 표시한다. · 실행 중(Running) : 현재 실행 중이다. · 완료됨(Done) : 작업이 정상적으로 종료된다. · 종료됨(Teminated) : 작업이 비정상적으로 종료된다. · 정지(Stopped) : 작업이 잠시 중단된다. |
| 명령 | sleep 100 & | 백그라운드로 실행 중인 명령 |
작업 전환
- Command format :
[ctrl] + z: 포그라운드 작업을 정지시킴bg [%작업번호]: 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환fg [%작업번호]: 작업 번호가 지시하는 작업을 포그라운드 작업으로 전환
작업 종료
- Command format :
[ctrl] + c: 대부분의 포그라운드 작업을 종료- 인터럽트 시그널을 이용
- 해당 프로그램에서 이 시그널을 무시하도록 한 경우에는 종료되지 않을 수 있음
kill <%작업번호>: kill 명령의 인자로 PID 대신 작업번호 지정 가능
포그라운드-백드라운드 작업 전환
- 작업 중지(ctrl + z) 후 bg %작업번호

- fg %작업번호

작업 종료하기
- 포그라운드 작업은 ctrl+c로 대부분 종료 가능

- PID 확인 후 kill 명령으로 강제 종료

로그아웃 후에도 작업 지속
- Command format : /usr/bin/nohup [명령] &
: 로그아웃을 한 뒤에도 백그라운드 작업을 계속 실행시킴
- 기본적으로 실행 결과와 오류 메시지는 현재 경로에 nohup.out 파일에 저장됨