본문 바로가기
IT

Process와 Thread

by 이농이능 2018. 2. 6.


프로세스와 스레드를 설명하기에 앞서서 먼저 차이점을 얘기해보자면,


프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 

스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.


라고 간단하게 설명할 수 있다. (출처 : https://brunch.co.kr/@kd4/3 )


프로세스는 실행될 때 운영체제로부터 processor 와 자원을 할당받는다. 스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에서 공유하면서 실행된다. 


하지만,,,

프로세스가 그래서 하는 일이 뭐고 스레드는 또 뭐야! 라는 답답한 마음에 프로세스가 하는 일이 무엇인지, 스레드가 왜 필요한지 정확한 이해를 위해서 프로세스와 스레드에 대해서 정리해보았다.


1. Process 란?

process 란 실행 중인 프로그램을 의미한다.

여기서 프로그램은 보조 기억장치(하드디스크, SSD)에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 프로세스가 된다. 



◈ 프로그램과 프로세스의 차이점

Program

Process

The multiplication statement prod=prod*i, is in program, but process executes it 10 times.

# 곱셈을 하는 prod = prod * i  코드는 프로그램에 있지만 프로세스는 이것을 1번 실행한다.

프로그램은 프로그래밍 언어로 된 명령어로 구성된다.

프로세스는 기계어로 된 명령어 실행으로 구성된다.

프로그램은 정적인 객체이다.

프로세스는 동적인 객체이다.

보조 기억 장치에 상주하고 있다.

메인 메모리에 상주한다.

지속되는 기간은 무제한

지속되는 기간은 제한적


◈ 멀티태스킹, 멀티프로세싱


과거와 달리 요즘 운영체제는 한 번에 여러가지 작업을 동시에 할 수 있다. 대표적인 운영체제로는 윈도우, 리눅스, 유닉스 등이 있는데 이러한 운영체제에서 여러개의 프로세스를 동시에 실행하는 것멀티태스킹이라고 하고 어떤 작업을 하나이상의 프로세스에서 병렬로 처리하는 것멀티프로세싱이라고 한다.


윈도우에서 ctrl+alt+delete 를 눌러서 작업관리자를 확인해 보면 많은 프로세스가 돌아가고 있는 것을 확인할 수 있다. 




하지만 이 많은 프로세스들이 엄밀히 말하자면 동시에 실행하고 있는 것이 아니다. 운영체제가 매우 빠르게 CPU가 실행할 프로세스를 교체하기 때문에 동시에 실행되는 것처럼 보이는 것이다. 운영체제는 이렇듯 사용자에게 동시에 여러개의 프로세스가 실행되고 있는 것처럼 보여주고 개발자는 이런 운영체제 덕분에 프로세스의 교체와 사용할 수 있는 CPU 자원에 대해서 신경쓰지 않고 프로그램 개발에 집중할 수 있다.



◈ 프로세스 특징 

프로세스는 프로그램 실행 시 Code, Data, Stack, heap의 구조로 되어있는 독립적인 메모리 영역을 할당 받는다. 하지만 이런 특징은 멀티프로세싱 방식에서 단점을 가지게 된다. 스케줄링 알고리즘에 의해서 CPU에서 여러 프로세스를 처리하게 되는데 동작중인 프로세스가 다른 프로세스를 실행할 차례가 됐을 때 동작중인 프로세스의 상태(Context)를 보관하고 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 자신의 상태를 보관했던 것을 복구하게 된다. 

이러한 일련의 과정을 Context Switching이라고 하는데, 번역하면 문맥교환이라고 한다. 무튼 이런 Context Switching은 프로세스가 각각 독립된 메모리 영역이다보니 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 오버헤드가 발생하게 된다. 하지만 멀티테스킹을 위해서는 필수적인 부분이라 할 수 있다.


◈ Context Switching


     

  • context switching은 새로운 프로세스를 시작해야할 때  실행되고 있는 프로세스의 현재 상태를 저장하는 절차를 의미한다.
  • 프로세스의 context는 프로세스의 PCB에 표시된다. PCB에는 CPU 레지스터의 값, 프로세스 상태 및 메모리 관리 정보를 포함하고 있다.
  • context switch가 일어나면, 실행되고 있던 프로세스의 내용을 PCB에 저장하고 새로운 프로세스의 저장되어있던 context를 불러와 실행한다.
  • context switch 시간은 하드웨어에 지원에 따라 크게 달라지며 따라서 시스템마다 다르다.
  • context switch가 일어날 동안 작업이 수행되지 않기 때문에 순수한 오버헤드이다.





◈ Process Control Block, PCB


프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block) 또는 프로세스 기술자(process descriptor)라고 불리는 자료구조에 저장된다. 


< PCB 의 구조 >


pid : 운영체제가 각 프로세스를 식별하기 위해 부여된 식별번호


state : 프로세스가 실행중인지 아니면 대기 중인지의 상태를 저장


pointer : 다음 프로세스의 PCB를 가리킨다.


priority :  프로세스가 실행되는 순서를 정할 때 필요한 것으로 우선순위가 높을 경우 먼저 실행된다. 


Program counter : CPU가 다음으로 실행할 명령어 가리키는 값. 다음으로 실행할 기계어가 저장된 메모리 주소를 가리킨다.


cpu register : 프로세스 내에서 자료를 보관하는 아주 빠른 기억 장소. accumulator, stack pointer, index register가 포함된다.


I/O information : 입출력 장치들과 파일 등 입출력 관련한 정보를 가지고 있다.


Accounting information :  CPU 활용 및 프로세스의 실행 시간과 관련된 세부 정보를 저장한다.







◈ 프로세스의 상태


운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야하는데 이를 위해서 운영체제는 프로세스의 상태를 상태전이(state transition)을 통해서 체계적으로 관리한다. 



* New : 프로세스가 생성됨.

* Running : 프로세스의 명령어들이 프로세서에 의해서 실행되는 중

* Waiting : 프로세스가 이벤트가 일어나기를 기다리는 상태

* Ready : 프로세스가 할당되기 위한 준비가 된 상태

* Terminated : 프로세스가 실행 완료된 상태




2. Thread 란?


스레드란 프로세스 내에서 실행되는 여러 흐름의 단위 이다.  기본적으로 프로세스당 최초 1개의 스레드를 가지고 있고 그것을 메인 스레드라고 한다. 스레드를 1개 이상 가질 수 있으며 멀티스레드라고 한다. 스레드는 병렬 처리를 통해서 응용 프로그램의 성능을 향상시키는 데 사용된다. 

 CPU는 스레드가 병렬로 실행되고 있다는 환상을 줄 정도로 빠르게 전환하게 된다. 각 스레드는 프로세스 실행을 위한 독립적인 자원을 가지므로 멀티 스레드 프로세스는 스레드 수를 늘려서 병렬로 실행할 수 있다. 물론 프로세스는 일 처리를 위해서 자식 프로세스를 생성하여 처리할 수도 있지만 자원의 공유와 비용의 문제가 있기 때문에 이 비용을 줄이고 자원 공유를 쉽게 하기 위해서 thread 라는 개념을 도입하게 되었다.


Thread의 장점을 정리해보자면, 

1. 응답성이 좋다. 

멀티 스레드 프로그램은 일부가 block이 되어도 나머지는 계속 실행할 수 있다.

2. 자원을 공유할 수 있다. 

같은 프로세스의 스레드는 자원을 공유할 수 있다. 프로세스간 통신(ex.pipe)과 같이 복잡한 과정을 거치지 않고 보다 효율적인 일처리가 가능하다는 것을 의미한다.

3. 경제성이 좋다.

프로세스마다 메모리와 자원을 할당하면 오버헤드가 발생하는데, 스레드를 사용하게 되면 비용이 저렴해지고 context switch가 용이해진다. 컨텍스트 스위칭(Context Switching) 시에 공유 메모리 만큼의 시간(자원) 손실이 줄어든다 : 프로세스 간의 컨텍스트 스위칭시 단순히 CPU 레지스터 교체 뿐만이 아니라 RAM과 CPU사이의 캐쉬메모리에 대한 데이터 까지 초기화 되므로 상당한 부담이 발생한다.


Multi Thread 멀티스레드

하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동시킬 수 있다.




프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하는데 비해 스레드는 다른 스레드와 공간과 자원을 공유하여 사용한다. 스레드는 프로세스 내에서 각각의 스택 공간을 제외한 나머지 공간과 시스템 자원을 공유한다.그러므로 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간은 물론 시스템 자원 소모도 현격히 줄어든다. 이와 같이 프로세스를 생성하는 것보다 스레드를 생성하는 것이 효율적이다. 






출처

http://www.codequiz.in/os-process-management/

http://bowbowbow.tistory.com/16

https://brunch.co.kr/@kd4/

https://magi82.github.io/process-thread/

http://ralf79.tistory.com/34

http://you9010.tistory.com/entry/멀티-프로세스Multi-Process와-멀티-스레드Multi-Thread

http://boanin.tistory.com/84

'IT' 카테고리의 다른 글

[2018_03_27] 찾아본 것  (0) 2018.03.27
json  (0) 2018.03.21
awk 명령어  (0) 2018.03.08
python에서의 thread 동시성 문제 (feat. GIL, Global Interpreter Lock )  (0) 2018.02.08
무료로 사용하기 좋은 웹 컴파일러와 개발환경  (0) 2018.02.05