티스토리 뷰
📌 단일 스레드와 멀티 스레드
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) 형태로 관리를 해준다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 소켓 통신, 서버 - 클라이언트 통신, RPC (2) | 2023.10.23 |
---|---|
[운영체제] 프로세스 간 통신 (1) | 2023.10.23 |
[운영체제] 프로세스 연산(생성 / 종료) (0) | 2023.10.22 |
[운영체제] 프로세스, 스케쥴링, 컨텍스트 스위칭 (0) | 2023.10.22 |
[운영체제] 운영체제의 서비스, 시스템 콜 (0) | 2023.10.21 |
- Total
- Today
- Yesterday
- 국비지원취업
- 채팅기능개발
- Java
- 백엔드개발자
- 프로젝트후기
- 백준
- 스터디후기
- springboot
- boj
- 과정중간회고
- 패스트캠퍼스강의
- 카카오API
- 야놀자
- 백엔드부트캠프
- #국비지원취업
- 국비지원
- 야놀자X패스트캠퍼스부트캠프
- TiL
- 그룹스터디
- 자료구조
- 국비지원캠프
- 부트캠프
- 그룹스터디워크샵
- 커리어멘토링
- 백엔드
- 데이터베이스
- qjzl
- 패스트캠퍼스
- be
- 자료구조 #스택 #큐 #덱 #선형자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |