글쓴이 | 메시지 |
---|---|
ollllo beginner 올린 글: 1 | 올려짐: 2003년1월22일 21:24 주제: 사용자수준 쓰레드와 커널수준 쓰레드의 차이?사용자 수준 쓰레드와 커널 수준 쓰레드의 차이에 대해서 설명해 주실수 있으시겠습니까?각각 장단점이 있다고 하는데, 잘 이해가 되질 않네요. 사용자 수준은 문맥교환의 오버해드가 없다, 커널 수준은 사용자 수준 보다 효율적일 수 있다.. 라고 하는데 잘 이해가 가질 않네요..그리고 현재 리눅스에서는 두가지 쓰레드 모델이 모두 지원 되나요? |
위로 | |
낙엽 novice 올린 글: 8 | 올려짐: 2003년1월23일 9:21 주제:일반적으로 많이 나와있는 내용이라 찾아보시면 자료들이 많을겁니다만..간단하게 생각해보면, (저도 자세히는 모르지만 -_-)user thread는 process내부에 여러개로 구성될 수 있고, 한 process내에서 같은 리소스를 가지고 다른 user thread와 통신할 수 있으니 당연히 context switching의 overhead가 없죠.kernel thread는 user thread에서 LWP 자료구조를 통해 연결되는데, 보통 kernel scheduler에 의해 cpu를 할당받아 사용하지만, 직접 cpu를 할당 받아서 사용할 수도 있으니 당연히 효율(?)적일 수도 있겠죠.. 쿨럭.. |
위로 | |
방준영 user 올린 글: 26 | 올려짐: 2003년1월23일 18:39 주제: 사용자 쓰레드와 커널 쓰레드인용:사용자 수준은 문맥교환의 오버해드가 없다, 문맥교환은 컨텍스트 전환(context switch)을 잘못 번역한 말입니다. 잘못된 용어로 이해를 하면 나중에 더 헷갈릴 우려가 있기 때문에… 쓰레드간을 전환할 때마다 커널 스케줄러를 호출할 필요가 없기 때문입니다. 커널 스케줄러로 진입하려면 프로세서 모드를 사용자 모드에서 커널 모드로 전환해야 하는데, 이때 사용자쪽 하드웨어 레지스터를 전부 저장시키고, 커널 레지스터를 복구하고, 기타 등등…의 수많은 작업이 밑에서 일어납니다. 따라서 사용자 모드와 커널 모드를 많이 왔다갔다 할 수록 성능은 급격하게 떨어지는 것이죠. 사용자 쓰레드는 쓰레드 스케줄러가 사용자 모드에만 있기 때문에 그런 오버헤드는 발생하지 않습니다.인용:커널 수준은 사용자 수준 보다 효율적일 수 있다.. 그런데 사용자 쓰레드의 결정적인 단점은 프로세스내의 한 쓰레드가 커널로 진입하는 순간 나머지 쓰레드들도 전부 정지된다는 점입니다. 커널이 쓰레드의 존재를 알지 못하므로 불가피한 현상입니다. 쓰레드가 커널로 진입할 때는 write(), read(), …같은 시스템 호출을 부를 때인데, 시스템 호출 길이가 짧아서 바로 리턴할 때는 문제가 없지만 연산이 길어지면 상당한 문제가 됩니다. 전체 프로세스의 응답성이 확~ 떨어지죠.그리고 커널 쓰레드를 쓰면 멀티프로세서를 활용할 수 있다는 큰 장점이 있습니다. 사용자 쓰레드는 CPU가 아무리 많더라도 커널 모드에서 쓰레드 단위로 스케줄이 안되므로 각 CPU에 효율적으로 쓰레드를 배당할 수 없는 문제가 있습니다(프로세스 단위로만 배당이 되므로).그래서 리눅스, 윈도, 솔라리스를 비롯한 대부분의 운영체제는 사용자 쓰레드를 쓰지 않고 커널 쓰레드, 또는 커널/사용자 쓰레드 혼합 방식을 쓰는 추세입니다.인용:그리고 현재 리눅스에서는 두가지 쓰레드 모델이 모두 지원 되나요? 예, 모두 지원됩니다.쓰레드 방식은 크게 세가지가 있습니다. 이중 사용자 쓰레드는 요즘들어 리눅스에서는 별로 쓰는 사람이 없는 것 같고, 1-on-1 커널 쓰레드 방식인 glibc내의 LinuxThreads가 가장 널리 쓰입니다. 최근에는 이걸 더 발전시킨 NPTL(Native POSIX Threading Library)가 활발히 개발중에 있습니다. 커널/사용자 쓰레드 혼합 방식인 NGPT(Next Generation POSIX Threads) 도 IBM의 지원하에 최근 2.2.0까지 나와 있습니다. 둘간의 차이를 여기서 설명하기엔 좀 긴 것 같고, 전자가 후자보다 훨씬 간단한 반면, 후자의 성능이 전자보다 다소 높은 것으로 알려져 있습니다. 여담입니다만, NPTL이 처음 나왔을 때 우리 것이 NGPT보다도 성능이 훨씬 좋다고 자랑(?)을 했더니 NGPT팀이 자극을 받았나 봅니다. NGPT 홈페이지에 가면 새버전(2.2.0) 성능이 LinuxThreads는 물론 NPTL도 능가한다고 큼지막하게 써놨습니다.인용:kernel thread는 user thread에서 LWP 자료구조를 통해 연결되는데중요한 것은 아닙니다만…LWP는 경량 프로세스(lightweight process)의 준말로, 솔라리스에서(그리고 최근의 NetBSD에서) 내부적으로 쓰는 말입니다. 리눅스, 윈도, FreeBSD에선 그냥 thread라고 합니다.– http://www.kr.netbsd.org/~junyoung방준영님이 2003년1월23일 23:13에 수정함, 총 1 번 수정됨 |
위로 | |
Paladin novice 올린 글: 5 | 올려짐: 2003년1월23일 21:13 주제: 쓰레드 패키지 아케텍쳐참조 하세요. 이 글 쓰느라 시간 좀 들였습니다.Thread-Package Architectures는 크게 4가지가 있습니다. User-level threads, Kernel-level threads, multiplexed threads, kernel-supported user-level threads[User-level threads]User-Level threads는 응용 프로그램과 Link/Load가 되는 라이브러리로 구현되어집니다. 이 라이브러리에 동기화, 스케줄링 기능을 모두 담고 있습니다. 커널에서는 아무런 지원을 해주지 않으며, 커널이 보기에는 단지 그냥 Single process일뿐입니다. 프로세스마다 런타임 라이브러리의 Copy가 호출되므로 스케줄링 정책을 프로세스마다 달리 취할 수 있으며, 각 Thread마다 time quantum을 소모할 필요 없고, 런타임 라이브러리가 context를 유지하기때문에 switching을 할 필요가 없습니다. 그래서 User-Level Threads는 빠르고, 매우 효율적입니다. 그러나 장애가 꽤 있습니다.1. Blocking System Calls Blocking function이란 처리가 완료되지않으면 return되지 않는 함수인데, 만약 특정 Thread에서 Blocking이 되어 버리면, 전체 process가 Blocking이 되어버립니다. 이런 이유로 운영체제가 제공하는 non-blocking 함수들만 사용해야 하며, 사용 빈도가 높은 함수(read,select,wait,…)들은 해당 함수의 non-blocking 버젼으로 대체해야할 필요가 있습니다. 2. Shared System Resources 동기화나 Locking없이 Thread끼리 공유하는 변수(드러나지 않고 감춰져 있는 경우)가 있을때, 그 Thread가 thread-safe하지 않으면 Overwrite되는 문제가 생길 수 있습니다. 이 이유로 사용할 함수는 재진입이 가능해야합니다. User-Level뿐만아니라 Kernel-Level 함수까지 모두. 3. signal Handling, Thread Scheduling User-Level에서 이것을 구현하기란 상당히 어렵습니다. Timeslice를 다루기 위해 Hardware Clock 인터럽트를 보통의 방법으로는 받지 못합니다. 선점형(Preemptive) 스케줄링을 하기 위해서는 커널로 부터 Time Siganl을 받는 함수를 등록해두어야 하며, Timer Alarm Siganl을 다루는것은 다른 시그널을 다루는 것보다 아주 어럽습니다. 4. Multiprocess Utilization 하나의 프로세스에서 Time을 공유하고 있기때문에 여러개의 CPU를 동시에 사용할 수는 없습니다.정리 – 구현상의 어려움과 복잡성 그리고, 몇가지 장애에도 불구하고, concurrency와 efficiency의 이득을 가져다 줍니다.[Kernel-level threads]Kernel-level에 있는 Threads는 독립적으로 스케줄되므로 특정 Thread에서의 Blocking이 process로 전파되지 않습니다. 그래서 Blocking System Calls를 이용할수 있습니다. 또한 각 Threads끼리 Signal을 주고 받을 수 있습니다. Kernel-level threads는 특별히 고려할만한 장애를 가지고 있지는 않습니다. 물론 마찬가지로 Thread-Safe해야 하지만, OS 개발자들은 대개의 표준 라이브러리를 Thread-Safe하게(재진입해도 문제없겠끔) 만들기에 User-level threads보다 통상적으로 보다덜 말썽을 피웁니다.Kernel-level threads는 안정성에 비해서 너무 느리다는게 큰 단점입니다. 바로 Thread Context-Switch 때문입니다. 마로비치의 연구에 의하면 10배정도 느리다고 합니다. |
[multiplexed threads]
User-level threads와 Kernel-level threads를 섞은 방법입니다. User-level thread(줄여서 Thread)는 LWP(가벼워진 프로세스, Lightweight Processes)에 의해 multiplex됩니다. 커널은 LWP를 스케줄링/실행하고, LWP는 대기중인 thread를 골라서 실행합니다. thread는 하나의 LWP에서 실행이 되어지며, Time slice가 바뀔때 LWP도 바뀌어질 수 있습니다. 프로그래머는 thread를 사용할 수도 있고, LWP를 직접 사용할수 있고, 둘 모두를 동시에 사용할 수도 있습니다.
User-level threads처럼 작동하면서 Hardware Parallelism과 Blocking calls에 대처할 수 있으며, Context-Switch을 많이 하지 않습니다.
이것의 장애는, LWP가 Blocking이 되면 이 LWP가 가진 몇개의 Thread도 동시에 Blocking이 됩니다. 또한 LWP의 Context-Switch 비용은 Kernel-level threas보다 결코 싸지 않습니다. 또한 다중 CPU에서 효율적일려면 각 Thread는 각각 다른 LWP에 할당되어 있어야 합니다. 각 Thread의 LWP 할당과 LWP의 CPU 할당은 별개로서 이루어지기 때문에, 각 Thread가 서로다른 CPU에 할당될려면 이렇게 작동하겠끔 하는 매커니즘이 따로 존재하여야합니다.
이러한 이유로 인해 LWP에 의한 multiplexed threads는 궁극의 해결책은 못됩니다. 이상적으로, Kernel-level threads의 결정적인 단점인 Thread Context-Switch를 user-level threds만큼 빠르게만 한다면 그것으로서 모든 장애는 해결됩니다. 물론 이 방법은 있지만 여전히 문제점을 가지고 있습니다. 아래 방법입니다.
[Scheduler Activation(kernel-supported user-level threads)]
이 방법은 User-level threads들을 위한 특별한 지원을 kernel이 해주는겁니다. 그 부분은 Scheduler Activation이라 합니다. User-level threads 라이브러리는 커널에게 프로세스를 요구할때와 양도할때를 알려줍니다. 그러면 커널의 Scheduler Activation은 이것을 커널에 의한 프로세스 주소 공간으로 할당된 Virtual Processor로 표현합니다. 여기서 스케줄링과 Blocking 감지가 이루어지며, Granted processor,Preemptive thread,Blocked,Unblocked등등의 Event를 User-level의 런타임 시스템에게 알려줍니다.
개념적으로 이 방법이 가장 확실합니다만 이것은 단 한가지, 그러나 치명적일 수도 있는, 약점이 있습니다.
커널과 라이브러리 코드가 효율적인 교신을 위해 같은 주소 공간을 공유하기 때문에 예외적으로 높은 신뢰를 가지고 있어야 하며 bug-free이어야합니다. 이 방법은 개념적으로 비정상적인 작동(의도적인 비정상적 작동 포함)과 버그에 대해서 강건함(robust)을 가지지 못합니다.
SunOS는 multiplexed threads를 지원합니다. 그외(WindowsNT,MACH,OS/2)는 Kernel-level threads를 지원합니다. 이 책에서는 MACH가 Kernel-level threads를 지원한다고 되어 있지만 어떤 Web site에 가니 MACH도 LWP도 지원하는걸로 되어 있군요. 이것이 multiplexed threads를 지원한다라는건지 아님 User-level threads의 구현상의 한방법인지는 모르겠습니다. 어쩌면 둘은 말만 다를뿐 별로 차이가 없는 것일지도 모르겠고.
Linux에서 작동되는 User-level threads는 아래와 같습니다.
Bare-Bones Threads,CLthreads,DCEthreads,FSU Pthreads,JKthread,LinuxThreads,LWP,NThreads (Numerical Threads),PCthreads,Provenzano Pthreads,QuickThreads,RexThreads.
http://www.sftw.umac.mo/resource/LDP/FAQ/Threads-FAQ/ThreadLibs.html에서 퍼왔습니다.
소스도 있으니 훝어 보는 것도 좋겠습니다.
_________________
9th Paladin위로
가입: 2003년 1월 22일
올린 글: 26
가입: 2003년 1월 21일
올린 글: 5
가입: 2003년 1월 22일
올린 글: 26
가입: 2003년 1월 21일
올린 글: 5
가입: 2003년 1월 22일
올린 글: 26
가입: 2003년 1월 22일
올린 글: 26
이전 글 표시: 모든 글1일7일2주1달3달6달1년 오래된 글 먼저새로운 글 먼저 |