🔅 프로그램과 프로세스
프로그램은 일반적으로 사용자가 원하는 일을 처리 할 수 있도록 프로그래밍 언어를 사용하여 수행절차를 표현해 놓은 명령어들의 집합.
쉽게 말하자면 컴퓨터에서 어떤 작업을 실행하기 위한 코드로, 정적인 상태의 파일이라고 볼 수 있다.
컴퓨터에서 실행되고 있는 프로그램을 프로세스라고 부른다. 사용자가 프로그램을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당 받아 프로그램의 코드를 실행한다. 이때 실행되는 프로그램을 프로세스라고 부른다.
하나의 프로그램을 여러 번 구동하면 여러 개의 포로세스가 메모리 상에서 실행된다. 이렇게 하나의 프로그램은 여러 프로세스(다중 프로세스)를 만들기도 한다.
📌 스레드 (Thread)
스레드는 사전적 의미로 한 가닥의 실이라는 뜻. 한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어 놓았다고 해서 유래한 이름이다. 하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미.
📌 멀티 스레드 (Multi-Thread)
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미한다. 운영체제는 멀티 태스킹을 할 수 있도록, 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행한다.
멀티 태스킹은 꼭 멀티 프로세스를 의미하는 것은 아니다. 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 애플리케이션도 있다. 하나의 프로세스에서 두 가지 이상의 작업을 처리할 수 있는 방법은 멀티 스레드에 있다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면 멀티스레드는 애플리케이션 내부에서의 멀티 태스킹 이라고 할 수 있다.
프로세스 실행방식에는 두 가지 방식이 있다. 포그라운드(foreground) 방식과 백그라운드(background) 방식이다.
🔆 포그라운드(foreground)
터미널에서 작업할 때, 사용자가 명령을 입력하면 해석하여 실행하고 결과를 화면에 출력한다. 그러면 다시 사용자에 화면에 출력된 결과를 확인하고 또다른 명령어를 입력하는 대화식으로 작업을 수행하게 된다. 이렇게 사용자가 입력한 명령이 실행되어 결과가 출력될 때 까지 기다려야 하는 방식을 포그라운드 방식이라고 하며, 이러한 방식으로 처리되는 프로세스를 포그라운드 프로세스 라고 한다.
🔆 백그라운드(background)
포그라운드 방식은 한 번에 하나의 명령을 실행하므로 동시에 여러 프로세스를 실행하기는 어렵다. 그러나 백그라운드 방식을 사용하면 프로세스가 실행되는 동안 뒤에서 다른 프로세스가 실행될 수 있으므로 한 터미널에서 여러 개의 포르세스를 동시에 실행할 수 있다. 이처럼 백그라운드 방식으로 처리되는 프로세스를 백그라운드 프로세스라고 하며, 이러한 백그라운드 작업은 명령의 실행 시간이 많이 걸릴 것으로 예상되거나, 명령을 실행한 후 다른 작업을 해야할 경우 사용한다.
벡그라운드 방식은 명령어 뒤에 & 를 붙여서 실행하고, 다른 명령어를 추가적으로 입력할 수 있다. 하지만 백그라운드 방식으로 실행해도 사용자의 터미널 세션이 종료되면 실행중인 프로세스도 종료된다.
작업 시간이 오래 걸리는 작업인 경우 nohub 명령어를 이용하여 백그라운드로 실행하면 사용자의 터미널 세션이 종료되어도 작업이 종료될 때까지 프로세스를 실행한다.
# 포그라운드 방식
$ command
$ ping google.com
# 백그라운드 방식 -- &추가
$ command &
$ ping google.com &
# nohup 커맨드(no hang up)
$ nohup command &
$ nohup ping google.com &
컴퓨터에서 실행되고 있는 프로세스의 목록을 확인하고, 관리 할 수 있어야 한다. 따라서 목록을 확인하기 위한 명령의 사용법과 알고 있어야 하는 기본적인 용어를 알아보자.
📌 ps
ps 명령은 현재 실행 중인 프로세스의 목록을 확인할 수 있다. ps 명령만으로도 프로세스 목록을 파악할 수 있지만 더 자세한 항목이 필요하다면 여러 옵션과 함께 사용할 수 있다.
ps 명령의 결과로 PID, TTY, TIME, CMD가 출력되며 각각의 의미는 다음과 같다.
PID : 프로세스 번호
TTY : 프로세스가 실행된 터미널의 종류와 번호
TIME : 프로세스 실행 시간
CMD : 실행되고 있는 프로그램의 이름(명령)
📌 UNIX 방식
📌 BSD 방식
보통 프로세스의 관계를 보기 위해서 UNIX 방식인 ps -ef를, 프로세스의 상태를 보는 용도로는 BSD 방식인 ps aux를 가장 많이 사용합니다.
위의 명령에 따른 결과로 다양한 항목이 출력됩니다. 위에서 살펴본 항목 외에도 무엇이 있는지 아래서 살펴보겠습니다.
📌 ps -f의 출력 정보
📌 ps a, u, x의 출력 정보
📌 pstree
컴퓨터의 전체 프로세스를 구조화하여 확인하고 싶을 때는 pstree 명령을 사용합니다. 이 명령을 사용하면 다음과 같이 트리구조로 도식화하여 프로세스를 확인할 수 있고 부모 관계를 한 눈에 파악할 수 있다.
터미널에서 프로그램이 실행되고 있을 때, Ctrl + c 을 통해 프로세스를 종료시켜 본 적이 있을 겁니다. Ctrl + c 키를 눌렀을 때, 프로그램을 종료하기 이벤트가 발생을 하게 되고, 이러한 이벤트를 프로세스에 전달하는 과정이 필요합니다. 이 때, 종료라는 이벤트를 프로세스에 알려주기 위해서 사용하는 것을 시그널(Signal)이라고 한다.
이렇게 특정 프로세스에 작업 중지, 실행 종료, 대기, 재시작, 강제 종료 등의 시그널을 전달하기 위해서 kill 명령을 사용합니다. kill -l 명령을 사용하면, 사용할 수 있는 시그널의 종류를 확인 .
주로 사용하는 시그널은 다음과 같다.
SIGHUP : 재시작할 때 사용
SIGINT : 실행 중지 시그널, Ctrl + c
SIGKILL : 프로세스 강제 종료
SIGTERM : 프로세스 정상종료 (기본 명령)
SIGCONT : 정지된 프로세스 실행
SIGSTOP : 터미널에서 입력되는 정지 시그널
SIGTSTP : 실행 정지 후 재실행 대기, Ctrl+ z
위의 시그널을 이용해 kill 명령을 사용하기 위해서는 다음과 같이 명령을 작성하면 됩니다.
kill -시그널번호(시그널명) %작업번호
kill -시그널번호(시그널명) PID
백그라운드에서 수행 중인 프로세스는 jobs 명령으로 확인할 수 있습니다.
[1] 혹은 [2] 라고 되어 있는 기호는 작업 번호를 이야기 합니다. 더불어 + 기호로 표시된 프로세스는 현재 처리되고 있는 작업을 의미하며, - 기호는 다음에 작업할 프로세스를 의미합니다.
그 뿐만 아니라 jobs 명령을 통해 프로세스의 상태도 확인할 수 있습니다.
프로세스의 상태
Running : 실행 중
Stopped : 일시 중단(Ctrl + Z 입력)
Terminated : 강제 종료(kill 명령 종료)
Done : 정상 종료
다수의 프로세스가 백그라운드에서 작업하는 도중에 필요하다면, fg %작업번호 명령을 사용하여 포그라운드로 전환할 수 있습니다.