본문 바로가기

스파르타코딩클럽

(OS) 프로세스? 쓰레드? 이게 뭐람

프로세스와 쓰레드.. 이름은 많이 들어봤는데 잘 모르겠다! 하는 분들을 위해 (나) 글을 작성하게 되었다.

일단 아래의 사진을 한번 보자

출처 : https://archwin.net/291
Mac OS 활성 상태 보기

위 사진은 윈도우10에서 작업관리자 사진이고, 아래의 사진은 Mac OS 의 활성 상태 보기 사진인데 둘다 동일하게 '프로세스' 가 있는걸 확인할 수 있고 Mac OS의 경우는 스레드도 바로 확인 가능하다. 

 

저거 그냥 내가 지금 쓰고 있는 프로그램 이름들 아니야?

정말 정답에 근접한 질문이다 :) 프로세스의 사전적 의미를 보면 아래와 같이 되어 있는 걸 확인할 수 있는데, 여기서 중요한 부분은 프로세스가 프로그램은 프로그램인데, '연속적'으로 실행되고 있는 부분이다.

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 말한다 (위키백과)

 

즉, 프로그램과 프로세스의 차이는 실행이 되고 있는가?의 차이라고 봐도 무방하다. 하드 디스크에 저장은 되어 있으나 실행되지 않은 정적(움직임이 없는 상태)인 코드뭉치들이 프로그램이고, 이 프로그램이 실행되어서 메모리에 올라와 cpu등을 할당받아서 동적으로 실행되고 있는 상태가 프로세스이다. 

 

그렇군... 어떻게 프로그램이 프로세스로 바뀌는 거지?

프로그램을 실행시키면 운영체제는 프로그램을 메모리에 적재하고, 이 프로세스에 대한 정보가 담겨져 있는 PCB (process control blcok)을 만들게 되는데 이 안에 프로세를 처리하는데 필요한 정보들이 담겨져 있다! 즉, 어떤 프로그램이 프로세스가 되었다는 말은 운영체제로 부터 PCB를 부여받았다고도 볼 수 있다 :) 참고로 이 PCB는 메모리 중에서도 유저가 접근 불가능한 영역에 있다.

어떠한 내용이 포함되었는지는 아래 주소를 참고

https://en.wikipedia.org/wiki/Process_control_block

출처 : https://binaryterms.com/process-control-block-pcb.html

 

프로세스의 상태

출처 :https://kyun2da.dev/CS/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C/

프로그램이 프로세스로 변환되서 종료될때 까지를 크게 5가지 상태로 나눌 수 있는데, 자세한 내용은 아래와 같다.

 

생성 : 프로세스가 메모리에 올라와서 실행준비를 완료한 상태, PCB가 생성됨.

준비 : 작업 순서가 될 때 까지 기다리는 상태. CPU를 할당받을 때까지 기다린다. 

실행 : CPU를 할당 받아서 실제로 작업을 실행하는 상태. 할당 시간을 다 사용하였는데 작업을 못 끝냇을 경우에는 Timeout이 발생하여 프로세스를 다시 준비 상태로 돌리고, 할당 시간 안에 작업을 다 처리했을 경우에는 종료 상태로 이동한다.

대기 : 실행 상태의  프로세스가 입출력을 요청했을 때 입출력이 완료될 때까지 기다리는 상태.

종료 : 작업을 다 마친 프로세스가 종료되어 다시 프로그램으로 돌아가는 상태. 메모리에서 사용한 데이터는 삭제하고 PCB 역시 폐기한다.

 

그렇군... 그러면 쓰레드는 뭐야?

쓰레드를 알기 전에 잠깐 위에 설명한 프로세스의 구조를 아래 사진으로 확인해보자.

출처 : https://kyun2da.dev/CS/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C/

위 사진과 같이 프로세스는 Code, Data, Stack, Heap 총 4개의 영역을 가지고 있는데, 각각의 역할은 아래와 같다.

  • 코드 영역(code area) : 프로그래머가 작성한 프로그램이 코드 영역에 작성된다
  • 데이터 영역(data area) : 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있다.
  • 스택 영역(stack area) : 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하거나 변수 사용 범위에 영향을 미치는 영역을 구현 할때 사용된다.
  • 힙 영역(heap area) : 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. ex) malloc

아니 그래서 쓰레드는 뭐냐구?

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. (위키백과)

위키백과에서 정의된 의미가 굉장히 어려운것 같지만, 그냥 쉽게 생각해서 쓰레드는 프로세스의 실행 단위라고 생각하면 편하다. 쓰레드의 특징으로는 하나의 프로세스를 구성하는 쓰레드들은 프로세스에 할당된 자원이나 메모리 등을 공유하고, 프로세스와 같이 실행, 준비, 대기 등의 상태를 가지며, 각 쓰레드별로 자신만의 스택과 레지스터를 가진다.

 

왜 자원을 공유한다면서 Stack만 분리해서 사용해?

LIFO (Last in First Out) 의 특징을 가지고 있는 스택의 특징과 연관이 있다. 코드 및 데이터, 힙을 공유하는 것은 문제가 되지 않으나 스택 영역은 선입선출의 특징상 스택이 쌓이게 되면 프로세스가 섞인 순서대로  더 복잡해지기 때문에 원활한 사용을 위해서 스택만 공유하지 않고 따로 사용하는 것이다.

 

아 그렇구나... 그런데 쓰레드는 왜 사용해? 프로세스 혼자서 다 할 수 있는거 아냐?

쓰레드를 사용하는 가장 큰 목적은 프로세스의 낭비 요소의 제거 및 작업의 유연성을 얻기 위해서라고 볼 수 있다.

프로세스로만 여러개를 사용하는 멀티프로세스의 경우 안전성은 높지만 (각각 독립적이기 때문에) 반대로 각각 독립된 메모리 영역을 가지고 있기 때문에 작업량이 많을 수록 오버헤드가 발생하게 되고 CPU를 사용하던 프로세스가 나가고 다른 프로세스를 할당받는 

문맥 교환 (Context Switching) 때문에 성능이 저하된다.

 

그럼 쓰레드가 짱이구만!

몰론 위에서 서술한것처럼 쓰레드는 프로세스의 자원을 공유하기 때문에 상호 통신이 프로세스에 비해서 아주 간편하고 (프로세스 간 통신은 IPC라 하여 복잡한 과정이 필요하다. https://doitnow-man.tistory.com/110 잘 정리되있는 블로그) 프로그램의 응답 시간이 단축되고, 시스템 자원 소모가 감소되고 처리률이 높아지는 등 많은 장점을 가지고 있지만 여러개의 쓰레드를 사용하는 멀티쓰레드의 경우에 잘못된 변수를 서로 공유하면서 오류가 발생할 수도 있고 (Thread Safe가 필수) 프로그램 디버깅이 어렵다는 단점이 존재한다.

 

참고글

https://devuna.tistory.com/21

 

[OS]프로세스(Process)와 스레드(Thread)의 차이/멀티 프로세스와 멀티 스레드의 개념 ,특징, 장단점

[OS] 프로세스(Process)와 스레드(Thread)의 차이/멀티 프로세스와 멀티 스레드의 개념 , 특징, 장단점 1. 프로세스(Process)와 스레드(Thread) 먼저, 프로세스(process) 란 무엇일까? 프로세스는 단순하게 말

devuna.tistory.com

 

https://kyun2da.dev/CS/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C/

 

https://velog.io/@chappi/OS%EB%8A%94-%ED%95%A0%EA%BB%80%EB%8D%B0-%ED%95%B5%EC%8B%AC%EB%A7%8C-%ED%95%A9%EB%8B%88%EB%8B%A4.-2%ED%8E%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

https://velog.io/@chappi/OS%EB%8A%94-%ED%95%A0%EA%BB%80%EB%8D%B0-%ED%95%B5%EC%8B%AC%EB%A7%8C-%ED%95%A9%EB%8B%88%EB%8B%A4.-2%ED%8E%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

OS는 할껀데 핵심만 합니다. 2편 프로세스와 프로그램

운영체제에서 프로세스는 하나의 작업 단위이다. 사용자가 더블 클릭하여 프로그램을 실행하면 그 프로그램은 프로세스가 된다.프로그램 : 하드디스크와 같은 저장장치에 보관되어 더블 클릭

velog.io

https://goodgid.github.io/What-is-Thread/

'스파르타코딩클럽' 카테고리의 다른 글

내일배움캠프 8주차 회고  (0) 2021.11.08
2021.11.03 TIL  (0) 2021.11.03
진짜 초보를 위한 CORS 정리  (0) 2021.11.01
BASE 개념 정리 (Ip, , routing, HTTP)  (2) 2021.10.30
클라우드 컴퓨팅 cloud computing  (0) 2021.10.27