프로젝트를 진행하면서 OS에 대해 접하게 되었습니다. OS는 하드웨어의 자원을 이용하여 소프트웨어를 실행하게 도와주는 역할을 하는데 이러한 작업의 단위인 프로세스와 실행의 단위인 쓰레드에 대해 정리하기 위해 이 글을 작성하게 되었습니다!
프로세스란 OS로부터 자원을 할당받는 작업의 단위를 뜻합니다. 프로세스는 실행될 때 OS로부터 프로세서, 필요한 주소 공간, 메모리 등의 자원을 할당받게 됩니다.
쓰레드란 프로세스가 할당받은 자원을 이용하는 실행의 단위를 뜻합니다. 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 쓰레드끼리 공유하면서 실행됩니다. 프로그램 카운터와 스택 포인터 등을 비롯한 쓰레드 실행 환경 정보(Context 정보), 지역 데이터, 스택을 독립적으로 가지면서 코드, 전역 데이터, 힙을 같은 프로세스의 다른 쓰레드와 공유하게 됩니다.
프로그램 카운터 : 프로세서 내부에 있는 레지스터 중의 하나로서, 다음에 실행될 명령어의 주소를 가지고 있기 때문에 명령어 포인터라고도 함
스택 포인터 : 중앙처리 장치 안에는 스택에 데이터가 채워진 위치를 가리키는 레지스터인 스택 포인터를 갖고있음
쓰레드는 OS가 한정된 시스템 자원을 효율적으로 관리하기 위해 사용합니다. 멀티 프로세스로 실행되는 작업을 멀티 쓰레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리하는 것이 가능해집니다. 또한 프로세스 간의 통신보다 쓰레드 간의 통신 비용이 적으므로 작업들 간의 통신 부담이 줄어들게 됩니다. 프로세스의 자원과 메모리가 공유 가능하다는 장점도 있습니다.
하지만 쓰레드 간의 자원 공유는 전역 변수를 이용하기 때문에 동기화 문제와 교착상태(deadlock)과 같은 문제가 발생할 수 있습니다.
교착상태 : 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생함
자세히 설명하자면 다중 쓰레드는 프로그램 하나를 여러 실행 단위로 쪼개어 실행한다는 측면에서 다중 처리(다중 프로세싱)과 의미가 비슷합니다. 하지만 동일 프로세스의 쓰레드는 자원을 공유하므로 자원 생성과 관리의 중복성을 최소화하여 실행 능력을 향상시킬 수 있죠. 그리고 각 쓰레드는 커널(메모리에 상주하는 운영체제의 부분)이 개입하지 않고도 독립적으로 실행할 수 있어 서버에서 많은 요청을 효과적으로 처리할 수 있습니다.
이러한 쓰레드의 특성 때문에 프로세스보다 쓰레드를 생성하는 것이 더 빠르고, 동일한 프로세스에 있는 쓰레드 간의 교환이나 쓰레드의 종료도 훨씬 빠르게 가능합니다.
해당 프로세스가 스택과 레지스터를 직접 해당 프로세스의 쓰레드에게 제공하기 때문에 프로세스의 생성과 종료보다 오버헤드 또한 훨씬 적습니다.
쓰레드 한개가 대기 상태로 변할 때 전체 프로세스를 대기 상태로 바꾸지 않는 것이 장점이기도 하죠(실행 상태의 쓰레드가 대기상태가 되면 다른 쓰레드 실행 가능).
반면 프로세스는 독립적인 단위이기 때문에 프로세스 간에 서로 데이터를 주고받기 위해서는 IPC(커널이 제공하는 내부 프로세스간 통신)라는 메커니즘이 필요하기 때문에 쓰레드에 비해 통신 부담이 클 수 밖에 없습니다.
PCB(Process Control Block) : Process는 자신에 관한 정보를 하나의 데이터 구조에 저장하여 관리하고 이를 PCB라 통칭합니다.
TCB(Thread Control Block) : 하나의 Thread를 관리하는데 필요한 정보를 담고 있는 구조체입니다. Thread사이의 context switching & process사이의 context switching을 할 때 CPU Scheduling을 하는 최소단위이기도 합니다. TCB는 아래와 같은 정보를 포함합니다
1. Thread Identifier : 쓰레드를 구분하는 유일한 식별자
2. Stack Pointer : 쓰레드 별로 고유한 Stack의 pointer
3. Program Counter: 현재 instruction의 주소
4. 쓰레드의 상태(running,ready,waiting,start,done)
5. Thread's register values
6. 쓰레드가 소속된 processor의 PCB주소
오늘은 프로세스와 쓰레드에 관해 알아보았습니다. 프로세스는 OS가 시스템 자원을 할당해주는 작업의 단위이고 쓰레드는 그 작업의 실행 단위라고 볼 수 있습니다. 쓰레드는 프로세스 내에 여러개가 존재 가능하며 프로세스의 자원을 공유, 상대적으로 적은 쓰레드 간의 통신 비용, 쓰레드 생성/종료 시의 적은 오버헤드 등으로 자원을 효율적으로 사용할 수 있지만 동기화, 교착상태 등의 문제점을 고려해야합니다.
참고자료:https://popcorntree.tistory.com/62
https://velog.io/@curiosity806/Context-Switching%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-process%EC%99%80-thread