※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 반드시 댓글로 알려주세요!
스레드란 프로세스의 '실행 흐름'을 의미한다. 한 프로세스는 여러 개의 스레드를 가질 수 있으며, 스레드들은 프로세스의 특정 메모리 영역을 공유한다는 특징이 있다. 본격적으로 스레드를 살펴보기 전에 프로세스에 대해 간략히 알아보자.
[ 1 ] 프로세스란?
프로세스는 '메모리에 올라 실행 중인 프로그램'을 의미한다. 우리가 흔히 아는 프로그램은 executable 파일의 형태로 보조 저장 장치에 저장되어 있으며, 사용자의 클릭이나 명령어를 통해 실제로 실행할 수 있다.
운영체제는 실행 중인 프로그램들을 원활하게 CPU 스케줄링 하기 위해, 실행 중인 프로그램들이 메모리에서 소유하고 있는 자원을 보호(protection domain 이라 함)하기 위해 프로그램을 실행할 때 '프로세스'라고 불리는 인스턴스로 추상화한다. 하나의 프로그램은 여러 개의 프로세스로 실행될 수 있으며 같은 프로그램의 프로세스일지라도 독립적인 주소 공간을 갖는다.
각 프로세스는 자신만의 주소 공간을 가지며, 프로세스의 주소 공간은 프로그램의 코드가 저장되는 '코드', 전역변수와 정적변수가 저장되는 '데이터', 동적 할당과 관련된 '힙', 지역변수와 매개변수가 저장되는 '스택' 영역으로 구성된다. 이러한 프로세스는 '스레드'라고 불리는 실행 흐름을 가지게 되며, 프로세스는 1개 이상의 스레드를 가지도록 설계될 수 있다.
[ 2 ] 스레드란?
스레드란 위에서도 언급했듯이 프로세스의 '실행 흐름'이다. 프로세스는 하나 이상의 스레드를 가질 수 있으며, 스레드들을 병렬 실행할 수 있다는 장점이 있다. 하지만, 한 프로그램은 여러 개의 프로세스로 실행될 수 있는데, 굳이 하나의 프로세스 내부에 여러 개의 스레드를 두는 이유가 뭘까?
첫 번째 장점은 Context Switching 비용 절감이다. 하나의 프로세스는 자신만의 주소 공간을 갖기 때문에 Context Switching 을 할 때마다 PCB에 저장하고 로드해야 할 정보의 양이 (스레드보다 상대적으로) 많다.
위 그림에서 볼 수 있듯이 각 스레드는 프로세스의 코드, 데이터, 힙, 파일 영역은 공유하고, 자신만의 레지스터와 stack, 그리고 program counter 를 가진다. 메모리를 공유한다는 점에서 Context Switching 시 TCB에 저장하고 로드해야 할 정보의 양이 (프로세스보다 상대적으로) 적다.
두 번째 장점으로는 프로그램의 응답성을 높일 수 있다. 프로세스의 특정 로직을 담당하는 스레드가 block 되거나 시간이 걸리는 작업을 하더라도, 다른 스레드들은 실행되고 있기 때문에 유저는 해당 프로그램이 interactive 하다고 느낄 수 있다.
세 번째 장점은 멀티 프로세스에서 발생하는 IPC로 인한 비용 절감이다. 한 프로그램을 여러 개의 프로세스로 실행하게 되면 각 프로세스는 자신만의 주소 공간을 갖기 때문에 프로세스 간 통신을 하기 위해서는 IPC 를 해야 한다. 하지만, IPC는 반드시 커널을 거쳐야 하는 작업이기에 오버헤드가 발생할 수 있으며 멀티 스레드는 이러한 문제를 해결할 수 있다. 한 프로세스 내의 스레드들은 메모리를 공유하기에 IPC 를 하지 않아도 되기 때문이다.
물론 단점도 존재한다. 멀티 프로세스 환경에서는 각 프로세스가 고유한 주소 공간을 갖기 때문에 한 프로세스가 비정상적으로 종료되어도 다른 프로세스는 그에 대한 영향을 받지 않는다. 하지만, 멀티 스레드 환경에서는 스레드들이 메모리를 공유하기 때문에 한 스레드가 비정상적으로 종료되면 전체 스레드에 영향을 미칠 수도 있다. 따라서 환경에 적합한 프로그래밍 기법을 선택해야 할 것이다.
[ 3 ] Concurrency vs Parallelism
병렬처리와 관련하여 Concurrency와 Parallelism을 구분해야 한다.
싱글 코어에서는 결국 하나의 프로세스, 스레드 만이 한 시점에서 실행될 수 있다. 즉, 진정한 '병렬처리'를 수행할 수 없는 것이다. 하지만, Time Sharing 등의 스케줄링 기법으로 싱글 코어 환경에서도 마치 여러 프로세스나 스레드를 동시에 처리하는 illusion 을 제공할 수 있으며 이를 Concurrency 라고 한다.
즉, 동시에 여러 프로세스나 스레드가 실행되고 있는 것은 아니지만, 한 시점에 여러 프로세스가 '실행 상태'에 있음을 의미한다.
이와 달리, Parallelism은 한 시점에 여러 프로세스나 스레드가 동시에 실행될 수 있는 것이며 멀티 코어에서는 해당 환경을 사용자에게 제공할 수 있다.
Parallelism에는 Data Parallelism과 Task Parallelism이 있다.
1) Data Parallelism : 다른 데이터에 같은 연산을 수행하는 병렬 처리이다. 예를 들어, 하나의 코어에서는 5에 대한 제곱 연산을 수행하고 다른 코어에서는 9에 대한 제곱 연산을 수행하는 것을 Data Parallelism 이라 할 수 있다.
2) Task Parallelism : 같은 데이터에 다른 연산을 수행하는 병렬 처리이다. 예를 들어, 한 반의 성적 데이터에 대해 하나의 코어에서는 평균을 계산하고, 다른 코어에서는 분산을 계산하는 것을 Task Parallelism 이라 할 수 있다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제 OS] Monolithic kernel, Micro kernel (1) | 2023.05.08 |
---|---|
[운영체제 OS] 운영체제의 역사 - Mainframe, Spooling, Multiprogramming, Timesharing (1) | 2023.04.18 |
[운영체제 OS] system call 및 호출 루틴 (1) | 2023.04.16 |
[운영체제 OS] 운영체제란? (1) | 2023.04.16 |