User Level Thread, Kernel Level Thread

charsyam의 이미지

음... 아는 분과 얘기를 하다가 위에 관련된 내용들이 나왔습니다.

제가 알기론 PThread 가 User Level Thread 라고 알고 있었습니다.

User Level Thread 의 경우 이 스레드의 스케줄링은 Process 내부에서

돌아가기 때문에, 스케줄시에 커널 모드로 들어갈 필요가 없다는 장점이

있습니다. 반대로 단점으로, 하나의 스레드가 Block Call 을 하면 프로세스

자체가 Block 된다는 단점이 있습니다. 음... 제가 잘못 이해하고

있는건지...

Kernel Level Thread 는 반대로 그런 문제가 없지만, 스레드 단위로

스케줄이 되니, 스케줄시의 오버헤드가 더 생기는 겁니다.

문제가 되는 것은...

Pthread 가 User Level Thread 라면, Mutex 를 사용하게 되면

하나가 Mutex를 락하면, 전체가 블록되서, 실제로 스레드를 사용하는

효과가 없다는 건데... 쩝... 제대로 이해한건지... 고수님들 답변좀...

^^ 고운 하루되세요.

pynoos의 이미지

Posix Thread API 자체만으로는 User thread, Kernel Thread 라고 말하지 않습니다.

구현의 문제이지요...

Quote:

하나의 스레드가 Block Call 을 하면 프로세스

자체가 Block 된다는 단점이 있습니다.

Pthread 가 User Level Thread 라면, Mutex 를 사용하게 되면

하나가 Mutex를 락하면, 전체가 블록되서, 실제로 스레드를 사용하는

효과가 없다는 건데... 쩝... 제대로 이해한건지... 고수님들 답변좀...

^^ 고운 하루되세요.

위에서 말한 Block Call은 대개 thread를 고려하지 않은 system call을 말합니다. blocked socket I/O 등이죠...
Mutex는 thread간 sync를 위해서 만들어진건데... 그 녀석을 Lock한다고해서 process 전체가 lock이 되진 않습니다.

소타의 이미지

charsyam wrote:
Pthread 가 User Level Thread 라면, Mutex 를 사용하게 되면

하나가 Mutex를 락하면, 전체가 블록되서, 실제로 스레드를 사용하는

효과가 없다는 건데... 쩝... 제대로 이해한건지... 고수님들 답변좀..

mutex를 호출했을때 쓰레드 전체가 블로킹 되게 짜여져 있다면... 전체가 블록될 것이고 그렇지 않다면 그렇지 않겠죠 -_-;
mutex_lock 에 의해 계속 블록 된다는건 잘못 짜여진 프로그램이 아닐까요? 그리고 user level 이든 kernel level 이든 mutex락이 걸리면 같은 mutex를 얻으려 시도하거나 cond_wait 하고 있는 쓰레드는 블록됩니다.

문제는 어떻게 짜느냐.. 겠죠 -.-?

그리고 pthread 가 user level 이라는건.. 잘못 알고 계신거 같습니다.
pthread는 POSIX 호환 기종에서의 thread를 위한 일종의 표준이고 그것을 구현한 라이브러리입니다.
리눅스에서는 user level thread 만을 쓸 수 있지만 솔라리스에서는 kernel level 을 선택 할 수 있습니다.

charsyam의 이미지

nonun wrote:
charsyam wrote:
Pthread 가 User Level Thread 라면, Mutex 를 사용하게 되면

하나가 Mutex를 락하면, 전체가 블록되서, 실제로 스레드를 사용하는

효과가 없다는 건데... 쩝... 제대로 이해한건지... 고수님들 답변좀..

mutex를 호출했을때 쓰레드 전체가 블로킹 되게 짜여져 있다면... 전체가 블록될 것이고 그렇지 않다면 그렇지 않겠죠 -_-;
mutex_lock 에 의해 계속 블록 된다는건 잘못 짜여진 프로그램이 아닐까요? 그리고 user level 이든 kernel level 이든 mutex락이 걸리면 같은 mutex를 얻으려 시도하거나 cond_wait 하고 있는 쓰레드는 블록됩니다.

문제는 어떻게 짜느냐.. 겠죠 -.-?

그리고 pthread 가 user level 이라는건.. 잘못 알고 계신거 같습니다.
pthread는 POSIX 호환 기종에서의 thread를 위한 일종의 표준이고 그것을 구현한 라이브러리입니다.
리눅스에서는 user level thread 만을 쓸 수 있지만 솔라리스에서는 kernel level 을 선택 할 수 있습니다.

네... ^^, 아 제가 궁금한건, 첫 번째는 PThread 가 user-level thread 인가? 이건 아닌것 같네요 ^^

두번째는 User-Level Thread 라면, Mutex 등의 커널 오브젝트를 이용하게 되는 등의 block call을 쓸 때, 프로세스 자체가 블록이 되는가 입니다.

사실 두번째는 user-level 스레드라면 블록이 되야 할 것 같은데, 이 부분에 대해서 자세히 알고 싶습니다. ^^

=========================
CharSyam ^^ --- 고운 하루
=========================

pynoos의 이미지

charsyam wrote:
두번째는 User-Level Thread 라면, Mutex 등의 커널 오브젝트를 이용하게 되는 등의 block call을 쓸 때, 프로세스 자체가 블록이 되는가 입니다.

사실 두번째는 user-level 스레드라면 블록이 되야 할 것 같은데, 이 부분에 대해서 자세히 알고 싶습니다. ^^

User level thread라면, mutex가 커널 오브젝트가 아닙니다. 단지 그 프로세스의 메모리 공간에 잡힌 데이터일 뿐이지요.

shkwon81의 이미지

pthread 에서 정의된 쓰레드가 어떤 레벨의 쓰레도와 대응되느냐는
구현의 문제입니다. pthread는 쓰레드를 다루기 위한 API와 모델만을 제공해 주는 것입니다.

Quote:
그리고 pthread 가 user level 이라는건.. 잘못 알고 계신거 같습니다.
pthread는 POSIX 호환 기종에서의 thread를 위한 일종의 표준이고 그것을 구현한 라이브러리입니다.
리눅스에서는 user level thread 만을 쓸 수 있지만 솔라리스에서는 kernel level 을 선택 할 수 있습니다.

위에서 리눅스의 쓰레드 구현은 user level 쓰레드가 아닙니다.
오히려 지나칠 정도로 kernel level 쓰레드이지요..

솔라리스의 현재 버전은 (SunOS 5.8, SunOS 5.9) 는 many-to-few 모델을
적용하고 있습니다. pthread 의 쓰레드 여러 개가 소수의 kernel entity
(커널의 스케쥴링 단위: 솔라리스에서는 LWP라고 부릅니다) 매핑되는 것이죠.
유저 레벨 쓰레드 모델과 커널 레벨 쓰레드 모델의 복합 형태로 생각하시면 됩니다.

charsyam의 이미지

pynoos wrote:
charsyam wrote:
두번째는 User-Level Thread 라면, Mutex 등의 커널 오브젝트를 이용하게 되는 등의 block call을 쓸 때, 프로세스 자체가 블록이 되는가 입니다.

사실 두번째는 user-level 스레드라면 블록이 되야 할 것 같은데, 이 부분에 대해서 자세히 알고 싶습니다. ^^

User level thread라면, mutex가 커널 오브젝트가 아닙니다. 단지 그 프로세스의 메모리 공간에 잡힌 데이터일 뿐이지요.

User level thread 라면, mutex 가 커널 오브젝트가 아니라는 건, 좀 더 자세히 설명해 주실수 있으신가요? 아니면, 어디 관련자료라도 그럼 고운 하루되시길... 답변 달아주신 모든 분께 답변 감사드립니다.

=========================
CharSyam ^^ --- 고운 하루
=========================

pynoos의 이미지

커널 객체가 아니라고 표현한 것은 구현에 따라 오류일 수도 있다는 생각이 드는 군요.. 정정하겠습니다.

제가 쉽게 떠올리는 user thread 모델이 GNU의 pthread 라이브러리인 pth 라서 그렇게 말하였습니다.

User 쓰레드 개념이 없는 곳에 구현하는 다른 구현도 비슷할 것이라 생각되는데... 이 구현은
system call 을 override (?) 합니다. symbol을 가로 채서, fork, recv, select .... 등의 많은 system call을
부를때, pth 내의 wrapper 함수를 호출하도록 하지요. 그 wrapper가
원래의 함수를 다시 부릅니다. 부르기 전에 pth thread library를 초기화 합니다.
즉, kernel이 전혀 thread 개념없이 process를 실행해도 좋다면, thread간 switching은 지극히 내부 프로세스의 함수 내에서만 일어나는 것입니다.
따라서 thread간 동기화 객체도 내부 thread 함수간 일어나는 것이며, 전형적인
mutex 객체 같은 것은 커널에 잡히는 것이 아니겠지요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.