- 스레드는 스레드id, pc, 레지스터 집합, 그리고 스택으로 구성
- 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터, 운영체제 자원들을 공유한다.
- stack은 각각의 스레드가 갖고있다. 데이터를 공유하려면 data,heap을 사용해야 함
- 각각의 스레드는 PCB에 고유의 PC, register 값을 가진다 → 프로세스 간의 문맥교환보다 스레드의 문맥 교환이 훨씬 빠르다.
- 요즘 어플리케이션은 모두 멀티스레드 사용
- 프로세스 생성은 heavy-weight 오버헤드가 큼, 스레드 생성은 light-weight
- 과거에는 스레드를 경량 프로세스라고 불렀음
- → 스레드 생성하는 것이 훨씬 효율적임!!
멀티스레드 서버 구조
(1) 클라이언트가 서비스할 스레드에게로 요청 전달
(2) 요청을 수행하기 위해 새로운 스레드를 생성(worker thread)
(3) 추가 클라이언트 요청 수신 재개
(4) communication
멀티스레드 프로그래밍의 장점
- 응답성 : 응용 프로그램이 긴 작업을 수행하더라도 별도의 스레드를 실행하여 다른 작업을 처리할 수 있다.
- 자원공유 : 스레드는 자신이 속한 프로세스 자원과 메모리를 공유할 수 있다.
- 경제성 : 프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 그것을 줄여줌!
- Scalability(확장성) : 다중 처리기 구조에서 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있다.
Multicore Programming
병행성 vs 병렬성
- Concurrency (병행성) - 하나의 프로세서에서 여러 프로세스가 병행해서 처리하는 것
- Parallelism(병렬성) - 동시에 하나 이상의 작업 처리하는 것
- Data Parallelism : 데이터를 나눠서 동시에 처리하는 것
- Task parallelism : 작업을 각각의 코어에 분산해 동시에 처리하는 것
병행 실행은 병렬성이 없다. 그러나 병렬 실행은 병행성이 있다!
Amdahl’s 법칙
- CPU 수가 늘어나도 SpeedUp이 선형적으로 증가하지는 않는다.
- 병렬적으로 할 수 있는 부분이 있고, 순차적으로 수행해야 하는 일이 있을 때, 순차적으로 수행해야 하는 일은 수행시간을 단축시킬 수 없기 때문에!
- serial portion을 줄이는 것이 좋다.
User Thread vs Kernel Thread
- 유저 스레드 : 사용자 수준의 스레드 라이브러리가 관리하는 스레드
- 커널 스레드 : 커널이 지원하는 스레드.
→ 커널 스레드를 사용하면 안정적이지만, 유저모드에서 커널모드로 모드 전환을 계속 해야 하기 때문에 성능이 저하된다.
→ 유저 스레드는 안정성은 떨어지지만 성능이 저하되지는 않는다.
Multithreading Models
- Many-to-one → 요즘 잘 사용되지 않는 방식
- 하나의 커널 스레드에 여러 개의 유저 스레드를 연결하는 모델
- 한 번에 하나의 유저 스레드만 커널에 접근할 수 있음
- → 멀티코어 시스템에서 병렬적인 수행을 할 수 없음.
- One-to-One → window Linux
- 하나의 커널 스레드에 하나의 유저 스레드를 일대일 대응하는 모델
- 동시성을 높여주고, 멀티 프로세서 시스템에서 동시에 어려 스레드를 수행할 수 있도록 해준다.
- 유저 스레드를 늘리면 커널 스레드도 늘어남 → 성능 저하! (커널 스레드를 생성하는 데에 오버헤드가 크다)
- Many-to-Many
- 여러 유저 스레드에 더 적거나 같은 수의 커널 스레드가 대응하는 모델
- 커널 스레드의 개수는 프로그램이나 작동 기기에 따라 다르다.
- 멀티 프로세서 시스템에서는 싱글 프로세서 시스템보다 더 많은 커널 스레드가 만들어진다.
- Two-level Model
- many-to-many 모델의 변형
- 여러 유저 스레드에 적거나 같은 수의 커널 스레드를 대응시킴
- 또한 한 사용자 스레드가 하나의 커널 스레드에만 연관되는 것 허용
- 가장 융통성 있어 보이지만 구현이 어려움
- 대부분의 시스템에서 처리 코어 수가 증가함에 따라 커널 스레드 수를 제한하는 것의 중요성이 줄어들었다. 대부분의 운영체제는 일대일 모델을 사용하게 됨!
Thread Library - Pthread
- 프로그래머가 스레드를 생성하고 관리하는 API를 제공한다.
- pthread - UNIX OS(Linux,MAC OS 등) 에서 사용하는 라이브러리
Implicit Threading 암묵적 스레딩
- 스레딩의 생성과 관리 책임을 개발자가 아닌 컴파일러와 라이브러리가 하는 것
Thread Pool
- 스레드 갯수의 한계를 설정할 수 없으면 언젠가 시스템 자원이 부족해지고 과부하가 걸린다.
- → 이러한 문제를 해결하기 위해 나온 것이 Thread Pool
아이디어
- 시작하기 전에 미리 pool에 쓰레드를 만들어 두는 것
- 평소에는 하는 일 없이 작업 요청을 기다림
- 서비스 완료 시에 풀로 돌아가서 작업을 기다림
장점
- 새로운 스레드를 만들어서 서비스 하는 것 보다 빠르다
- 스레드 개수에 제한을 둔다. → 많은 수의 스레드를 병렬 처리 할 수 없는 시스템에 도움이 된다
- 작업을 생성하는 방법과 실행하는 방법을 다르게 할 수 있다.
풀에 있을 스레드 갯수는 하드웨어에 따라 달라진다.
(CPU의 갯수, 물리적 메모리의 양, 사용자 요청의 양 등등)
'CS지식 > 운영체제' 카테고리의 다른 글
운영체제 : Synchronization (0) | 2023.09.23 |
---|---|
운영체제 : CPU 스케줄링 간단 정리 (0) | 2023.09.23 |
운영체제 : Process란? (개념, 용어 정리) (0) | 2023.09.23 |
OS 구조 (0) | 2023.09.23 |
OS가 하는 일 (0) | 2023.09.23 |