프로세스
[개념]
사용자가 컴퓨터를 사용하기 위해 작성한 프로그램과 이 프로그램의 실행에 필요한 데이터를 묶어서 작업(job)라고 한다.
작업은 스케줄러에 의해 준비, 대기, 실행, 종료의 상태를 가지는 실행 단위라고 볼 수 있다.
이러한 작업은 컴퓨터 시스템 운영체제에 의뢰되어 커널에 전달되면 커널에 등록되어 등록된 작업을 프로세스라고 부른다. 즉, 커널에 등록되어 커널의 관리 하에 있는 작업을 의미하며, 이를 일반적으로 실행중인 프로그램 또는 실행중인 작업이라 정의하고 있다. 어떤 프로그램이든 실행이 되면 하나의 프로세스로써 운영이 된다.
그리고 시스템 관리자는 이 프로세스를 제어함으로서 보다 효과적으로 시스템을 관리할 수 있게 된다.
추가로 PID(Process IDentifier)는 프로세스 식별자라하며 유닉스 커널과 같은 운영체계에서 각 프로세스나 서비스를 식별하기 위해 할당하는 고유한 번호이다. PID는 fork라는 시스템 호출에 의해 생성된다. 이와 같이 프로세스가 생성되면 이와 동시에 고유의 번호가 붙는데, 이것을 프로세스 식별 번호(Process IDentity number - PID 번호)라고 한다.
이 번호는 각 프로세스들의 시작 순서에 따라 차례로 붙여진다. 이 번호는 각 프로세스들의 시작 순서에 따라 차례로 붙여진다. 이 번호는 32Bit의 경우 0부터 최대 32767까지 차례대로 부여되며, 64Bit의 경우 기본 0부터 32767까지이며
echo 4194303 > /proc/sys/kernel/pid_max 와 같이 커널 파라미터를 변경하여 최대 2^22 까지 늘릴 수 있다.
[용어]
1. 포그라운드(Foreground) : 사용자와 상호 작용하는 프로세스 이다. 사용자의 입력을 받아 화면에 출력된다.
쉘(Shell)에서 해당 프로세스를 수행할 동안 다른 동작은 할 수 없는 상태이다.
사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식이다.
2. 백그라운드 (Background) : 사용자와의 직접적인 상호 작용 없이 실행되는 프로세스 이다.
화면에 출력되지 않으며, 사용자 입력을 기다리지 않고 동작한다.
이러한 프로세스는 주로 긴 작업을 수행하거나 백엔드에서 실행되는 형태의 프로그램에
사용된다.
3. 커널(Kernel) : 커널은 응용 소프트웨어를 하드웨어에 연결하고 상호작용하며, 시스템의 모든 것을 완전히 제어(control)
한다. 즉, 운영체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러가지 서비스를 제공한다.
4. 쉘(Shell) : 쉘(Shell)은 커널(Kernel)과 프로그램(Applications)사이에 있다 볼 수 있다.
즉, 쉘(Shell)은 사용자(프로그램)에게 받은 명령을 전달받아 커널이 이해할 수 있도록 해석하여 전달하고,
커널(Kernel)은 하드웨어와 직접적으로 통신하는 역할을 한다.
사용자는 시스템 손상 방지를 위해 접근할 수 있는 영역이 제한되어 있다.
5. echo 명령어 : 컴퓨터 터미널 또는 명령 프롬프트에서 사용되는 명령어로, 주어진 텍스트를 화면에 출력하는 데 사용
된다. echo명령어는 주로 스크립트 파일에서 메시지를 출력하거나 변수의 값을 표시하고 디버깅할 때
유용하게 사용된다.
6. 터미널(Terminal) : 사용자가 명령어(Text)를 입력하면 컴퓨터는 해당 결과를 보여준다.
타이핑을 하면서 컴퓨터를 제어하는 인터페이스(도구)라고 생각하면 된다.
7. Prompt(프롬프트) : 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시
8. 프로세스(Process) : 프로그램 실행 상태를 일괄적으로 프로세스라고 한다.
프로세스는 부모 프로세스(Parent Process)와 자식 프로세스(child Process) 나뉜다.
사용자가 새로운 프로세스를 생성함에 따라 특정한 프로세스에 종속된 프로세스는
해당 프로세스를 자식 프로세스라고 한다.
그리고 그 특정한 프로세스는 자식 프로세스에 대해 부모 프로세스가 된다.
리눅스 환경에서 사용자가 프로세스를 생성할 수 있는 방법은 fork와 exec 두 가지가 있다.
9. fork : 자식 프로세스를 만든다. fork() 시스템 호출은 어떤 프로세스가 자신의 사본을 생성하는데 사용한다.
이때 fork()를 부른 프로세스를 부모 프로세스라 부르고, 새로 생성된 프로세스를 자식 프로세스라고 부른다.
이와 같은 방법은 프로세스의 수를 증가시키기 위한 전통적인 기법으로 fork() 후에는 프로세스 아이디(PID)만
다르고 두 개가 거의 동일한 프로세스인 부모(Parent)와 자식(Child)이 생긴다.
fork()시스템 호출은 새로운 프로세스를 위한 메모리를 할당한다. 간단히 정리하면 프로세스가 하나 더 생기기
때문에 PID가 새로운게 하나 더 생긴다.
10.exec : fork() 반대로, 새로운 프로세스는 없고, exec()를 호출한 프로세스의 PID가 그대로 새로운 프로세스에 적용되며,
exec()를 호출한 프로세스는 새로운 프로세스에 의해 덮어 쓰여지게 된다.
부모 프로세스에 종속되어 있는 자식 프로세스는 부모 프로세스의 환경을 물려받는다.
대부분 부모 프로세스가 종료되면 자식 프로세스도 자동으로 함께 종료된다.
[프로그램 명령어]
명령어 | 용도 |
jobs | 백그라운드 프로세스 확인 |
bg | 백그라운드에 멈춰진 프로세스 활성화 |
fg | 백그라운드 프로그램을 포그라운드로 불러냄 |
pstree | 프로세스 트리 출력 |
ps | 프로세스 상세정보 |
top | 시스템 현황 확인 |
kill | 프로세스 종료 및 시그널 전송 |
killall | 프로세스 이름으로 종료 및 시그널 전송 |
fork | 자식 프로세스 생성 |
exec | 쉘 프로그램 변경 |
nice | 실행 우선순위 조정 |
renice | 실행 우선순위 변경 |
[프로세스 상태보기]
현재 시스템에서 실행중인 프로세스를 보기 위해서는 ps 명령어를 사용한다.
ps 명령어로 전체 프로세스를 보기 위해서는 기본적으로 ps에 ax, aux 및 -e 옵션을 사용한다.
ps : 사용자와 관련된 프로세스만 출력하는 명령어
[ps 명령어 출력 항목]
출력항목 | 설명 |
USER(BSD) , UID(System V) | 프로세스 소유자의 이름 |
PID | 프로세스의 식별 번호 |
PPID | 부모 프로세스의 PID |
%CPU | CPU 사용 비율의 추정치 (BSD) |
%MEM | Memory 사용 비율의 추정치 (BSD) |
VSZ | K 단위 또는 페이지 단위의 가상 메모리 사용량 |
RSS | 실제 메모리 사용량 |
TTY | 프로세스와 연결된 터미널 |
S (System V) , SATA (BSD) | 현재 프로세스의 상태 코드 |
TIME | 총 CPU 사용 시간 |
COMMAND | 프로세스의 실행 명령행 |
STIME | 프로세스가 시작된 시간 혹은 날짜 |
C(System V) , CP(BSD) | 짧은 기간 동안의 CPU 사용률 |
F | 플래그 |
PRI | 실제 실행 우선순위 |
NI | nice 우선순위 번호 |
[ps 명령어 옵션]
옵션 | 설명 |
-A | 모든 프로세세 출력 |
a (BSD) | 터미널과 연관된 프로세스를 출력, x옵션과 같이 사용하여 모든 프로세스를 출력할 때 사용 |
-a | 세션 리더를 제외하고 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력 |
-e | 커널 프로세스를 제외한 모든 프로세스를 출력 |
-f | 출력을 풀 포맷으로 표기 (유닉스 스타일) UID, PID, PPID 등이 함께 표시 |
-l (System V) , l (BSD) | 출력을 긴 포맷으로 표기 프로세스의 정보를 길게 보여주는 옵션으로 우선순위와 관련된 PRI값과 NI값을 확인 |
-o | 출력 포맷을 지정 |
-M | 64비트 프로세스들을 출력 |
-m | 프로세스뿐만 아니라 커널 스레드도 출력 |
-p | 특정 PID를 지정하여 출력 |
-r | 현재 실행 중인 프로세스 출력 |
u (BSD) | 프로세스의 소유자를 기준으로 출력 |
-u [사용자] | 특정 사용자의 프로세스 정보를 출력, 사용자를 지정하지 않는다면 현재 사용자 기준으로 출력 |
x (BSD) | 데몬 프로세스처럼 터미널에 종속되지 않은 프로세스를 출력 |
-x | 로그인 상태에 있는 동안 아직 완료되지 않은 프로세스를 출력. (리눅스 시스템은 사용자가 로그아웃한 뒤에도 임의의 프로세서가 계속 동작 됨) |
[테스트1]
커널 프로세스를 제외한 모든 프로세스 상태보기
-e 사용
PID , TTY(프로세스에 연결된 터미널 이름) , TIME , CMD
[테스트2]
시스템에 동작중인 모든 프로세스 상태보기
ps ax 사용
PID , TTY(프로세스에 연결된 터미널 이름) , SATA(state) , TIME , COMMAND
[테스트3]
시스템에 동작중인 모든 프로세스를 소유자 정보와 함께 다양한 정보를 BSD 포맷으로 출력하여 상태보기
ps aux 사용
USER(Process 실행 User (BSD계열)) , PID , %CPU(CPU 사용 비율 추정치 (BSD계열)) , %MEM(MEM 사용 비율 추정치 (BSD계열)) , VSZ(가상 메모리 사용량) , RSS(실제 메모리 사용량) , TTY(프로세스에 연결된 터미널 이름) , SATA(state) , START(Process 시작날짜) , TIME(해당 Process 에 사용된 CPU시간) , COMMAND
[테스트4]
ps aux 처럼 시스템에 동작중인 모든 프로세스를 full format으로 자세히 출련한다. (System V계열 옵션)
ps -ef 사용
UID(Process 실행 유저) , PID(Process ID) , PPID(Process 부모 PID) , C(짧은 기간 동안의 CPU 사용률) , STIME(프로세스 시작 시간) , TTY(프로세스에 연결된 터미널 이름) , TIME(해당 Process 에 사용된 CPU시간) , CMD(Command)
[자주 사용되는 ps 명령어]
-ef 옵션은 동작 중인 모든 프로세스를 소유자 정보와 함께 풀 포맷으로 출력하는 옵션이다.
aux는 동작 중인 모든 프로세스를 소유자 정보와 함께 정보를 출력하는 옵션이다.
-p 1은 특정 프로세스 번호 이용하여 프로세스 정보를 출력한다.
-u는 특정 사용자의 프로세스 정보를 출력한다.
ps -ef | more는 페이지 단위 목록으로 가독성 좋게 정보를 출력한다.
grep 명령어를 이용해서 특정 키워드를 가진 행을 출력한다.