리눅스에서의 쓰레드 스케줄링에 관해서 질문 드립니다.

swunk의 이미지

리눅스에서는 스케쥴러 관점에서는 쓰레드와 일반 프로세스간에 차이가 없는 것으로 알고 있습니다. 모두 task_struct로 추상화 되어진 element를 바라보고 스케쥴링하는 것으로 알고 있습니다.이와 관련해서 궁금한것이 몇가지 있어서 질문 드립니다.

1) pthread로 생성한 쓰레드와 clone시스템콜을 호출하여 생성한 쓰레드 모두 스케쥴러 입장에서는 동일한 task_struct로 바라보게 되는지요 ?
예전에 얼핏 듣기로는 pthread 같은 경우는 라이브러리에서 제공하는 스케쥴러를 사용한다고 들은것 같아서요...

2) 자바에서 생성한 쓰레드와 clone 시스템콜을 호출하여 생상한 쓰레드들은 어떠한가요 ? 이들도 모두 스케줄러 입장에서 보면 동일한 task_struct로 바라보게 되나요 ?

그럼 고수님들의 답변 부탁드립니다.

pastime의 이미지

리눅스의 pthread는 커널 레벨로 구현되어 있을 것입니다.
즉 clone() 시스템 콜을 이용하는 것이겠지요..

자바의 경우는 잘 모르겠네요.

wish의 이미지

먼저 "얼핏 듣기로는 pthread 같은 경우는 라이브러리에서 제공하는 스케쥴러를 사용한다고 들은것 같아서요" 요 부분은 일단 결론은 아닙니다 입니다. 만약 glibc 내에 포함된 posix thread api 를 쓴다면, 커널의 스케줄러가 pthread 를 스케줄링 하게 됩니다. 저런 말이 나올 수 있는게, GNU pth 라고 posix thread api 를 유저 레벨 쓰레드로 구현해 놓은 것이 있습니다. 이 라이브러리를 사용하게 되면, 유저 레벨 쓰레드 구현체인 만큼 라이브러리 내의 스케줄러로 스케줄링 하게 되겠습니다.

이건 확실하구요. 지금 부터 말씀드리는 것은 솔직히 자신 없습니다. 틀릴 확률도 있어요. 고수 분 태클 대 환영입니다 ㅜㅜ

그리고 아마도 현대 UNIX 운영체제 중 스케줄러 관점에서 프로세스와 쓰레드의 차이를 두는 운영체제는 없을 듯 합니다. 프로세스는 자원 할당 단위이고 쓰레드는 스케줄링의 단위인데, 예전에 쓰레드가 없었던 시절의 운영체제에서는 프로세스 밖에 없었으니 프로세스 단위로 스케줄링 했을 것이고, 현대 운영체제 처럼 커널 쓰레드를 지원하는 운영체제는 기본적으로 쓰레드가 스케줄링 단위입니다. 만약 쓰레드를 생성하지 않은 프로세스는 당연히 하나의 쓰레드로 생각해서 스케줄링 하게 될 것입니다.

여기 까지도 어느 정도는 내용을 확신할 수 있습니다. ^^ 자 이제 부터는 더더욱 머리속이 애매한 부분입니다. ㅜㅜ

기본적으로 모든 운영체제는 스케줄러 입장에서는 쓰레드를 스케줄링 단위로 삼는데, 님께서 말씀하신 "리눅스에서는 스케쥴러 관점에서는 쓰레드와 일반 프로세스간에 차이가 없는 것으로 알고 있습니다." 이 부분은 아마도 리눅스의 특이한 프로세스 생성법에 대한 이야기 인 것 같습니다. 리눅스에서 pthread 가 이직 구현 되지 않았던 시절에, 리눅스 프로세스는 다른 unix 의 프로세스와는 좀 달랐습니다. 프로세스를 생성할 때(즉 fork() 할 때), 새롭게 프로세스 공간 전체를 만드는 것이 아니라 공유할 수 있는 것들은 공유해 버릴 수 있는 성질을 리눅스는 가지고 있습니다. clone() 이 쓰레드를 만드는 시스템 콜이기는 하지만, 사실 fork()는 clone() 의 랩퍼 함수였습니다. 즉 fork()는 프로세스를 생성하되, clone() 을 호출하되 인자로 코드 세그먼트만 공유하고 다른 것은 모두 새롭게 만들도록 하는 clone 랩퍼 펑션이었죠. 물론 clone() 을 사용하면 데이터 세그먼트도 공유가능한 프로세스 혹은 쓰레드를 만들 수도 있었습니다. 이랬었기 때문에, 리눅스에서는 쓰레드와 프로세스의 구분이 없다는 말을 하곤 했습니다. 다른 운영체제의 프로세스 구현에 비해 프로세스를 만드는 비용이 훨씬 적게들어갔으니까요. 그래서 아파치가 2.0 으로 넘어오면서 thread 방식을 쓸수 있게 되었는데, 리눅스의 경우는 쓰레드를 쓰는 것과 프로세스를 쓰는 경우의 성능 차이가 미비했습니다. 어차피 쓰레드를 생성하는 것과 프로세스를 생성하는게 같은 방식으로 생성되었기 때문입니다.

그러나 몇 년 사이 상황이 많이 달라졌습니다. NTPL 이라는 새로운 POSIX Thread 구현체가 커널 내로 들어 오면서, 쓰레드와 fork로 만들어진 프로세스의 성격이 많이 상이해 졌을 겁니다.

아마 커널 고수님께서 답변 더 잘해주리라 믿습니다 ^^ 저도 궁금하네요... 아무도 답변을 달아주시지 않아서 일단 매우 부족합니다만 ㅜㅜ 한번 달아 봅니다.

아 그리고 자바의 경우는 플랫폼이나 구현마다 다르겠지만 그 운영체제의 쓰레드를 그대로 쓰지 않을까요? 딴 건 잘 모르겠는데 IBM 의 자바 구현체는 리눅스에서 NTPL 구현체를 사용하는 것으로 알고 있습니다 ^^

수정 : NTPL 구현체도 clone 시스템콜로 쓰레드를 생성한다고 합니다 ^^

purple의 이미지

초창기 sun의 jvm은 green thread라고 부르는 유저 레벨 쓰레드 구현을 사용했다고 합니다. 현재는 native thread 라고 하여 리눅스의 쓰레드 구현을 이용합니다.

그리고 sun jdk 1.4.2 부터 NPTL을 지원한다고 합니다.

thyoo의 이미지

http://kldp.org/node/295

Kernel이 담당한다고 보시면 됩니다.
2.6에서는 Kernel이 Thread의 존재를 알고 NPTL이 채택되어
1:1 Thread별로 스케쥴합니다.
NPTL을 개발한 redhat의 Drepper가 레지스터 문제를 해결하고
커널 개발에 참가하고 있는 그의 redhat 동료들이
Thread를 아는 Kernel로 수정했다고 하는군요.

IBM에서 나왔던 M:N NGPT란 게 있는데 커널 따로 라이브러리 따로
스케쥴합니다. 레지스터 문제가 해결되기 전에는 나름대로
설득력이 있었지만 Drepper가 그문제를 풀어 버리는 바람에
쓸데 없는 게 됐지요.

2.4에서도 1:1이지만 Kernel이 Thread를 몰라서
Process로 취급합니다. 그냥 프로세스보다 별로 가볍지 않지요.
게다가 Thread의 생사등을 관리하는 Manager Thread란 게
별도로 생성됩니다.. 그래서 Thread 하날 띄우고 ps로 보면
같은 이름으로 프로세스가 3개나 뜨지요.

NPTL로 검색하시면 자세한 정보를 얻으실 수 있을 겁니다.
___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.