[완료]멀티쓰레딩 구현에 대해서...

nicemuy의 이미지

여기다가 질문을 해도 될런지 모르겠네요... 워낙 지식이 좁아서..ㅠ 다름이 아니라 현재 운영체제를 공룡책으로 공부중에 있습니다. 그런데 멀티쓰레딩 모델 부분은 설명이 너무 미약하더라구요. 사용자 쓰레드와 커널 쓰레드의 일대일 관계는 이해를 하겠는데,

일대다 다대다 이 부분은 도대체 사용자 라이브러리에서 어떤식으로 구현할수 있는지 통 모르겠습니다. 특히 일대다의 경우에는 메인쓰레드 하나만 있는 프로세스와 다를께 없는 것 아닌가요?

쓰레드 두개 이상이 커널에서 쓰레드를 지원해주지 않는 이상 두개 이상의 쓰레드 레지스터값들을 전부 저장할 수 없을텐데, 이게 어떻게 가능한지 모르겠습니다. 영문으로 구글링 해보았지만, 저의 검색능력의 한계인지 영어의 한계인지 찾질 못하겠더군요... 관련 글이나 아시는

지식이 있으시다면 답변 부탁드리겠습니다ㅠㅠ

=================================================================================================================

제가 쓰레를 올려놓고 첫 답변을 본뒤 약 한달간 확인을 못했네요ㅠㅠ 질문자로서 죄송할뿐입니다. 들어와보니 너무나 많은 답글이 달려있어. 깜짝 놀랬습니다. 미약한 실력때문에 질문을 잘했나 걱정이 됐었는데, 우문현답해주시어 많은걸 배우고갑니다^^ 답글해주신 모든분께 재답글을 달기가 힘들어 이렇게 쓰레 수정을 통해 감사드립니다..!

jachin의 이미지

검색을 해보니, 스레드의 특성에 대해 잘 설명한 글이 있어서 링크를 걸어봅니다.

http://redeyesofangel.tistory.com/428

무엇을 고민하시는 지에 대해, 제가 잘 이해하지 못하고 있어서 그렇습니다만, 사용자 스레드와 커널 스레드의 관계가 1:n 인 경우를 구현하려면, 적어도 사용자 스레드가 커널 스레드에 관여할 수 있는 커널이어야 할 것입니다. 커널이 각 코어(혹은 스레드)의 스케쥴러를 관리할터인데, 사용자 스레드를 LWP 단위의 작업으로 분석하여 커널 스레드에 분산시켜주지 않으면 안될테니까요. 아직까지 그러한 작업을 가능하게 하는 것은... Java와 비슷하게 VM이나 중간언어를 지원하는 언어의 스레드 외에는 본 적이 없는 것 같습니다. 마찬가지로 N:N도 같은 방식이라 생각합니다.

커널 스레드를 지원해주지 않더라도, 사용자 스레드 라이브러리 내의 스케쥴러로 제어하게 되니, Core 내에서의 동작 처리는 직렬로 하고, 사용자 스레드 라이브러리 스케쥴러가 각 작업을 Core의 Pipeline이나 Logical Thread Block에 맞게 정렬(Serialize)하여서, 제공할 수 있겠습니다. 이 때에는 CPU의 구조와 그러한 구조를 지원하는 라이브러리를 잘 사용하는 것이 좋겠지요. Intel Hyper Thread 기술도 이러한 맥락으로 생각하시면 좋을 것 같습니다.

프로그래밍 레벨에서의 스레드는 커널에 많이 의존하게 되지만, 코어의 캐쉬 메모리 정책에 따라 달라질 수 있으니, 커널 내의 스레드 처리 방식에 대해서도 확인해보시면 도움이 될 것 같습니다.

nicemuy의 이미지

제가 아직 내공이 부족하여 답변해주신 말을 다 소화하지는 못했네요... 다만 적어도 1:n 인 경우를 구현하기위해서 사용자 쓰레드가 user mode가 아닌 kernel mode에서 돌아야 된다는 말씀 이신가요?

그렇다면 이해를 할 수 있겠네요...! 공룡책에는 1:N관계에서 사용자 라이브러리가 kernel mode에서 작동한다는 그 어떠한 얘기가 없어서 user mode로 줄곧 생각했었습니다만... 답변 감사합니다.

jick의 이미지

1:n을 구현하기 위해서 사용자 쓰레드가 kernel mode에서 돌아야 할 이유는 없습니다. 정확히 왜 kernel mode가 필요하다고 생각하시는지요?

jachin의 이미지

저도 예전에는 SMP가 되는데, 왜 스레드 프로세스는 하나의 코어에서밖에 못 돌릴까 불만갖았었거든요. ^^;;;

논리적으로 이루어진 스레드라 할지라도, 물리적으로 병렬 연산이 되기를 바라는 마음에서 생각하시는 것이 아닐까요?

하지만 옛날을 생각해보면, SMP 가 흔한 시절엔 aSMP가 불가능하다고 사람들이 생각해왔지만,

지금은 전자공학 발전과 가상화 기술 덕분에 SMP인지, aSMP인지 구분하지 않게 된 시대가 된 것 같아요. ^^;

언젠가 기술이 발전하면, 스레드 처리도 더 똑똑하게 처리되지 않을까 싶어요.

익명 사용자의 이미지

스레드란게 하나의 코어에서 돌리기 위한 실행 단위 개념인데 왜 하나의 코어에서밖에 못 돌릴까 불만이라니 이게 말이나 되는 소린지...ㅋㅋㅋ

근데 SMP는 뭐고 ASMP는 뭐고 SMP랑 ASMP랑 무슨 차이가 있는지는 알고 이런 답글 쓰시는거예요?

님이 답글 내용을 보면 남한테 조언해 줄 수준이 아닌거 같은데 좀 망상끼가 있으신듯...

jachin의 이미지

대칭형 다중 처리 방식과 비대칭형 다중 처리 방식까지 세세하게 설명해주시면 감사하겠습니다. (_ _) ~ 꾸벅

스레드를 하나의 코어에서 돌리기 위한 단위로 인식한다면, 하나의 코어만 갖는 장치에서 왜 스레드를 쓰겠습니까.

조언을 위한 조언을 하고 싶지는 않습니다. 모두가 같이 알아갈 수 있는 좋은 내용을 얻을 수 있다면야,

개소리든 뭐든 계속 하겠습니다. :)

익명 사용자의 이미지

님이 답글 다는 수준을 보면 프로그래밍을 제대로 배워본 적도 없고 현재 프로그래밍과 관련된 분야에서 일하는 것도 아니라는걸 쉽게 알수있죠.

그런 사람이 왜 자꾸 말도 안되는 개소리같은 답글을 여기저기다 질러대느냐니까 무슨 소린지 이해가 안되요?

jachin의 이미지

'넌 모르면 닥쳐 XX야.' 라고 말씀하시는 거 잘 알고 있습니다.

예전에도 그런 분위기가 만연했었습니다.

덕분에 누구나 자신의 의견이나 알고 있는 사실을 알리기 거북해했죠.

한참 그러고나니, 누구나 답변을 올리기 꺼려하게 되었습니다.

아는 분들은 아니까 답변을 하지 않고,

모르는 분들도 지적받을까봐 답글을 올리지 않았습니다.

그러나 질문자들은 계속 늘어났죠.

그 때 닥치라고 하신 분이 지금 나타나 또 '모르면 닥쳐' 라고 외치고 계시니,

현재 상황을 잘 모르시는 분이라 생각하여서 글을 남깁니다.

친절하게 답글을 남기고,

실수를 하여도 포용하는 분위기를 남기기 위해 노력하는 중입니다.

재미로 사람들의 무지를 들추고, 우월감을 얻을 정도로 정신연령이 낮은 사람이

사람들에게 친절한 답변을 할리는 만무할터이니,

그냥 하시던 대로 계속 답글 남겨주시기 바랍니다.

unipro의 이미지

익명 분이 이 문제에 대해서 잘 아시는 것 같네요.
이 분이 어떤한 설명을 해줄지 궁금합니다.
(저 역시 친절한 설명을 바라지 않아요.)
어떤 대답을 해줄지 기대하며 종종 이 쓰레드에 들어올께요.

내 블로그: http://unipro.tistory.com

jachin의 이미지

링크된 게시물을 보시면 아시겠지만,
user mode 에서의 스레드를 kernel mode 에서 실행하지는 않습니다.
user mode에서의 스레드는 그래도 user mode 에서 돌게 됩니다.
1:n 을 커널모드에서 돌려면 커널에서도 그에 맞는 API를 제공해줘야 하지만,
그런 경우가 아직 없습니다.

익명 사용자의 이미지

잘 이해하지 못하고 있으시면 답글 달지 마시길... 님같이 말도 안되는 답글을 달면 초보자들이 더 헷갈려져요.

jachin의 이미지

제가 잘못 이해하고 있나봅니다.

혹, 설명해주실 수 있으시면 답글 남겨주시지 않으시겠습니까?

익명 사용자의 이미지

아예 기본 개념 자체가 없으신분 같아요. 직업이 뭔지 물어봐도 돼요? 프로그램 한번도 안짜본 분인거 같은데...

sohn9086의 이미지

당신 역시 예의에 대한 개념이 없는 정도가 만만치 않아요

생산적인 댓글을 달자

익명 사용자의 이미지

맞든 틀리든 댓글 단 사람의 직업이 뭐 그리 중요한가요?

누가 질문했을때 자기가 알고 있는 내용이 있으면 그 영역내에서 최대한 알기 쉽게 설명해 주면 되는 것이고,
만약 다른 사람이 잘못 알고 있어서 잘못 설명했다거나 이해하기 어렵게 설명했다면 그 내용을 바로 잡아 주면 되는 것이죠.

이 곳은 프로그래밍과 관련되서 알고싶은 내용과 알려주고 싶은 내용이 중요한 것이지
글을 적는 사람의 직업이 중요한 곳이 아니죠.
(프로그래밍 QnA니까)

익명 사용자의 이미지

"만약 다른 사람이 잘못 알고 있어서 잘못 설명했다거나 이해하기 어렵게 설명했다면 그 내용을 바로 잡아 주면 되는 것이죠."

+1.

alwaysN00b의 이미지

익명으로 댓글다신분은 익명으로 다시면서 직업을 물어보니... 본인 직업, 아이디도 밝히기 무서운가 보군요. 익명으로 글써지는데가 몇군데 없다보니 따 당하다가 여기와서 저러는군요.

언제나 시작

익명 사용자의 이미지

제가 알기론 user mode thread는 선점형(preemtive)가 아니라 협력형?(cooperative)으로 구현되는 것으로 알고 있습니다. 하나의 커널 쓰레드위에 존재하는 n개의 유저모드 쓰레드들이, 서로 control을 양보하는 거죠.

1. CPU 레지스터 집합을 저장/복원하는거야 유저모드라고 해서 불가능할 이유가 없어 보입니다. 어셈블리 코드로 r0, r1, r2 ..., sp, ip를 특정한 메모리에 저장하고, 전환할 유저쓰레드의 컨텍스트가 저장된 메모리로부터 다시 r0, r1, r2 ..., sp, ip를 복원하면 되니까요. 물론 privilege가 필요한 특수한 컨트롤 레지스터는 제외하고요.

2. 유저 모드 쓰레드 A가 blocking에 들어갈 때, 다음에 깨어날 유저모드 쓰레드 B를 찾아서 1.의 방식으로 깨워(?) 줍니다. 정확히는 깨운다기보다는 현재 컨텍스트를 B의 컨텍스트로 치환하는거겠지요.

3. 유저모드 쓰레드를 구현하는 라이브러리는 2에 해당하는 기능을 제공하겠지요. 가령 userthread_sleep()이라는 함수가 있다고 하면, 이 함수는 실제로 커널 쓰레드를 sleep 상태로 넣는게 아니라, 현재의 컨텍스트와 깨어날 조건을 저장한 뒤, 다른 유저모드 쓰레드들 중에서 깨어날 수 있는 녀석을 찾아내서 저장된 컨텍스트를 현재 커널 쓰레드 컨텍스트로 복원, 그대로 실행에 돌입하는거죠.

더 잘 아시는 분들로부터 개념없다고 질타받을까 두렵기도 하지만, 일단 아는대로 써봅니다.

jachin의 이미지

사실 스레드에 대한 설명이 자세히 잘 되어 있는 글들도 많지가 않아서요...

좋은 답변 달아주실 때마다 감사하게 생각하고 있습니다.

익명 사용자의 이미지

인터넷에 널리고 널려 있는게 스레드에 대한 설명이 자세히 잘 되어 있는 글인데

님만 아직 못 읽어본거임...

jachin의 이미지

링크라도 많이 달아주세요. :) STUF라고 욕하지 않을께요.

익명 사용자의 이미지

보니까 학업고민 진로고민 글에 아주 ㅈ같이 말도 안되는 내용을 답글이라고 달아놨던데...

본인이 좀 커리어가 쌓인 유능한 개발자 아니면 쪽팔려서 못쓸거 같던데

지금까지 해본 프로젝트나 만들어본 프로그램이 하나라도 있어요?

jachin의 이미지

아익후, 제가 주제 넘게 다른 분들의 학업 고민, 진로 고민에 답글을 올렸습니다.

커리어가 어디 쌓였겠습니까? 키보드 워리어질에 내공만 쌓였지요.

지금까지 해본 프로젝트도 하나~ 없고, 만들어 본 프로그램도 없습니다요. (_ _) 굽슨굽슨

익명 사용자의 이미지

님도 트롤한테 먹이 그만 주세요.

jachin의 이미지

.....

nicemuy의 이미지

라이브러리에서 context switching을 직접 해주는 거군요... 너무 늦게 답글달아서 보실진 모르겠지만, ip레지스터의 경우 유저모드에서도 접근이 가능한 레지스터 인건가요?

익명 사용자의 이미지

아래 글을 보셨으면 아시겠지만 일단 C의 setjmp/longjmp를 쓰는 방법이 있겠구요

x86어셈으로 직접 한다면 스택을 이용하는 방법이 있겠죠

mov eax, XXXXX
push eax
ret

이게 제대로 된 어셈인가는 모르겠습니다만 ㅎㅎ 대충 어떤 식인지는 감잡으실 듯

아키텍쳐에 따라선 직접 범용레지스터->ip가 가능한 경우도 있겠죠.. 다만 개인적으로 요즘 프로세서는 워낙 캐시나 분기 예측 같은 게 복잡해서, 그래도 되는건지는 잘 모르겠네요.

oosap의 이미지

상당히 어려운 질문 같습니다.
저도 예전이라면 질문 자체를 이해를 못했을 거예요.
왜냐면 우리가 흔히 다루는 OS 는 윈도우즈 아니면 리눅스니까요.
아마 이 둘은 1:1 일겁니다. 그래서 이런 고민을 하는 실무자는 본 적이 없습니다.

유닉스는 N:M 이나 1:1 이 아닌 방식으로 사용할 수 있는 것 같아요. 그에 대해 짧게나마 설명된 책이 제가 지금 읽고 있는 C++ Network Programming Vol1. 입니다. 1권의 5장에 보면 간단히 언급이 되어있습니다. 그리고 관련 논문들도 조금 언급이 되어있어요.

Solaris, LWP, [ABLL92] 등등의 내용이 나오는데 저는 이쪽은 전혀 관심이 없어서 슥 보고 넘어갔습니다. 그래서 잘 몰라요...

이 책 해당 부분을 찾아보심 힌트가 있지 않을까 싶습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

저도 잘 모르지만 윈도우에서도 fiber라는 게 유저 모드 쓰레드 역할을 하는 것 같습니다.

http://blogs.msdn.com/b/larryosterman/archive/2005/01/05/347314.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682661%28v=vs.85%29.aspx

ps.
틀렸으면 틀렸다고 지적해주세요.. 모르면 닥치라고 면박만 주지 마시고. 저도 초보자예요.

oosap의 이미지

제가 알려드린 책에서 해당 부분을 다시 읽어보았습니다. 덕분에 저도 이 부분을 조금 기억할 수 있게 되었네요.

일대다 다대다 이 부분은 도대체 사용자 라이브러리에서 어떤식으로 구현할수 있는지 통 모르겠습니다.
특히 일대다의 경우에는 메인쓰레드 하나만 있는 프로세스와 다를께 없는 것 아닌가요?
쓰레드 두개 이상이 커널에서 쓰레드를 지원해주지 않는 이상 두개 이상의 쓰레드 레지스터값들을
전부 저장할 수 없을텐데, 이게 어떻게 가능한지 모르겠습니다. 
영문으로 구글링 해보았지만, 저의 검색능력의 한계인지 영어의 한계인지 찾질 못하겠더군요...

먼저 N:1 즉 사용자 쓰레드 모델이 등장하고
이후 1:1 즉 커널 쓰레드 모델이 등장하였고
그 다음 N:M 즉 혼합쓰레드 모델이 등장한 것 같습니다.

1:1 이 윈도우즈나 리눅스의 기본적인 구성이라서 이해가 제일 빠를 겁니다.
N:1 은 사용자 쓰레드 모델인데 이게 궁금하신 것이죠. 책에보면 쉽게 설명되어있네요. 간단히 말해서 커널은 멀티쓰레드라는 걸 알아채지 못하고 있다는 것입니다. 그러니까 궁금해하시는 레지스터 값의 스위칭(컨텍스트 스위칭)과 같은 일은 일어나지 않을 것입니다. 커널 에서 제공하는 하나의 쓰레드를 사용자 라이브러리 수준에서 임의로 CPU 시간을 분할해서 N 개의 사용자 쓰레드들에 할당해주는 것이니까요. 이런 방식이 사용된 예가 HP-UX 10.20, SunOS 4.x 라고 합니다.

이 모델에서는 문제가 크게 두가지가 있는데
하나는 멀티 CPU 인 경우에 커널에서는 사용자 쓰레드를 인지하지 못하기 때문에 사용자 쓰레드를 각 CPU 로 분산할 수 없다는 겁니다. 한 프로세스의 모든 쓰레드는 한번에 한 CPU 상에서 경쟁하게 되는 것이죠.(프로세스 경쟁범위)

두번째는 프로세스의 한 쓰레드가 IO 블록에 빠지면 해당 프로세스의 모든 쓰레드가 블록 상태가 된다는 겁니다. 허거덩!

그 다음의 1:1 모델은 잘 아실테고요,

마지막으로 솔라리스에서는 이 두가지 쓰레드 모델을 사용자가 맘대로 선택할 수 있도록 하는 혼합모델 즉 N:M 을 도입한 것 같아요. 여기서 나오는 문제의 해결책이 제가 위에 적어놓은 LWP, [ABLL92] 이런 거네요.. 그런데 솔라리스 프로그램 할 때 정말 N:M 으로 쓸까요? 제게는 머리만 아프네요.

1. 특히 일대다의 경우에는 메인쓰레드 하나만 있는 프로세스와 다를께 없는 것 아닌가요?
 
2. 쓰레드 두개 이상이 커널에서 쓰레드를 지원해주지 않는 이상 두개 이상의 쓰레드 레지스터값들을
전부 저장할 수 없을텐데, 이게 어떻게 가능한지 모르겠습니다. 

1. 1:N 의 경우 커널 입장에서는 말씀하신 것과 동일합니다. 다만 사용자 쓰레드 N 개가 주어진 CPU 를 정해진 스케줄링 알고리즘으로 나눠서 쓰겠지요. 이럴 때 위에서 처럼 두가지 문제가 등장하겠고요..

2. 이 부분은 이 책 C++ Network Programming 에서도 분명한 설명은 없습니다만, 이렇게 얘기하네요. 커널이 하나의 프로세스 내의 여러 쓰레드간의 문맥전환에는 전혀 신경쓰지 않는다고요. 그래서 문맥전환이 매우 가벼운 장점이 있다. 그렇지만 이에 따르는 문제점도 있고요 (위에 두가지). 이말로 미루어 짐작해 보면 1:N 에서는 레지스터 세트의 문맥전환은 프로세스간에서만 이루어진다고 생각해야 할 것 같아요. 한 프로세스 내의 쓰레드간의 문맥전환에서는 레지스터 세트의 스위칭은 일어나지 않는 것이죠.

2번은 저의 추측이 포함된 의견이 되겠습니다.

헉헉 힘들군요. 저도 배웠습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

유저모드쓰레드도 레지스터셋, 그러니까 문맥의 전환이 일어나는 것으로 알고 있습니다. 범용 레지스터들과 인스트럭션포인터, 스택포인터가 바뀌는 거죠. 그렇지 않으면 쓰레드라 불리지 않겠죠.

다만 커널 기반 쓰레드는 실시간 타이머 인터럽트가 발생할 때 커널이 강제로 문맥을 전하는데 반해, 유저 모드 쓰레드는 자기가 자발적으로 다른 유저 모드 쓰레드로 문맥을 전환해줘야 한다는게 다릅니다. 따라서 유저 모드 쓰레드가 지멋대로 블록 상태에 들어가면, 같은 커널 쓰레드 위에 올라와 있는 다른 유저 모드 쓰레드들 전체가 먹통이 되는거죠.

그래서 보통 유저 모드 쓰레드를 구현하는 라이브러리는 블러킹될 만한 함수들을 libc 수준에서 다른 유저모드 쓰레드의 문맥으로 전환(스케쥴)되도록 구현되는 것으로 압니다. 즉 사용자 프로그램이 sleep(), read() 등을 호출하면 실제 sleep이나 read 시스템콜을 호출하는게 아니라(그럼 현 커널 기반 쓰레드에 올라와있는 다른 유저모드 쓰레들이 먹통이 되니까), 현재 문맥을 저장하고 다른 유저모드 쓰레드의 문맥을 현재 레지스터셋으로 읽어들이는거죠.

익명 사용자의 이미지

10년도 전에 공부한거라 지금 검색해도 관련 내용을 잘 찾을 수가 없네요. 그때도 책을 보고 공부한건 아니라..

다음 링크에서 유저 모드 쓰레드를 구현하는 하나의 방법을 제시하고 있네요.
http://www.cs.ucsb.edu/~chris/teaching/cs170/projects/proj2.html

Implementing a user space thread library seems like a daunting task at first. This section contains a number of hints and directions on how you could approach the problem.

First, you will need a data structure that can store information about a single thread. This data structure will likely need to hold, at least, information about the state of the thread (its set of registers), information about its stack (e.g., a pointer to the thread's stack area), and information about the status of the thread (whether it is running, ready to run, or has exited). This data structure is often called a thread control block (TCB). Since there will be multiple threads active at the same time, the thread control blocks should be stored in a list or a table (array). To make it easier, you can assume that a program will not create more than 128 threads.

You will likely need a routine that initializes your thread subsystem. This init routine should be called when the application calls pthread_create for the first time. Before that, there is only one thread running (the main program), and there is not much you need to do.

Once multiple threads are running, you will need a way of switching between different threads. To do this, you could use the C library functions setjmp and longjmp. In a nutshell, setjmp saves the current state of a thread into a jmp_buf structure. longjmp uses this structure to restore (jump back) to a previously saved state. You will find these functions very useful, since they do exactly what is needed when switching from one thread to another and later resuming this thread's execution. More precisely, you can have the currently executing thread call setjmp and save the result in the thread's TCB. Then, your thread subsystem can pick another thread, and use the saved jmp_buf of that thread together with longjmp to resume the execution of the new thread.

The process of picking another thread is called scheduling. In our system, we want to have a very simply scheduler. Just cycle through the available threads in a round robin fashion, giving an equal, fair share to each thread.

Following the discussion about setjmp and longjmp, there is one question that should immediately arise: How can we force the thread of a program to call setjmp every once in a while (and thus, giving up control of the CPU)? In particular, application developers do not need to know about your thread implementation, so it is unlikely that they will periodically call setjmp and allow your scheduler to switch to a new process. To solve this issue, we can make use of signals and alarms. More precisely, we can use the ualarm or the setitimer function to set up a periodic timer that sends a SIGALRM signal every X milliseconds (for this project, we choose X to be 50ms). Whenever the alarm goes of, the operating system will invoke the signal handler for SIGALRM. So, you can install your own, custom signal handler that performs the scheduling (switching between threads) for you. For installing this signal handler, you should use sigaction with the SA_NODEFER flag (read the man page for sigaction for details). Otherwise (e.g., when using the deprecated signal function, alarms are automatically blocked while you are running the signal handler. This is something that we clearly do not want for this project.

1. 일단 레지스터셋 전환을 위해 (굳이 어셈블리 코드를 쓰지 않고서도) setjmp와 longjmp를 사용하네요.
2. 스케쥴링을 일일히 응용프로그램이 수동으로 하게 하거나 (위에서 쓴 것처럼) libc 수준에서 블러킹 함수들을 바꾸거나 하는게 아니라, SIGALARM을 쓰네요.

raymundo의 이미지

오, 이 링크의 글 좋네요. 유저 모드 스레드 구현에 대해 감이 딱 오게 잘 쓰여진 것 같습니다 ^_^

좋은 하루 되세요!

nicemuy의 이미지

이글보니까 이해가되네요... 정말 감사합니다ㅎ

oosap의 이미지

오류를 잡아주셔서 감사합니다

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

이곳에서 유별나게 버럭하시는 익명님이 계신대요,
제가 최근에 서명을 바꿨습니다. 오픈소스 라이센스 문구에서 차용한건데요,
공개된 해당 소스로 인한 어떠한 법적 책임도 공개자에게 없다는 걸 보통 밝히더라구요.
오픈소스라는게 소스를 오픈하면서 그 사용에 따른 책임은 전적으로 사용자가 지도록 하지 않나요?
소스를 오픈한 사람이 어떤 부작용에 대해서도 책임을 지지는 않지요.

포럼에서의 답글들도 마찬가지로 생각했습니다. 포럼은 그냥 포럼일 뿐 답글이 틀렸다고 닥치고 있으라는 식의 지적질은 오픈소스 문화와 어울리지 않는 것 아닌가요?

모든 공개 소프트웨어들이 마찬가지로 모든 사람에 의해 발전해 나가는 것이잖아요. 모든 사람의 소유이기도 하고요.

그런 의미에서 누군가를 깍아내리기보다는 오류를 바로잡아주는 게 필요하지 않을까... 싶고, 그래서 제 서명을 그렇게 지었지요. 익명님, 어떻게 생각하시는지 궁금합니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

+1. 동감합니다. 저 익명이 지금 원하고 있는 게 뭘까 궁금하네요.

익명 사용자의 이미지

한 사람은 좋은 의도였지만 안타깝게도 질문을 제대로 이해하지 못했고(무안하시겠음). 한 사람은 오로지 이 사람을 무안주려는 의도만으로 여러 개의 쓰레기 댓글을 달고 있고. 다른 사람들은 보다 못해 댓글을 달고 있고.

그런데 이 많은 댓글 중에서 조금이나마 질문과 관련있는 댓글은 오직 하나 뿐.
저것보다 더 영양가 있는 진전된 댓글이 달리기를 바래봅니다. 질문자는 학생 같은데, 여길 뭐라고 생각하겠어요. 여기에 날고 기는 전문가들 얼마나 많은데.

jachin의 이미지

KLDP에 많은 고수분들이 계시지만, 정작 질문 게시판에서는 등장이 뜸하셔서, 예전처럼 활발하게 활동하셨으면 하는 마음입니다.

누구를 공격하기 위해서나, 특정 목적을 위해서 질문 게시판에 답글을 쓰는 것은 아니라고 생각합니다.

질문자에게 조그마한 친절을 베풀 수 있는 정도라면 딱 적당하지 않겠습니까? :)

익명 사용자의 이미지

지금도 활발하게 활동하는 것 같은데..
RTFM이라고 댓글 달거나, 잘 모르면 깝치지 말고 닥치라고 하거나..
내가 보기에 이러는 사람들은 고수들임. 아이디 있는.

laerad84의 이미지

익명으로 글쓰기....
질문은 익명(가능)으로 답글은 기명으로 하는게 좋을듯싶네요. 말돌려가면서 까기 하시는 익명분들이 너무많아요. 글 내용도 이상한데로 흘러가고.

turningPoint의 이미지

적어도 엔지니어는 논리적이여야 합니다.
즉, 잘못되었다고 생각되는 부분들이 있으면 자신의 논리를 증명하면 되고 그것이 귀찮으면 그냥 넘어가시면 됩니다.
근데 왜 꼭 그것도 익명으로 답변자(설사 그것이 잘못된 답변이라고 하여도) 감정을 건드리는건지.

지금도 활발하게 활동하시는 고수분들 많으시다고 하는데 전 그다지 공감이 안되는군요.
정말로 잘 모르면 깝치지 말고 닥치라고 하는 분이 정말 Guru의 경지라고 한다면 .
정말 특정 주제에서는 Expert 인지는 모르겠으나 커뮤니케이션 능력은 빵점인듯 합니다.

불과 몇년전부터 SO 때문에 별로 들어올 일이 없지만 가끔 한번씩 kldp한번씩 들어오면서 이런 익명글들 보면 우리나라 IT 미래가 정말 우울해 보이네요. (안그래도 우울하지만...)
정확히 딱 10년전 2002년도 kldp와 지금 kldp 수준이 넘 비교 됩니다. 글의 수준이 아니라 태도에서 말이죠.
우리 모두 자중합시다.

fox9의 이미지

웬지 kldp의 예전 글이 생각나는 글타레라 조금 우울하네요.

질문하신 분은 아래 링크 한번 쭉 읽어보셔도 도움이 될듯 합니다.

http://kldp.org/node/295

oosap의 이미지

객체지향의 핵심적인 특징중 하나가 다형성이죠.
이쪽에서 보면 이런 것이지만
다른 쪽에서 보면 또 다른 것이 될 수 있다는 것이죠.
이런 극단적인 대립에 직면하게 되는 상황을 보면서
그 순간에 당사자가 다형적 사고를 할 수 있는 훈련이 되었었다면,
내가 알고 있는 것과 다른 실체가 저 넘어에 있을 수도 있다고 쉽게 받아들일 수 있겠다 생각했었습니다.
그래서 프로그램도 객체 지향적으로 하지만 생각도 객체지향적으로 해야겠다는 엉뚱한 공상을 한 적이 있습니다.
생각을 함수형으로 한다면 어떤 좋은 점이 있을까요?

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

댓글 달기

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