안녕하세요! 플루토입니다. 이전 시간에는 운영체제의 프로세스와 스레드에 개념과 그 차이를 알아보는 시간을 가졌습니다.
오늘은 스레드를 조금 더 깊게 알아보는 시간을 가지도록 하겠습니다!
이전 내용이 궁금하신 분들은 아래 링크를 통해 간단히 읽고 오셔도 좋습니다.
2022.02.20 - [Computer Science/Operating System] - [Pluto의 컴퓨터이야기] Process 와 Thread의 차이는 뭘까?
[Pluto의 컴퓨터이야기] Process 와 Thread의 차이는 뭘까?
안녕하세요! 플루토입니다. 오늘은 컴퓨터와 사용자를 이어주는 운영체제에 대해서 프로세스와 스레드의 차이를 알아보는 시간을 가지도록 하겠습니다. 글을 읽고 난 뒤의 여러분은 1. 운영체
ys-log.tistory.com
이 글을 읽고 난 뒤의 여러분은
1. 스레드의 종류에 대해서 설명할 수 있습니다
2. 각각의 종류에 대해서 특징과 제한사항 등을 설명할 수 있습니다.
3. 운영체제가 스레드를 어떤 식으로 스케줄링하는지 이해할 수 있습니다.
1. 스레드의 종류 (User/Kernel)
스레드를 새로 만들어 내고 해당 스레드들을 어떻게 관리하는지. 그 책임이 누구에게 있느냐에 따라 종류가 유저 레벨의 스레드인지, 커널 레벨의 스레드인지 달라지게 됩니다.
기본적으로 스레드는 운영체제 단에서 생성되고 관리가 되는 요소이지만, 스레드는 모두 하나의 프로세스에 대해 논리적으로 같은 주소 공간에 있다는 특성을 이용하여 사용자 애플리케이션의 thread manager가 해당 프로세스의 주소 공간(Address Space)을 볼 수 있다면, User-Level에서도 스레드를 구현하는 것은 운영체제의 도움이 없더라도 불가능한 일은 아닙니다.
2. 스레드 별 특징과 제한사항
◎ OS-managed thread
운영체제가 프로세스와 스레드를 모두 관리하는 상황입니다. 즉 생성과 관리까지 운영체제가 도맡아 하는 경우이지요. 이는 모든 thread operation이 커벌 내부에 구현이 돼있는 것을 암시합니다.
운영체제가 모든 스레드와 프로세스들을 생성했기 때문에 각각의 스레드에 대한 상태를 알 수 있고, 스케줄링하여 효율적으로 CPU를 사용할 수 있는 장점이 있습니다.
◎ Limitations
kernel-level의 스레드가 프로세스에 비해 경량화되었지만 여전히 많은 컴퓨팅 Cost가 발생하는 것은 사살입니다. 많은 프로그램이 실행되고 높은 동시성과 병렬 프로그래밍이 요구되는 요즘에는 조금 더 세밀한 동시성을 지원할 수 있는 프로그램을 만들려면, 커널 레벨의 스레드 보다 조금 더 쉽게 생성할 수 있는 무엇인가가 필요합니다.
이상적으로 스레드처럼 병력적으로 작동할 수 있으면서도 프로시저(Function Call)처럼 빠르게 동작할 수 있는, 즉 User mode와 Kernel mode(추후에 블로그 포스팅으로 다뤄보도록 하겠습니다) 간의 변환하며 발생하는 overhead 없이 유저 레벨에서 해결할 수 있는 방법이 필요했습니다.
◎ User-level thread
스레드를 더욱 저렴한 비용(Cpu사이클 등을 적게 사용한다는 점에서의 "저렴 한 비용"입니다)으로 빠르게 만들기 위해서 유저 레벨에서 생성되고 관리되는 스레드입니다.
thread programming을 통해 응용 프로그램을 만들었다면, 특정 OS에서만 동작하는 프로그램이 아닌 운영체제의 종류에 상관없이 작동할 수 있는 추가적인 고려사항이 있었습니다. User level <--> Kernel level 사이의 Protection boundary룰 넘나드는 부하가 없기 때문에 커널 레벨의 스레드 보다 훨씬 더 저렴하고, 빠른 특성을 가집니다. 운영체제가 관리하는 명령어 실행상태를 기록하는 TCB(Thread control Block)을 스레드 프로그래밍을 지원하는 라이브러리 내부에 저장을 개별적으로 하는 특징이 있습니다.
◎ Limitations
운영체제의 도움 없이 라이브러리에서 구현되었기 때문에 운영체제의 입장에서는 해당 프로세스 내에 스레드가 존재하는지에 대한 여부를 알 방법이 없게 됩니다. 운영체제가 모르는 스레드가 생성돼서 동작하는 것이지요 따라서 유저 레벨의 스레드들이 idle(쉬고 있는 상태) state이더라도 운영체제의 스케줄링에 의해 CPU 자원이 할당된다던가 이로 인해 다른 작업을 수행해야 할 높은 우선순위가 있는 스레드가 있더라도 처리가 늦어지는 결과를 발생시킬 수 있으며반대로, 운영체제에게 보이지 않기 때문에 Lock을 잡고 있다거나 스레드가 Critical Section내부를 실행 중이더라도 CPU 자원을 빼앗기는 경우가 발생하게 됩니다.
3. Thread scheduling
유저 레벨 스레드 라이브러리 내부에 존재하는 스케줄러가 마치 운영체제가 프로세스를 스케줄 하는 것처럼 스레드들을 스케줄링하게 됩니다. 스케줄러는 스레드가 무엇을 하고 있는지 추적할 필요가 있기에 run/ready/wait Queue 등을 가지고 해당 조건에 따라서 스레드들을 분류하고 실행하게 됩니다.
◎ CPU hogging
운영체제의 제어를 받지 않는 유저 레벨 스레드는 해당 스레드를 포함하는 프로세스가 CPU를 할당받은 동안 CPU를 독점적으로 차지해 사용할 수 있다는 문제점이 있습니다. (Lock을 획득한 운영체제에게 보이지 않는 스레드가 release를 하지 않으면 발생합니다.)
따라서 두 가지 방법을 통해 스케줄링을 할 수 있습니다.
Non-preemitive scheduling
모든 유저 레벨 스레드들이 협조적으로 작업을 하는 개념입니다. 특정 함수 등을 호출하면서 자발적으로 작업이 끝났다면 CPU 할당을 반납하는 방법이며 이는 전적으로 프로그래머가 설계를 해 주어야 합니다.
Preemitive scheduling
프로그래머의 실수로 위의 구조의 프로그램을 만들지 않았을 때를 대비해 운영체제의 지원을 통해서 H/W timer interrupt가 발생했을 때 유저 레벨 스레드 스케줄러 에게도 인터럽트가 발생함을 알려주어 스케줄러가 강제적으로 CPU 할당을 빼앗아 다른 스레드에게 스케줄링하는 방식입니다.
4. 정리
스레드에는 User-Level / Kernel-Level 두 가지 종류가 있다!
유저 레벨은 가볍고 생성이 더 빠르지만 운영체제에 의해 관리되지 않으며 발생하는 문제가 있다(Critical Section문제)
커널 레벨은 운영체제에 의해 관리되지만 유저 레벨에 비해 생성과 관리에 높은 비용이 발생한다
따라서 유저 레벨 스레드 스케줄러는 두 가지 방법의 CPU hogging을 사용해 문제를 해결한다!
글을 읽어주시면서 정확하지 않은 정보에 대한 비판은 감사하게 받아들이겠습니다!
읽어주셔서 감사합니다!🙏
'Computer Science > Operating System' 카테고리의 다른 글
[Pluto의 컴퓨터 이야기] 동기화 에서의 Lock의 문제점과 대안 (0) | 2022.02.27 |
---|---|
[Pluto의 컴퓨터 이야기] Process의 생성과 종료 (0) | 2022.02.24 |
[Pluto의 컴퓨터이야기] 운영체제가 인지하는 두 가지 Events (0) | 2022.02.21 |
[Pluto의 컴퓨터이야기] 운영체제의 동기화 기법 (0) | 2022.02.21 |
[Pluto의 컴퓨터이야기] Process 와 Thread의 차이는 뭘까? (0) | 2022.02.20 |