스레드(Thread)
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다. 하나의 프로세스가 한 번에 하나의 작업만 수행하는 것은 싱글스레드(Single thread)이며, 하나의 프로세스가 동시에 여러 작업을 수행하는 것은 멀티스레드(Multi thread)라고 한다. 프로세서와 메모리가 발전하며 가능해진 기술이다.
멀티 스레드(Multi Thread)
- 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상 시킨다.
- 하나의 프로그램에서 동시에 여러 개의 일을 수행할 수 있도록 해줌 (분산처리를 통해 동시에 실행되는 것 처럼 보이는 것)
장점
- 응답성(responsiveness): 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.
- 자원 공유(resource sharing): 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다. 스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 프로세스의 context switching과 달리 스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
- 경제성(economy): 일반적으로 스레스 생성은 프로세스 생성보다 시간과 메모리를 덜 소비한다. 문맥 교환 역시 일반적으로 프로세스 사이보다 스레드 사이에서 더 빠르다.
- 규모 적응성(scalability): 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 처리기가 아무리 많더라도 오직 한 처리기에서만 실행된다.
다중 코어 프로그래밍(Multicore Programming)
멀티코어는 CPU안에 코어가 여러개 있는 형태를 의미한다. 멀티코어는 "하드웨어 관점"에서의 물리적 구성 단위, 멀티스레드/멀티스레딩은 "소프트웨어 관점"에서의 논리적 작업 처리 단위라는 차이점이 있다.
멀티코어를 더 효율적으로 사용할 수 있고 병행 실행을 더 향상 시킬 수 있는 기법을 제공하는게 바로 멀티스레드 프로그래밍이다.
단일 코어에서는 병행실행(Concurrency)을 통해서 모든 테스크가 진행하게끔 함으로서 하나 이상의 테스크를 수행했었다. 마치 병렬 실행이 되는 듯한 착각이 들게 만들었다.
멀티코어에서 진짜로 병렬실행(Parallelism)을 지원하게 되었다. 동시에 한개이상의 일을 수행할 수 있게 된 것이다. 현대에서는 하이퍼스레딩 기술로 코어당 2개의 스레드를 지원해서 더 빠른 문맥 교환이 가능해졌다.
병행성 vs 병렬성
동시성은 프로세서가 여러 개의 스레드를 번갈아가며 수행함으로써 동시에 실행되는 것처럼 보이게 하는 방식이다.
병렬성은 여러 개의 코어가 각스레드를 동시에 수행하는 방식이다.
다중 스레드 모델(Multithreading Models)
유저 스레드(user threads)는 사용자 수준의 스레드 라이브러리가 관리하는 스레드다. 커널 스레드(kernel threads)는 커널이 지원하는 스레드다. 유저 스레드는 커널 위에서 지원되며 커널의 지원 없이 관리된다. 반면 커널 스레드는 운영체제에 의해 직접 지원되고 관리된다.
커널 스레드를 사용하면 안정적이지만 유저 모드에서 커널 모드로 계속 바꿔줘야 하기 때문에 성능이 저하된다. 반대로 유저 스레드를 사용하면 안정성은 떨어지지만 성능이 저하되지는 않는다.
유저 스레드와 커널 스레드의 관계를 설계하는 여러가지 방법이 있다.
다대일 모델 (Many to One Model)
하나의 커널 스레드에 여러 개의 유저 스레드를 연결하는 모델이다. 사용자 수준에서 스레드 관리가 이루진다. 한 번에 하나의 유저 스레드만 커널에 접근할 수 있기 때문에 멀티코어 시스템에서 병렬적인 수행을 할 수가 없다. 요즘에는 잘 사용되지 않는 방식이다.
일대일 모델 (One to One Model)
하나의 유저 스레드에 하나의 커널 스레드가 대응하는 모델이다. 사용자 스레드가 생성되면 그에 따른 커널 스레드가 생성되는 것이다. 동시성을 높여주고, 멀티프로세서 시스템에서는 동시에 여러 스레드를 수행할 수 있도록 해준다. 유저 스레드를 늘리면 커널 스레드도 똑같이 늘어나는데, 커널 스레드를 생성하는 것은 오버헤드가 큰 작업이기 때문에 성능 저하가 발생할 수 있다. 윈도우와 리눅스가 이 모델을 구현하고 있다.
다대다 모델 (Many to Many Model)
여러 유저 스레드에 더 적거나 같은 수의 커널 스레드가 대응하는 모델이다. 운영체제는 충분한 수의 커널 스레드를 만들 수 있으며, 커널 스레드의 구체적인 개수는 프로그램이나 작동 기기에 따라 다르다. 멀티프로세서 시스템에서는 싱글프로세서 시스템보다 더 많은 커널 스레드가 만들어진다.
'운영체제' 카테고리의 다른 글
[운영체제] 동기화 도구들 (뮤텍스, 세마포어, 모니터) (0) | 2021.09.08 |
---|---|
[운영체제] CPU 스케줄링 (0) | 2021.09.06 |
[운영체제] 프로세스 구조, 생성, 종료, 통신 (0) | 2021.08.27 |
[운영체제] 프로세스 스케줄링 (0) | 2021.08.27 |
[운영체제] 프로세스(프로세스 메모리, PCB) (0) | 2021.08.24 |