지난 시간)
프로세스는 디스크에 존재하는 프로그램이 메모리에 올라가서 CPU를 할당 받은 실행 중인 프로그램을 의미
이 프로세스와 함께 다니는 것 = 쓰레드
쓰레드란?
어떤 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
프로세스가 CPU로부터 할당 받은 자원을 이용하는 실행의 단위이다.
🤔 실행의 단위?
하나의 일을 하는 단위를 말한다.
쓰레드가 생성되면 Stack 영역만 할당 받고 (= 공유하지 않는다.)
Data, Code, Heap 영역을 프로세스의 자원과 공유하게 된다.
🤔 쓰레드는 프로세스와 어떤 차이점을 가지고 있을까?
여러 개의 프로세스가 있을 때 각각의 프로세스는 독립적인 메모리 영역을 가진다.
반면에 쓰레드는 다른 쓰레드와 프로세스의 Stack을 제외한 Data, Code, Heap 영역을 공유한다.
프로세스와 쓰레드의 관계는 위의 사진을 통해서 확인할 수 있다.
하나의 프로세스가 생성될 때 메인 쓰레드도 같이 생성된다.
하나의 프로세스는 여러 개의 쓰레드로 구성되어 있는데 각각의 쓰레드는 프로세스가 하는 일의 일부를 맡아 수행한다.
이렇게 하나의 프로세스 내에서 여러 개의 쓰레드를 사용하는 것을 멀티 쓰레드라고 한다.
그렇다면 왜 여러 개의 프로세스를 만드는 것이 아니라 쓰레드를 여러개를 만드는 것일까?
멀티 프로세스와 멀티 쓰레드의 차이가 무엇일까?
멀티 프로세스
부모-자식 관계이지만 결국에는 각각의 독립된 메모리 영역을 가진다. fork를 통해 부모 프로세스를 복제한다.
프로세스 간의 통신을 위해서 IPC(Inter Process Communication : 세마포어, 큐, 공유메모리)를 사용해야 한다.
여러 개의 프로세스 중에서 하나가 죽어도 다른 프로세스에 영향을 미치지 않는다.
멀티 쓰레드
하나의 프로세스가 다수의 작업을 각각 쓰레드를 이용해서 동시에 실행할 수 있다.
윈도우, 리눅스 등의 많은 운영체제들이 멀티 프로세싱을 사용하고 있지만 멀티 쓰레딩을 기본적으로 사용한다.
🟢 멀티 프로세스를 사용하는 대신에 멀티 쓰레드를 사용하는 이유는 다음과 같다.
- 멀티 프로세스로 실행되는 작업을 멀티 쓰레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크기 때문이다.
- 쓰레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 쓰레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
🟠 멀티 쓰레드에서 주의할 점
여러개의 쓰레드가 프로세스의 자원(Code, Data, Heap)을 같이 사용하기 때문에 이 부분에 대해 적절한 제어가 필요하다.
예를 들어서, 내가 어떤 데이터를 조작하고 있는데, 그 도중에 다른 쓰레드가 이 데이터에 대해 접근한다면 이는 데이터에 대한 일관성에 문제가 생길 것이다. 이런 이유 때문에 여러 쓰레드가 접근하는 공유자원에 대해서는 동기화작업을 해주어야 한다.
커널 쓰레드 VS 유저 쓰레드
두가지 쓰레드의 가장 큰 차이는 쓰레드의 생성 주체이다.
커널 쓰레드
커널이 쓰레드 기능을 API 형태로 제공하며 생성된 쓰레드에 대해서 커널이 직접 관리한다.
실행을 하는데 있어서 각 쓰레드는 모두 대등하고 우선순위도 같으며 각각 같은 시간을 나눠 가진다.
만약 하나의 쓰레드가 I/O 작업이 되는 경우 스케줄러는 다른 쓰레드에게 실행의 우선순위를 넘겨준다.
커널이 직접 쓰레드를 관리하기 때문에 안정성과 다양한 기능을 제공하며 하나의 쓰레드가 I/O 작업을 하는 동안에도 다른 쓰레드를 사용하여 다른 작업을 진행할 수 있다. 또한 프로세스의 쓰레드들을 몇몇 프로세서에서 한꺼번에 디스패치 할 수 있기 때문에 멀티프로세서 환경에서 매우 빠르게 동작한다.
하지만, 유저모드에서 커널모드로 전환이 빈번하게 일어나기 때문에 성능에 악영향을 미친다.
유저 쓰레드
사용자가 직접 쓰레드 기능을 구현하여 라이브러리 형태로 제공된다.
여기서 커널은 단순히 프로세스만을 관리한다. 각각의 프로세스에 1/2 실행시간이 주어진다면 다시 프로세스 내부적으로 쓰레드에게 실행시간이 할당된다.
프로세스 A,B에 각각 1이라는 시간이 주어진다면, 프로세스A의 쓰레드A,B는 각각 1/2의 시간씩 받지만 프로세스B의 쓰레드C는 1의 시간을 가지게 된다. 또한 만약 쓰레드A가 I/O작업에 들어가는 경우 프로세스A는 block상태가 됩니다.
커널 쓰레드와는 다르게 모드 간의 전환이 없어 성능상의 이점을 가져오지만, 하나의 쓰레드가 I/O작업 처럼 blocking 되면 프로세스 전체가 blocking되는 문제가 생긴다.
'OS' 카테고리의 다른 글
[질문] 프로세스, 쓰레드 (0) | 2022.08.29 |
---|---|
시스템 콜과 인터럽트 (0) | 2022.08.29 |
프로세스 - 상태 (0) | 2022.08.29 |
프로세스 - 개념, 메모리 구조, 상태변화 (0) | 2022.08.29 |
운영체제란 무엇인가? (0) | 2022.08.22 |