티스토리 뷰

📌 단일 스레드와 멀티 스레드

 

1. 스레드 (Thread)

- CPU 활용의 기본 단위. 

- 프로세스 내에서 프로그램 명령을 실행하는 기본 단위

- 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성. 

- 같은 프로세스에 속한 다른 스레드와 코드, 데이터 세션, open files 등의 운영체제 자원을 공유. 

 

 

 

2. 단일 스레드 (Single Thread)

- 프로세스 내에 제어 스레드가 1개. 

- 1개의 레지스터, 1개의 스택. 

 

[ 장점 ] 

- 자원을 공용화하지 않으므로 공용 자원 접근 통제가 불필요하다. 

- 콘텍스트 스위칭 작업 불필요하다. (순수한 오버헤드가 불필요)

 

[ 단점 ] 

- 다수개의 CPU 활용이 불가능하다. 

ex. 워드 프로세스 작업할 때 키보드작업하거나 문법 체크하거나 모두 스레드 처리인데, 단일이면 한번에 처리가 안되니까 불편해짐 

 

 

3. 멀티 스레드 (Multi Thread)

- 프로그램을 다수의 실행 단위로 나누어 실행.

- 각각의 스레드가 고유의 레지스터와 스택으로 표현. 

 

왜? 여러개의 프로세스를 만들지 않고 멀티 스레드 방식을 쓰나?

- 프로세스 여러개 만드는게 시간이 오래걸리는 작업임.

- 그래서 경제성 측면으로 자신이 속한 프로세스의 자원들을 공유하여 멀티 스레드 방식을 하는게 더 효율적임.

- 또한 여러개 프로세스를 공유하는 것보다 메모리 공간을 절약시킬 수 있음. 

 

[ 장점 ]

- 대응적인 측면 : 일부가 차단되거나 장시간 작업 수행시에도 계속 작업이 가능함. 

- 자원 공유성 : 프로세스의 자원과 상태를 공유. 효율적인 운영

- 경제성 : 자신이 속한 프로세스의 자원을 공유하기 때문에, 스레드를 만들고 콘텍스트 스위칭을 진행하는 것이 더 경제적. 

- 확장성 : 다수개의 코어에서 병렬로 프로세스를 실행. 

 

 

4. 유저 스레드와 커널 스레드

 

 

  유저 스레드 커널 스레드
특징 - 커널의 별도 지원 없이 커널 위에서 동작 
- 스레드 라이브러리에
스레드 생성, 파괴를 위한,
메시지, 데이터 전달을 위한,
스레드 문맥 저장, 복구를 위한 코드가 포함됨.  
- 운영체제로부터 직접 지원과 관리를 받음
장점 - 스레드 스위칭에서 커널 모드 변환 필요 X
- 어느 운영체제에서나 사용이 가능. 
- 빠르게 생성 및 관리 가능
- 동일한 프로세스의 여러 스레드를 서로 다른 프로세스에 예약이 가능.
- 프로세스의 한 스레드가 차단되면 커널은 다른 스레드를 예약함. 
단점 - 한 유저 스레드가 차단 수행시 전체 프로세스가 차단됨.
- OS가 자동으로 해주는 일이 아니라서
멀티프로세싱 이점 가질 수 없음. 
- 커널 모드의 전환은 프로세스에서
한 스레드 -> 다른 스레드 제어 전환이 필요. 
- 유저 스레드에 비해 수백배 느림. 

 

 

5. 어떻게 해야 둘을 효율적으로 혼합해서 사용할까?

 

 

1) 다대일 모델 (Many - to - One)

 

- 다수의 유저 스레드가 하나의 커널 스레드와 맵핑. 

- 한번에 하나의 스레드만 커널에 엑세스 할 수 있으므로 멀티 스레드는 멀티코어 시스템에서 병렬로 실행할 수 없다. 

- 하나의 스레드가 커널에 시스템 호출을 하면 나머지 스레드들은 대기해야 하기 때문에 진정한 의미의 동시성을 지원하지 못함. 다시 말해, 여러 개의 스레드가 동시에 시스템 호출을 사용할 수 없다.

 

 

 

 

2) 일대일 모델 (One - to - One)

- 각각의 유저 스레드를 커널 스레드와 맵핑. 

- 더 많은 병렬성, 그러나 사용자 수준 스레드 생성시에도 커널 스레드 생성이 필요함.

- 윈도우, 리눅스에서 사용

 

 

 

3) 다대다 모델 (Many - to - Many) 

- 많은 유저 레벨 스레드를 더 작거나 같은 수의 커널 스레드와 맵핑. 

- 개발자는 필요한 만큼 유저 스레드 생성 가능하다. 

- 다-대-일 방식에서 스레드가 시스템 호출시 다른 스레드가 중단되는 현상과 일-대-일 방식에서 사용할 스레드의 수에 대해 고민하지 않아도 됨.

- 커널이 사용자 스레드와 커널 스레드의 매핑을 적절하게 조절한다. 

 

 

 

 

 


📌 스레드 풀

 

 

스레드 풀 (Thread Pool)

- 지정된 개수의 스레드를 미리 생성해두고 필요시 꺼내어 쓰는 방식.

- 요청이 폭증해도 성능을 유지함.

- 대량 작업 처리에서 반드시 고려 필요.

 

 

장점 

- 급격한 성능 저하 방지

- 동시 사용자 증가시에도 대응 가능

- 이전 스레드 재사용 가능 

 

단점

- 과다 생성시 메모리 측면에서 낭비 발생 가능성. 

-> 노는 스레드 발생할 수도 있음. 

 

 


📌 프로세스 - 스레드 차이

출처 : @seyoung755님 블로그 

 

스레드 : 프로세스 내에서 실행되는 흐름의 단위 

프로세스 : 프로그램이 메모리에 올라간 상태 

 

일반적인 단일 프로세서 구조에서는 하나의 프로세서가 CPU를 점유하기 때문에 동시에 한 작업만 일어난다. 

시분할 OS에서는 이 CPU 할당을 단기 스케쥴러가 라운드-로빈 방식등의 CPU 스케쥴링을 활용하여 짧은 간격으로 CPU 제어권을 여러 프로세스에게 나눠준다. 그래서 사용자는 동시에 여러 프로세스가 실행되는 듯한 착각을 준다. 

 

✔️ 그렇지만 프로세스가 여러개의 스레드를 가진다면?

한 프로세스여도 여러개의 작업을 동시에 처리가 가능하다. 

예를 들어 시간이 오래 걸리는 입출력 작업을 기다려야 할 때, 멀티 스레드 환경에서는 다른 작업들도 처리가 가능하다. 

이를 서비스에 적용하면 사용자로 하여금 빠른 반응성을 제공할 수 있기 때문에 유용하다. 

 

✔️ 이런 스레드는 그럼 프로세스처럼 독자적인 주소공간을 가질까?

스레드는 프로세스 내의 실행 흐름으로, 프로세스의 주소공간 중 일부를 공유한다. 

같은 프로세스인 만큼 코드영역을 공유하고, 데이터와 힙 영역도 공유한다. 

하지만, 독자적인 함수를 호출하면서 작업할 수 있도록 스택 영역을 독자적으로 가진다. 

추가적으로 프로세스 관리를 위해 만들어진 PCB 내에서도 스레드 별로 별도의 프로그램 카운터(PC)를 가져야하기 때문에 TCB (Thread Control Block) 형태로 관리를 해준다