본문 바로가기

Computer Science/OS

[OS] Thread & Multithreading

반응형

1. Process vs Thread

 

- Process

 

프로세스는 실행 중인 프로그램을 의미한다.  프로세스에 대한 정보를 가지고 있는 Process Control Block에 의해 운영된다. 프로세스는 child process라고 불리는 다른 프로세스들을 생성할 수 있다. 프로세스는 제거되는데 더 많은 시간이 걸리며, 독립된 자원을 할당받기 때문에 다른 프로세스와 자원을 공유하지 않는다.

 

프로세스는 new, ready, running, waiting, terminated, suspended의 상태를 가진다.

 

- Thread

 

스레드는 프로세스의 일부분으로 프로세스에서 동작하는 실행 단위이다. 한 프로세스는 여러 스레드를 가질 수 있다.

 

스레드는 running, ready, blocked 3개의 상태를 가진다. 스레드는 프로세스보다 제거되는데 시간이 짧게 걸리지만 프로세스와 달리 독립적이지 않아서 다른 스레드와 자원을 공유한다.

 

 

2. Thread

 

스레드는 프로세스의 실행 단위로 한 프로세스 내에서 주소 공간이나 자원을 공유할 수 있다. 스레드는 thread ID, program counter, registry set, stack space를 속성으로 가진다. 같은 프로세스에서 동작하는 여러 스레드들은 코드, 데이터 섹션, 그 외의 파일이나 신호와 같은 운영체제 자원들을 공유하기 때문에 프로세스와 달리 독립적이지 못하다.

 

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.

 

- Stack

 

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이다. 스레드가 프로세스 안에서 실행되는 하나의 독립적인 실행 흐름이 되기위해서는 스택 메모리 공간이 독립적이어야 한다.

 

- PC register

 

PC (program counter) 값은 스레드가 instructions의 어디까지 수행하였는지를 나타낸다. 스레드는 CPU를 할당 받았다가 스케줄러에 의해 다시 선점 당할 수 있다. 그렇기 때문에 명령어를 연속적으로 수행하지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC register를 독립적으로 할당한다.

 

 

3. Multiprocessing vs Multithreading

 

- Multiprocessing

 

멀티 프로세싱은 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 처리 방식이다. 스레드와 달리 프로세스는 각각의 데이터 공간이 독립적이기 때문에 하나의 프로세스에 문제가 있어도 나머지 프로세스는 문제없이 실행될 수 있다.

 

하지만 context switching으로 인한 오버헤드가 발생하는 단점이 있다. 프로세스는 서로 독립적으로 작업을 수행하기 때문에 context switching 과정에서 캐쉬에 있는 데이터를 초기화하고 다시 캐쉬 정보를 불러와야 한다. 이 과정에서 많은 시간이 소모되는 오버헤드가 발생한다.

 

또한, 프로세스들은 메모리를 공유하지 않기 때문에 하나의 프로그램에 속해있지만 프로세스들 간의 변수를 공유할 수 없다.

 

- Multithreading

 

멀티 스레딩은 하나의 프로그램을 여러 개의 스레드로 구성하여 작업을 처리하는 방식이다. 웹 서버가 대표적인 멀티 스레딩 응용 프로그램이다.

 

멀티 스레딩을 사용하면 멀티 프로세스에 비해 메모리 공간과 시스템 자원 소모를 줄일 수 있다. 스레드 간의 통신이 필요한 경우 별도의 자원을 이용하는 것이 아니라 서로간에 공유하는 자원을 통해서 데이터를 주고받을 수 있다. 스택을 제외한 모든 메모리를 공유하기 때문에 전역 변수, 정적 변수 그리고 동적 할당에 의한 모든 데이터를 공유할 수 있다. 스레드의 context switching 또한 프로세스와 달리 캐시 메모리를 초기화 할 필요가 없기 때문에 더 빠르게 변경할 수 있다. 그리고 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들기 때문에 자원을 보다 효율적으로 관리, 사용할 수 있다.

 

하지만 자원을 공유하는 것이 문제를 일으키기도 한다. 간단하게 데이터를 주고받을 수 있는 반면에 서로 다른 스레드가 데이터와 힙 영역을 공유하면서 동시에 한 메모리에 접근하여 엉뚱한 값을 읽어오거나 수정할  수 있는 문제가 있다. 그렇기 때문에 멀티 스레딩 환경에서는 동기화 작업이 필요하다.

 

동기화 작업은 작업 처리 순서를 정하고 공유 자원에 대한 접근을 조작하는 것이다. 이때 잘 설계하지 못하면 병목현상이 발생하여 성능이 저하될 수 있다.

 

※ 동기화 관련 글: [OS] Process Synchronization: https://jammdev.tistory.com/115

 

반응형

'Computer Science > OS' 카테고리의 다른 글

[OS] Memory Management  (0) 2021.10.23
[OS] Process Synchronization  (0) 2021.10.22
[OS] CPU scheduling  (0) 2021.10.21
[OS] Process Scheduling  (0) 2021.10.21
[OS] Process Management  (0) 2021.10.20