커널 2.6에서 NGPT에 관한 질문입니다.

jwy22의 이미지

안녕하세요.
리눅스를 공부하고 있는 학생입니다.

리눅스 커널 쓰레드 처리문제로 고민중에 몇가지 의문점이 있어서 질문 올립니다.

제가 하고 싶은 것은 포직스 쓰레드 모드에서 커널 쓰레드를 사용하고 싶습니다.
현재 커널 2.4 버전에서는 유저 모드 쓰레드 밖에 지원 돼지 않아서 관련 자료를 찾아 보던중에
NGPT(Next Generation POSIX Threading)를 이용하면 가능한것으로 찾았습니다.
내용을 보면 커널 2.5 이상 버전에서는 커널안에 포함되어 있는 것으로 나와 있는데
제가 커널 2.6 버전으로 컴파일 후에 테스트 파일을 실행해 보았지만 결과는 유저 쓰레드 모드만 돼는것으로 나왔습니다.
제가 2.6대의 커널 컴파일 할때 빼먹은 옵션이 있는 것인지 아니면...따로 패치를 해줘야 하는것인지...
현재로서는 해답을 찾을 수가 없어서 답답합니다.
혹시라도 비슷한 문제로 고민 하시거나 해결하신적이 있으시면 관련 자료나 사이트좀 알려 주세요.

긴글 읽어 주셔서 감사합니다.

다즐링의 이미지

NPTL 로 검색해보세요.

------------------------------------------------------------------------------------------------
Life is in 다즐링

ddoman의 이미지

왜 커널 2.4에서 유저모드 쓰레드이죠??

유저모드 쓰레드가 커널에서는 1개의 프로세스로 보이고,
프로세스가 직접 스케줄링을 하는걸 말하는게 맞나요?

NGPT나 NPTL이 아니더라도 2.4 에서 유저모드 쓰레드는 아닙니다만..

kslee80의 이미지

윗분 말씀대로,
리눅스는 커널레벨쓰레드를 사용하는 OS 입니다.
물론, 유저레벨쓰레드 라이브러리도 있지만, non-preemtive 하죠. (GNU pth )

jwy22의 이미지

먼저 답변 감사합니다.
워낙에 초짜이다 보니...질문이 틀린거 같습니다.
제가 하고 싶은것은 멀티 쓰레드를 사용하고 싶어서 그렇습니다. 참고로 설치할 시스템은 듀얼 CPU입니다.
현재 시스템을 올리기전에 테스트하고 있는 것은 팬티엄 4 1.5 이고요.
2.4버전까지는 NGPL을 따로 설치해 주어야 했는데..
커널 2.5대 이상에서는 리눅스 커널에 포함되었다고 합니다. 그래서 레드헷 9.0에 커널 2.6.3을 컴파일 했습니다.
제가 간단히 테스트 하고자 프로그램을 짯거든요.
제 예상대로 라면 프로그램 결과가 "Kernel mode thread" 이 나와야 할꺼라고 생각하는데..
커널 2.6에서도 "user mode thread"라고 나옵니다.
프로그램이 잘못된것인지...제가 한참 잘못알고 있는것인지.... 답답합니다.
길잃은 양에게 길좀 열어 주십시요.
감사합니다.

=================================
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
pthread_attr_t pattr;
int scope;

pthread_attr_init(&pattr);

pthread_attr_setscope(&pattr, PTHREAD_SCOPE_PROCESS);
pthread_attr_getscope(&pattr, &scope);
if (scope == PTHREAD_SCOPE_SYSTEM)
{
printf("user mode thread\n");
}
else if (scope == PTHREAD_SCOPE_PROCESS)
{
printf("Kernel mode thread\n");
}

return 1;
}

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

cwryu의 이미지

jwy22 wrote:

pthread_attr_setscope(&pattr, PTHREAD_SCOPE_PROCESS);
pthread_attr_getscope(&pattr, &scope);
if (scope == PTHREAD_SCOPE_SYSTEM)
{
printf("user mode thread\n");
}
else if (scope == PTHREAD_SCOPE_PROCESS)
{
printf("Kernel mode thread\n");
}

user mode이냐 kernel mode이냐와 scope 속성은 상관이 없습니다. NPTL은 여전히 쓰레드와 프로세스가 1:1이기 때문에 항상 PTHREAD_SCOPE_SYSTEM입니다.

ddoman의 이미지

jwy22 wrote:

=================================
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
pthread_attr_t pattr;
int scope;

pthread_attr_init(&pattr);

pthread_attr_setscope(&pattr, PTHREAD_SCOPE_PROCESS);
pthread_attr_getscope(&pattr, &scope);
if (scope == PTHREAD_SCOPE_SYSTEM)
{
printf("user mode thread\n");
}
else if (scope == PTHREAD_SCOPE_PROCESS)
{
printf("Kernel mode thread\n");
}
else
printf( "nothing" );

return 1;
}

저는 이 소스를 그대로 긁어서 돌려봤는데, user mode thread도 kernel mode thread 도 출력되지 않고 nothing이 출력됩니다.

펜4 1CPU + 젠투 커널 2.6.3 + nptl glibc

jwy22의 이미지

답변 감사합니다. ^^

cwryu님의 답변을 보고 소스를 수정해 보았더니
항상 PTHREAD_SCOPE_SYSTEM 이더군요. ㅜ.ㅜ(왜 몰랐을까?)

부족한점이 계속 드러나는군요.

그렇다면 시스템에서 NPTL이 제대로 작동하는지 테스트 할수 있는 방법이 없을까요?
아니면 간단한 소스라도...

갈길이 멀군요...ㅜ.ㅜ

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

kslee80의 이미지

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    char v[64];
    confstr(_CS_GNU_LIBPTHREAD_VERSION, v, sizeof(v));
    printf("version: %s\n", v);
    return 0;
}

NPTL x.xx 라고 나오면 NPTL 을 사용하는 것입니다.

jwy22의 이미지

답변 감사합니다.

커널 2.6.3에서 소스를 돌려 보니 결과가

version: linuxthreads-0.10

이라고 나옵니다.

제대로 안돌아 가는 건가요?

참... 컴파일 후에 glibc를 업데이트 해주었습니다.
rpm 에러가 나서 사이트에 찾아 보니 업데이트 하라고 해서 했는데....

커널 2.4에서도 돌려봤는데..결과가 같습니다.

혹시나 해서 glibc 업데이트 안한 레드헷 9.0 에서는 결과로
NPTL 버전이 나왔습니다.
그냥 사용해도 될까요? 아니면 어떻게 고쳐줘야 할까요?

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

kslee80의 이미지

jwy22 wrote:
답변 감사합니다.

커널 2.6.3에서 소스를 돌려 보니 결과가

version: linuxthreads-0.10

이라고 나옵니다.

제대로 안돌아 가는 건가요?

라이브러리를 확인해 보셔야 하지 않을까 싶습니다.
커널 2.6 에 포함되었다는 의미는 아무래도 커널 2.6 에서 해당 라이브러리를
지원해 준다는 의미인듯 싶네요. 유저레벨 프로그램이 사용하는 라이브러리를
커널에 내장할 수는 없죠.

RedHat 계열이라면 glibc 2.3 이상부터는 NPTL 을 사용할 것이며,
Debian 에서는 sarge 나 sid 배포본에서 libc6-i686 패키지에 NPTL 이
포함되어 있습니다.

근데, 원래 글을 봐서는 NGPT 를 언급하신거 같은데..
그건 NGPT 의 메뉴얼을 보고 설치해야 하지 않을까 싶네요.

어찌되었건 간에,
올려주신 output 으로 봐서는 linuxthread, 즉 예전에 커널 2.2 대에서부터
사용되던 스레드 라이브러리를 사용하고 있네요.

jwy22의 이미지

지속적인 답변 정말 갑사합니다.
하나하나 찾아보면서 공부한다는거 재미 있으면서도 어렵네요. ^^

제가 알기로는 여러 쓰레드 중에서 하나의 IO에 사용하는 쓰레드가 다른 쓰레드를 블럭 시키고 사용하는 것으로 알고 있습니다.
그래서 여러 쓰레드가 같이 사용하고 한것이 NGPT인 것으로 알고 있구요.
제가 찾아 보니깐. NGPT가 NPTL로 합쳐 져서 개발 되었다는거 같거든요.
(http://www.kegel.com/c10k.html)
그렇다면 NPTL도 다른 쓰레드를 블럭시키지 않고 사용할수 있는 것인지 알고 싶습니다.

제가 질문은 제대로 한건지 모르겠네요.

읽어 주신것만으로도 감사합니다. ㅜ.ㅜ

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

댓글 달기

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