개발일지

프로세스와 스레드 본문

CS, WEB

프로세스와 스레드

lyjin 2024. 2. 28.

프로세스 (Process)

프로세스는 “실행 중인 프로그램”이라고 불린다.

 

프로그램은 무엇일까? 우리가 사용하는 카카오톡, 크롬, 워드 모두를 프로그램이라고 볼 수 있다. 우리는 카카오톡을 사용하기위해 바탕화면에 있는 아이콘을 더블클릭하여 실행시킬 것이다. 이때 카카오톡 그 자체를 프로그램, 더블클릭하여 실행된 상태를 프로세스라고 볼 수 있다.

 

다시말해 프로그램은 하드디스크에 존재하다가 실행 시키는 순간 메모리로 적재되고 “프로그램이 메모리에 적재된 상태”를 프로세스라고 부른다.



작업 관리자에 들어가면 프로세스를 직접 확인해볼 수 있다.

 



보통 프로세스 하나만 실행시키는 사람은 없을 것이다. 인터넷도 하다가 카카오톡도 하다가 동시에 음악을 듣기도 한다. “동시에”라고 표현하기는 했지만 실제 동시에 실행되는 것은 아니다. 여러 개의 프로세스가 CPU를 번갈아 사용하면서 동시에 실행되는 것처럼 보일 뿐이다. (동시성, concurrency)



프로세서 제어 블록 (Process Control Block, PCB)

프로세스가 실행되려면 CPU가 필요한데 CPU 자원은 한정되어있다. 따라서 프로세스들은 순서대로 돌아가며 CPU를 사용하게 된다. OS는 프로세서 제어 블록(PCB)를 사용하여 이 프로세스들의 순서를 관리하고 자원을 적절히 배분한다.

 

PCB는 프로세스 정보를 저장하는 자료구조이다. 담기는 정보로는 프로세스 ID(Process ID, PID), 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보 등이 있다. 프로세스 상태와 CPU 스케줄링은 따로 다룰 내용이 많은 주제이지만 여기서는 생략하고 넘어가겠다.

 

PCB는 OS 커널에서 관리된다. 프로세스 생성 시 만들어지고 종료될 때 폐기된다. 다시 말해 “프로세스가 생성되었다”는 “OS가 PCB를 생성했다”와 같고 반대로 “프로세스가 종료되었다”는 “OS가 PCB를 폐기했다”와 같다.



문맥 교환 (Context switching)

A, B프로세스가 A,B,A .. 순으로 실행된다고 가정해보자. B가 종료되고 다시 A가 실행될 때 CPU는 이전 A가 하던 작업을 이어서 하게 된다. 이 작업이 가능한 이유는 OS가 프로세스를 교체할 때마다 실행 중이던 프로세스의 정보를 어딘가에 백업하고 이후 이어서 실행할 때 백업된 정보를 불러와 작업을 재개하기 때문이다. 이 백업 정보를 바로 문맥(context)라고 하며 문맥은 주로 PCB에 저장된다.

 

이처럼 CPU에 할당된 프로세스를 교체하기 위해 실행 중이던 프로세스 문맥을 백업하고 실행시킬 프로세스 문맥을 PCB로부터 가져오는 과정을 문맥교환(context switching)이라고 한다.

 

앞서 동시성을 설명하면서 “여러 개의 프로세스가 CPU를 번갈아 사용한다”고 했었다. 즉 동시성은 이 문맥교환이 매우 빠르게 수행되기에 가능한 것이다. 하지만 지나치게 빈번한 문맥교환은 오버헤드를 초래하기 때문에 주의가 필요한다.



 

프로세스의 메모리 영역

프로세스는 “프로그램이 메모리에 적재된 상태”이다. 메모리는 커널 영역과 사용자 영역으로 나뉘고 커널 영역에는 PCB가 저장된다고 했다. 그렇다면 사용자 영역에는 프로세스가 어떻게 할당될까?

 

프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 스택 영역, 힙 영역으로 나뉘어서 저장된다. 코드 영역과 데이터 영역은 프로그램 실행할 때 그 크기가 결정되기 때문에 정적 할당 영역이라고 부르고, 크기가 변할 수 있는 스택, 힙 영역은 동적 할당 영역이라고 부른다.





코드 영역 (Code segment/Text segment)

  • 프로그램 실행 코드, 즉 기계어로 이루어진 명령어가 저장되는 영역이다. CPU는 이 명령어를 순차적으로 실행한다.
  • 프로그램이 메모리에 할당될 때 Read-Only 영역으로 처리된다.



데이터 영역 (Data segment)

  • 전역(global) 변수와 정적(static) 변수가 저장되는 영역이다.
  • 프로그램이 실행될 떄 생성되고 종료될 때 소멸한다.



스택 영역 (Stack segment)

  • 지역(local) 변수와 함수 호출이 저장되는 영역이다.
  • 함수 호출 시에 함수 정보와 지역 변수가 저장 되고(push) 종료될 때 제거된다(pop).



힙 영역 (Heap segment)

  • 사용자가 직접 할당 및 해제할 수 있는 영역이다. 주로 객체나 동적으로 생성된 데이터(ex. 동적 배열)가 저장된다.
  • +) 할당한 메모리를 명시적으로 해제 해주지 않으면 메모리 누수가 발생한다. java, node.js 등 몇몇 언어에서는 자동으로 메모리를 해제하는 가비지 컬렉션 기능이 제공된다.




스레드 (Thread)

스레드의 사전적 의미는 “실행 흐름 단위”이다. 하지만 기준이 CPU냐 프로그램이냐에 따라 개념이 달라지기 때문에 더 면밀히 짚고넘어가야할 필요가 있다.




하드웨어적 스레드와 소프트웨어적 스레드

하드웨어적 스레드는 물리적인 코어에서 지원하는 스레드이다. 다시 말해 “하나의 코어가 동시에 처리하는 명령어 단위”를 말한다. 예를 들어 2코어 4스레드 CPU는총 2개의 물리적인 코어를 가지고 있으며, 각 코어 당 2개의 스레드를 처리할 수 있는 CPU를 의미한다. 이처럼 한 코어가 여러 스레드를 다루는 CPU를 멀티스레드 프로세서라고 한다.

 

소프트웨어적 스레드는 “한 프로세스에서 독립적으로 실행되는 흐름 단위”를 말한다. 초기 프로세스는 한 번에 하나의 일만 처리할 수 있었다. 하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 여러 개의 일을 동시에 처리할 수 있게 된 것이다. 이를 멀티스레드 프로세스라고 한다.

 

즉 멀티스레드 프로세서와 멀티스레드 프로세스 한 끝 차이지만 서로 다른 범주의 멀티스레드를 나타내고 있는 것이다. OS에서 보편적으로 말하는 멀티스레드는 소프트웨어적 스레드를 의미한다.




스레드의 자원공유

프로세스 정보를 관리하기 위해 PCB를 사용했던 것처럼 스레드도 스레드 제어 블록(Thread Control Block, TCB)에 스레드 정보를 저장한다. 저장되는 정보로는 스레드 ID, 레지스터 값, 스택(포인터) 등이 있다.

 

여기서 중요한 점은 스레드들은 실행하는데 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유한다는 점이다. 프로세스의 네 가지 영역 코드, 데이터, 스택 힙 영역 중 스택을 제외한 나머지 영역을 공유한다는 의미이다. 멀티 스레드를 그림으로 나타내면 다음과 같다.





참고로 프로세스는 스레드와 달리 독립적으로 실행되며 기본적으로 자원을 공유하지 않는다. 따라서 여러 프로세스를 다룬다는 것은 각각의 독립적인 개체가 여러 개 실행된다는 의미이다.






멀티 프로세스 vs. 멀티 스레드

멀티 프로세스는 동시에 여러 프로세스를 처리하는 것, 멀티 스레드는 한 프로세스 내에서 여러 개의 스레드를 처리하는 것을 말한다. 결국은 멀티 프로세스와 멀티 스레드 모두 여러 개의 일을 동시에 처리한다는 점에서 유사해보이지만 이 둘은 큰 차이가 있다.



자원 공유 및 통신

  • 프로세스는 독립적인 실행 단위로 서로 자원을 공유하지않는다. 만약 프로세스 간 통신이 필요한 경우에는 공유 메모리와 같은 별도의 IPC(Inter Process Communication) 기법이 필요하다. 하지만 멀티 스레드는 한 프로세스 내에서 실행되기 때문에 동일한 메모리 자원을 공유한다. 따라서 스레드 간 통신이 프로세스 간 통신보다 훨씬 간단하고 효율적이다.



생성 및 소멸 비용

  • 프로세스는 생성될 때마다 새로운 메모리 공간을 할당받아야하기 때문에 생성하고 소멸하는 비용이 크다. 그러나 스레드는 이미 할당된 자원을 공유하기 때문에 추가적인 자원 할당을 필요로하지 않는다.



독립성

  • 멀티 프로세스는 독립적이기 때문에 한 프로세스에 문제가 발생하더라도 다른 프로세스에 영향을 주지않는다. 그러나 멀티 스레드는 동일한 프로세스 내에 존재하기 때문에 한 스레드에 문제가 발생했을 때 다른 스레드 혹은 전체 프로세스에 영향을 미칠 수 있다.
  • 여러 스레드가 동시에 동일한 공유 자원을 사용하려고 한다면 문제가 발생할 것이다. 이러한 문제를 예방하기 위해서 스레드는 별도의 동기화(synchronization) 작업이 필요하다.



중요한 포인트는 멀티 프로레스와 달리 “멀티 스레드는 자원을 공유한다”는 점이다. 자원을 공유한다는게 마냥 장점처럼 느껴질 수도 있지만 비교적 안전성 문제가 있기 때문에 목적에 맞게 사용하는 것이 중요하다.

 

 


참고

🔗👩‍💻-프로세스-⚔️-쓰레드-차이
🔗 혼자 공부하는 컴퓨터 구조+운영체제

 

 

'CS, WEB' 카테고리의 다른 글

쿠키 vs. 세션 스토리지 vs. 로컬 스토리지  (0) 2024.09.07
DNS(Domain Name System) 알아보기  (0) 2024.08.24
로드밸런싱이란?  (0) 2024.02.07
OAuth 2.0 알아보기  (0) 2022.12.12
PASETO (Platform-Agnostic SEcurity TOkens)  (0) 2022.11.25