쓰레드 vs 프로세스

익명 사용자의 이미지

질문이 좀 포괄적인데요...(왜냐면 제가 잘 몰라서리...)

얼핏 생각하기에 일반적으로 다중쓰레드를 사용하는 것이 다중 프로세스
를 사용하는 것보다 더 뛰어날 것 같습니다. 생성부하나 문맥교환 및 서로
간의 통신 등등...

근데 항상 쓰레드를 사용하는 것이 유익하지만은 않다고 들었습니다. 근
데 구체적으로 어떻게 그런지 잘 모르겠네요. 제가 가진 몇몇 유닉스 프로
그래밍 책(스티븐스)에서는 옛날책이라서 그런지 쓰레드를 사용하는 예가
없는 듯 싶던데(사실 제대로 읽어보지도 않았지만...^^)

실제 사례나, 기술적인 면에서의 조언 등등, 가급적 많은 얘기를 듣고 싶
습니다. 어떤 것을 쓰는 것이 더 나은지에 대한 판단기준이라든지, 실제
개발에서 쓰여진 예를 들을 수 있었으면 좋겠네요.

그럼 저의 우문에 대한 고수님들의 현답을 부탁드립니다. 꾸벅~

--> 추가질문인데요, 그럼 네트웍 서버를 만들 경우는 어떤가요? 전에 공
부차원에서 자바로 간단한 서버를 만들었는데, 그땐 쓰레드를 썼거든요...
(사실 자바는 프로세스가 하나니까 어쩔 수 없지만) 근데 아파치 웹서버
의 경우 프로세스를 아예 여러개 띄워놓고 동작하는 거 같기도 하고... 거
참 어렵네...

익명 사용자의 이미지


자세한 것들은 구루 분들께서 올려주시겠지만, 제가 아는 한도내에서
말씀드리자면 쓰레드는 아래와 같은 단점이 있습니다.

* 보안 취약
* 프로그래밍이 난해 (locking 관련)

익명 사용자의 이미지

fork()와 쓰레드...

글쎄여 저도 때론 쓰레드를 사용하고 때론 fork를 사용하지만..
일단 저같은경우는 쓰레드를 쓸때는 프로세스간의 커뮤니케이션이
많을때는 쓰레드를 사용합니다만..

쓰레드의 가장 큰장점이자 프로그램을 난해하게 만드는게 ..
프로세스간 데이터교환이랄까요??
쉽게 공유는 되지만 lock과 unlock문제지여 즉 쓰레드 스케줄링이 좀 난해
하게 만들지여 ^^*
이거 또한 메모리 공유와 동일한 개념이겠지요..

그런데 어디선가는 쓰레드를 남발하지 말라는 글이 있더군요 ^^*

아무튼 참 어려운 문제지여 ^^*

익명 사용자의 이미지

실질적 프로그래밍이 아닌 이론적인 면에서만 볼 때...

리눅스에서의 쓰레드는 순수하게 유저 영역에서만 지원됩니다.(P_THREAD)

이는, 커널이 지원하는 쓰레드보다 속도가 빠르고 구현이 비교적 단순

하다는 장점이 있습니다.

하지만, 크게 다음의 문제점이 있습니다.

우선, 스케줄링의 단위가 스레드가 아닌 프로세스이기 때문에, CPU 가

여러 개라고 하더라도 단일 프로세스의 스레드는 모두 하나의 CPU에서만

돌아가게 됩니다. ( 이것이 리눅스에서 smp가 약한 구조적 이유중

하나입니다. )

그리고, 여러 개의 스레드 중 하나가 BLOCK되어 버리는 현상이 발생하면

프로세스의 스레드 전체가 BLOCK 되어 버립니다.

참고로, solaris2 혹은 NT 계열은 모두 kernel thread에다가 user thread

를 매핑할 수 있기 때문에, 위의 문제점이 모두 해결됩니다.

(다만, 구현이 복잡하고, 속도가 순수 user thread보다 약간 느립니다.)

쓰레드에 대한 더욱 자세한 정보는.. "Unix Internal"이란 책을

참조하시면 될 듯..

익명 사용자의 이미지

> 실질적 프로그래밍이 아닌 이론적인 면에서만 볼 때...
>
> 리눅스에서의 쓰레드는 순수하게 유저 영역에서만 지원됩니다.(P_THREAD)
>
> 이는, 커널이 지원하는 쓰레드보다 속도가 빠르고 구현이 비교적 단순
>
> 하다는 장점이 있습니다.
>
> 하지만, 크게 다음의 문제점이 있습니다.
>
> 우선, 스케줄링의 단위가 스레드가 아닌 프로세스이기 때문에, CPU 가
>
> 여러 개라고 하더라도 단일 프로세스의 스레드는 모두 하나의 CPU에서만
>
> 돌아가게 됩니다. ( 이것이 리눅스에서 smp가 약한 구조적 이유중
>
> 하나입니다. )

리눅스가 쓰레드를 구현하는 것은 clone() system call을 사용합니다.
쓰레드를 프로세스 처럼 구현을 하는데, 쓰레딩 모델로 치면 one to one 방식이지요
그래서 프로세스에서 쓰레드를 만들면 여러개의 시피유를 탈수 있습니다.
( 스케쥴러 입장에선 쓰레드가 그냥 프로세스처럼 보이니까요)

http//pauillac.inria.fr/~xleroy/linuxthreads/faq.html#A

K.1 What is the implementation model for LinuxThreads?
LinuxThreads follows the so-called "one-to-one" model each thread is actually a
separate process in the kernel. The kernel scheduler takes care of scheduling the
threads, just like it schedules regular processes. The threads are created with the
Linux clone() system call, which is a generalization of fork() allowing the new process
to share the memory space, file descriptors, and signal handlers of the parent.
Advantages of the "one-to-one" model include

minimal overhead on CPU-intensive multiprocessing (with about one thread per processor);
minimal overhead on I/O operations;
a simple and robust implementation (the kernel scheduler does most of the hard work for
us).
The main disadvantage is more expensive context switches on mutex and condition
operations, which must go through the kernel. This is mitigated by the fact that context
switches in the Linux kernel are pretty efficient.

> 그리고, 여러 개의 스레드 중 하나가 BLOCK되어 버리는 현상이 발생하면
>
> 프로세스의 스레드 전체가 BLOCK 되어 버립니다.

위와 같은 이유로..
이런일은 락을 잘못 설정하지 않는한 리눅스에서는 발생하지 않습니다.

>
> 참고로, solaris2 혹은 NT 계열은 모두 kernel thread에다가 user thread
>
> 를 매핑할 수 있기 때문에, 위의 문제점이 모두 해결됩니다.
>
> (다만, 구현이 복잡하고, 속도가 순수 user thread보다 약간 느립니다.)
>
> 쓰레드에 대한 더욱 자세한 정보는.. "Unix Internal"이란 책을
>
> 참조하시면 될 듯..

쓰레딩 모델에 관한 참고 자료
http//www.bell-labs.com/topic/books/os-book/slide-dir/ch5.ppt

ps. 그리고 리눅스 내부에서(2.4.x)도 커널 쓰레드가 사용됩니다.
디바이스나 여러 특정 서비스를 커널 쓰레드를 사용해서 작업을 하지요...

익명 사용자의 이미지

p_thread 가 kernel 과 무관하게 구현되었다고 생각했었는데 아니었군요

... 책만 보다 보니 --;

아무튼 정정에 감사드립니다 -)

댓글 달기

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