본문 바로가기

CS

[CS] 프로세스(process) 내용 정리

우리는 파워포인트나 엑셀과 같은 어플리케이션을 "프로그램" 이라고 부른다. 해당 프로그램을 이용하는 경우, 우리는 프로그램을 실행한다고 말한다. 그렇다면, 실행중인 프로그램은 무엇이라고 말할 수 있을까? 

 

프로세스?

프로그램(Program)

컴퓨터는 프로그래밍 언어 등을 이용하여 작성된 소스 코드에 대해 lexical, syntatic, semantic analysis를 거친 후 중간 코드를 생성한다. 이후 생성된 중간 코드를 해당 머신에 대한 컴파일러를 이용하여 컴파일해서 머신 코드/실행파일을 얻을 수도 있고, 인터프리터를 이용하여 바로 해당 코드를 실행할 수도 있다.

컴퓨터 과학에서 프로그램은 파일 형태로 작성된 "소스 코드" 에 해당한다.  이때 프로그램을 "실행"한다는 표현은 해당 환경에 적합하게 컴파일된 머신 코드 혹은 인터프리터에 의해 해석된 소스 코드를 컴퓨터의 메모리에 올려 CPU가 머신 코드를 읽어들이고, 미리 정의해둔 명령어 set에 따라 기계적으로 작업하는 일련의 행위를 뜻한다.

이때 고민할 점이 존재한다. 프로그램은 "소스 코드"로 정의되어 있다. 소스 코드는 인간이 알아볼 수 있는 텍스트 파일 포맷을 가지는 것이 일반적이다. 컴퓨터 내부에서 프로그램을 바로 사용할 수 없기 때문에, 이는 컴파일러에 의해 기계어 수준으로 번역되어 메모리 상에 올라가야만 한다. 그렇다면 프로그램을 "실행" 하여 이 것이 메모리에 올라갔을 때, 이를 실행된 프로그램이라고 말하는 것이 적절할까? 당연히 아니다. 메모리 상에 올라간 것은 기계어로 번역된 것으로, 프로그램의 정의와 맞지 않다. 따라서 이를 통칭할 용어가 필요하게 되고, 이 것이 프로세스이다.

프로세스(Process)

프로그램은 "실행" 과정을 통해 메모리에 올라가게 된다. 이때 프로그램의 실행에 의해 생성되어, 이후 메모리에 올라간 머신 코드를 프로세스라 한다. 

프로세스는 하나의 프로그램에 대해 여러개가 존재할 수 있다. 엑셀을 사용할 때 여러개의 창을 동시에 쓸 수 있는 것도 우리가 하나의 엑셀이라는 프로그램에 대해 여러개의 프로세스 인스턴스를 생성할 수 있기 때문이다. 이때 생성된 각각의 프로세스들은 프로그램의 구현 방식에 따라 정보를 공유할 수도 있고, 공유하지 않을 수도 있다.

※ 프로세서(processor)

프로세스와 이름이 유사하기 때문에 혼동하기 쉽지만, 프로세서는 메모리 등의 data stream을 통해 외부 데이터를 읽어 들이고, 이 데이터에 대해 연산처리하는 digital circuit의 하나의 단위라고 볼 수 있다. 즉 프로그램이나 프로세스와는 전혀 관계없는 하드웨어적인 영역으로, CPU · GPU 등을 예로 들 수 있다.

※ 스레드(thread)

식사 시간을 생각해보자. 우리는 한손으로는 휴대폰을 하면서, 다른 한손으로는 밥을 먹을 수 있다. 이때 부모님의 요청으로 현재 상황에서 빨래와 설거지를 동시에 해야 한다면 어떨까? 휴대폰과 식사까지는 어떻게 팔 하나씩 배정하여 할 수 있었지만, 일반적인 사람이라면 여기서 빨래 및 설거지까지 "동시에" 할 수는 없을 것이다.

컴퓨터도 마찬가지다. 컴퓨터의 중추인 CPU는 흔히 코어라 부르는 프로세싱 유닛 및 여러 레지스터 / 마이크로 프로세서의 조합으로 구성된다. 이때 각각의 코어는 보통 하나의 손(하나의 작업을 할 수 있는 단위)으로 비유되고는 하는데, 사람이 한손으로 휴대폰을 사용하면서 설거지를 할 수 없듯이 하나의 코어도 여러 작업을 동시에 수행할 수 없다.

 따라서 여러 작업을 "동시에" 하는 것처럼 보이기 위해서는 해당 작업들을 "번갈아가면서" 수행해야 한다.  특정 작업을 번갈아 가면서 수행하는 것은 해당 작업들을 특정한 시간 또는 동작 단위로 쪼갠 후, 쪼개진 조각들을 교대로 실행하는 것으로 해석할 수 있다. 하나의 작업에 대해 쪼개진 각각의 조각들을 스레드라고 한다.

스레드는 스케줄링에 의해 관리되는 instruction sequence의 한 조각으로, 스케줄링 및 스레드는 보통 사용하는 운영체제에 의해 구현된다. 각각의 스레드는 하나의 프로세스에 대한 일부이므로, 프로세스는 다수의 스레드로 구성될 수 있다.

관련된 용어들

위에서 언급한 요소들에 의해 상황에 따른 다양항 용어가 파생된다.

멀티 프로그래밍 (Multi Programming)

단일 프로세서에서 다수의 프로그램을 실행하는 방식이다.

먼 과거에는 한 순간에 메모리에 하나의 프로그램만을 올리고, 이를 구동하는 방식으로 동작했다. 따라서 다른 프로그램을 사용하기 위해서는 이전의 프로그램을 메모리에서 제거한 후, 새로운 프로그램을 메모리에 올려야만 했다. 성능이 좋아짐에 따라 하나의 프로세서에서 하나의 프로그램만을 구동하면 I/O 작업 등에 의해 단순 대기 시간의 비율이 증가했는데, 이 시간을 더 효율적으로 사용하기 위해 다수의 프로그램을 메모리에 적재한 후 Idle한 시간 동안 다른 프로세스를 동작하게 해 낭비되는 시간을 줄이기 위해 멀티 프로그래밍이 고안되었다. 이 방법은 각 프로그램의 본래 주소를 relative하게 재배치함으로써 구현된다.

현재에 이르러서는 거의 모든 컴퓨터가 여러개의 프로그램을 메모리에 동시에 적재하고, 실행할 수 있다. 따라서 멀티 프로그래밍 자체가 사실상 표준이기 때문에 이를 구분하는 것이 큰 의미가 없기는 하다.

멀티 프로세싱 (Multi Processing)

하나의 컴퓨터 시스템에서 두개 이상의 프로세서가 동시에 작동하는 방식이다. 여러개의 프로세서를 가진 시스템을 의미하는 말이며, 각각의 프로세서들은 구분되어 있지만 I/O나 메모리 영역을 공유하여 사용할 수도 있다.

컴퓨터의 성능은 CPU의 성능에 의해 크게 좌우된다. 초기에는 CPU 성능을 높이기 위해 코어 자체의 성능을 높였으나, 물리 / 과학적인 이유로 인해 이 방식은 한계에 봉착한다. 이런 한계 이후부터는 CPU 성능을 높이기 위해 코어의 개수를 높이게 된다. 실제로도 2000년대 초반의 CPU와 현재의 CPU가 코어 자체 성능면에서 드라마틱한 향상을 가지지는 않는다. 어쨌든 다수의 코어를 가지게 된 CPU는 여러개의 코어를 동시에 이용할 수 있게 된다.

멀티 프로세싱의 Processing 은 digital circuit인 프로세서(Processor)에서 출발한 것이지, 프로세스(Process)에서 온 것이 아니라는 사실을 숙지하자. (프로세스는 원래부터 여러 개 만들어질 수 있다)

멀티 스레딩 (Multi Threading)

하나의 프로세스의 context에 대해 여러개의 스레드를 운영하는 방식이다. 동일 프로세스에 대해 동작하므로, 스레드들은 동일한 메모리 및 정보를 공유할 수 있다.

하나의 프로세스를 다수의 스레드로 이용하는 방식은 다양한 이점이 있을 수 있다.

Parallel : 반복되는 업무를 멀티 프로세싱 환경 하에서 각 코어에 분산하여 계산하는 과정을 통해 속도를 높일 수 있다. 예를 들어 10000개의 유사한 작업에 대해 10개의 스레드를 사용할 수 있다면, 각각의 스레드는 1000개의 일을 나눠 다른 코어에서 계산을 수행함으로써 전반적인 속도를 늘릴 수 있다.

Concurrency : 하나의 micro processor 하에서 프로그램들이 "동시에" 실행되는 것처럼 구현할 수 있다. 예를 들어 우리는 현재 유튜브를 보면서 게임을 할 수 있다. 만약 동시성이 없다면 이런 것은 불가능 할 것이다. 이외의 입력 대기 중 다른 일을 하는 것 역시 동시성 개념 덕분에 가능하다.

※Parallel, Concurrency, asynchronous 등의 기법은 프로세스와 스레드를 이용하는 방식에 대한 것으로, 메모리 / CPU 선에서 설명하는 멀티 프로그래밍이나 멀티 프로세싱과는 서술하는 내용이 다르다.

'CS' 카테고리의 다른 글

[CS] DIP / IoC / DI  (0) 2023.10.23
[CS] 객체 지향  (0) 2023.10.18
[batch] cron 표현식  (0) 2023.08.23
[네트워크] HOL(Head Of Line) blocking  (0) 2023.08.03
[암호학] 서론  (0) 2022.09.16