[운영체제] 프로세스와 쓰레드
by 콰이엇프로세스와 쓰레드
📌 프로세스 (Process)
운영체제가 할당하는 프로그램의 자원 할당 단위
📌 쓰레드 (Thread)
프로세스 내 CPU의 실행 흐름의 단위
1. 프로세스의 문맥 (Context)
프로세스는 시분할 시스템으로 인해 시작 후 명령을 한 번에 수행하지 않고 인터럽트에 의해 짧은 시간 CPU를 할당 받으며 연산을 수행하고 뺏기는 과정을 반복하게 된다. 이때 CPU를 다시 할당 받아 명령의 수행을 재개할 때 이전까지 명령을 수행한 시점의 정확한 상태 재현이 필요하다. 이에 따라 현재 어디까지 명령을 수행했는지를 기억하는 프로세스의 현재 상태 정보인 프로세스 문맥(Context)을 가지게 된다.
프로세스 문맥은 크게 세 가지로 나눌 수 있다.
- 하드웨어 문맥 : CPU의 수행 상태를 나타내며 프로그램 카운터 값과 각종 레지스터에 저장하고 있는 값
- 프로세스의 주소 공간 : Stack, Heap, Data, Code
- 커널 상의 문맥 : 프로세스를 관리하기 위한 자료구조 (PCB, 커널 스택)
2. 프로세스의 상태
이때 각 프로세스는 현재 CPU 할당 여부에 대한 프로세스 상태를 가지게 된다.
- 실행 (Running) : 프로세스가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태
- 준비 (Ready) : 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만, CPU를 할당받지 못한 상태
- 봉쇄 (Blocked, wait, stop) : CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태
인터럽트에 따라 실행 프로세스 변경을 위해 현재 실행 중인 프로세스의 문맥을 저장하고 새 프로세스 문맥을 세팅하는 컨텍스트 스위칭(Context Switching, 문맥 교환) 과정이 발생하게 된다. 이때 CPU는 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장하고, 새롭게 얻는 프로세스의 상태를 PCB로부터 복원한다.
🧐 쓰레드의 탄생 배경
예를 들어, 웹 브라우저 같은 프로그램을 여러 개 실행시키는 경우를 생각해보자. 이때 동일한 웹 브라우저 프로그램이지만, 여러 개를 띄우면 각각의 프로세스의 문맥을 가지게 된다. 이걸 효율적으로 관리할 수 없을까?
여러 웹 브라우저를 띄우더라도 실행 파일이 같으므로 그 코드는 같을 것이다. 이렇게 되면 여러 카피가 같은 코드라도 각각의 메모리를 점유하여 사용하게 되어 대단히 비효율적으로 실행하게 된다. 이때, 쓰레드 개념을 도입하여 동일한 프로그램을 여러 개 띄우더라도 프로세스 하나만 실행할 수 있도록 만들게 되었다.
즉, 현재 CPU가 어느 코드를 실행하고 있는가에 대한 정보만 따로 두자!
✍🏻 쓰레드의 구성
- Program Counter (코드의 어느 부분을 실행하고 있는가)
- Register set (CPU가 연산을 위해 필요한 값)
- Stack space (Code의 어느 부분을 실행하며 쌓이는 함수 등)
즉, 같은 프로세스에 대한 쓰레드들은 주소 공간 중 Heap, Data, Code는 공유하고 Stack, 그리고 레지스터 값에 대해서만 각각 가지게 된다. 이때 같은 프로세스 내 쓰레드에 대한 컨텍스트 스위칭이 발생한다고 가정하자. 만약 프로세스 간 컨텍스트 스위칭이 발생한다면 각 주소 공간과 레지스터 값들에 대한 메모리 주소를 참조하는 데 부하가 발생하게 된다. 하지만 같은 프로세스 내 쓰레드에 대한 컨텍스트 스위칭이 발생한다면 공유하고 있는 주소 공간에 대해서는 변경이 필요없는 효율성을 가지게 된다. 이에 따라 프로세스 컨텍스트 스위칭보다 쓰레드 컨텍스트 스위칭이 더 효율적이므로 쓰레드 개념을 도입하게 되었다.
'컴퓨터과학 > 운영체제' 카테고리의 다른 글
[운영체제] 7. 메모리 관리 (0) | 2024.11.04 |
---|---|
[운영체제] 6. CPU 스케줄링 (0) | 2024.10.28 |
[운영체제] 컴퓨터 3계층 구조 (0) | 2024.10.22 |
[운영체제] 5. 프로세스 관리 (0) | 2024.10.22 |
[운영체제] 4. 프로그램의 구조와 실행 (0) | 2024.10.21 |
블로그의 정보
콰이엇의 개발기록
콰이엇