본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

9. shell - foreground & background 프로세스

by devraphy 2021. 9. 9.

1. 리눅스 프로세스

 

- 이번 포스팅에서는 리눅스에서 사용하는 프로세스에 대해서 알아보자.

 

a) 프로세스와 바이너리 

▶ 바이너리

   - 코드 이미지 또는 실행파일

   - 저장매체에 보관되어있는 파일

 

▶ 프로세스

   - 실행중인 프로그램 (메모리에 올라간 프로그램) 

   - 가상 메모리 및 물리 메모리 정보 (상태 정보, 실행 중일 때만 알 수 있는 정보, 대표적으로 PCB)

   - 시스템 리소스 정보 (사용중인 시스템 자원에 대한 정보)

   - 스케쥴링 단위 (프로그램을 실행시키는 단위)

 

 

b) 리눅스는 다양한 프로세스의 실행 환경을 제공한다. 

▶ 유닉스의 철학

   - 여러 프로그램이 각자의 일을 하며 서로 유기적으로 동작하여 전체 시스템이 움직이는 모델 

 

- 이처럼 리눅스(유닉스)는 다양한 프로세스를 기반으로 작동하기 때문에, 그만큼 프로세스를 통제하고 조작하는 것이 중요하다. 

- 리눅스의 백그라운드에 존재하는 다양한 프로세스를 조작하기 위한 명령어를 알아보자. 


2. foreground process

a) foreground process

- 터미널에서 shell을 통해 입력되는 명령어는 전부 foreground process에서 동작하는 명령어다.

- 그러므로 하나의 명령어와 옵션만을 사용할 수 있지, 다양한 명령어를 조합하여 프로세스를 조작하는 방식은 지원하지 않는다. 

 

b) foreground process의 특징 

- shell에서 프로세스를 실행한 후, 프로세스가 종료될 때까지 사용자는 다른 입력을 하지 못한다.(동기적 실행)

- 하지만, 현대의 CPU속도가 매우 빠르기 때문에 이 부분에 대해 체감하기는 어렵다. 

- 아래의 예시를 수행하면서 경험해보자. 

sudo apt-get install gcc
# GNU프로젝트에서 만든 C 언어 컴파일러 설치 명령어

- sudo를 사용한 이유는 apt-get 명령어가 시스템을 조작하는 명령어기 때문이다. 

- apt-get은 현재 시스템에 있는 패키지 또는 프로그램을 설치하거나 제거할 때 사용하는 명령어다. 

- 제 c 언어를 사용하여 무한루프 프로그램을 만들어 볼 것이다. 

 

vi loop.c 
# c프로그램 파일을 생성한다.
#include <stdio.h>

int main()
{
        int i = 1;
        while (i == 1) {
        }

        return 0;
}
# 무한루프를 도는 C언어 프로그램이다.
 gcc loop.c -o loop
 # 실행파일을 생성한다. 실행파일 이름은 loop로 짓는다.

실행파일이 생성된 모습

./loop
# 현재 위치에서 loop 실행파일을 실행한다는 명령어

실행결과

- 무한 루프 프로그램이 끝날 때까지 어떤 명령어도 실행할 수 없는 상태가 된다. 

- 이것이 foreground 프로세스를 실행할 때, 수행 작업이 끝날 때까지 다른 작업을 할 수 없는 상태다.

- 강제적으로 프로그램을 종료하기 위해서는 컨트롤 + c 를 누른다. 


3. background process

- 앞서 foreground 프로세스에 대해서 배우면서, 동기적 수행의 불편함에 대해서 알아보았다. 

- 이러한 불편함을 해결하기 위해서 등장한 기술이 background process 이다. 

 

a) background process의 특징

- foreground와 다르게, 수행중인 프로세스의 결과와 상관없이 다른 작업을 수행할 수 있도록 한다. 

- shell에서 프로세스를 실행하면, 맨 뒤에 &을 붙여서 다른 작업을 수행할 수 있다. 

- 다음 예시를 살펴보자.

./loop &

- background 에서는 무한루프 프로그램이 수행중에 있다. 

- 하지만, 다른 작업을 수행할 수 있는 것을 확인할 수 있다. 

댓글