리눅스 상에서 Process = Thread 라고 봐도 상관 없나요?

익명 사용자의 이미지

별도의 스레드를 생성 후 스레드에서 fork 후 exec으로 넘겨줘도 메인 프로세스(스레드)는 죽지 않더군요...

그러면 (프로세스 = 스레드)이다 라고 봐도 부방할 것 같은데 내부적으로 무슨 차이가 있나요?

스레드도 pid 값을 부여 받는다고 하던데... 그럼 완전 Process = Thread 아닙니까!!?

jachin의 이미지

간만에 Q&A 게시판에 왔는데, 스레드 주제로 질문이 많아서 놀랐습니다.

스레드에서 fork 를 하고, exec 으로 뭘 넘겨주셨는지는 모르겠습니다만...

Thread 와 Process 는 엄연히 다르지요. :)

제일 큰 차이점은 데이터 교환방식, 즉, 통신방식이 틀립니다. 프로세스간 데이터를 전달할 때에는 IPC 를 쓰고, I/O 스택들을 사용하니 느립니다.

Thread 간에는 공유 메모리 영역이나 Mutex 를 지정해서 통신하며, 메모리를 통해 데이터를 전달하므로 빠릅니다.

다른 질문의 내용을 보시면 PID와 TID가 별도로 존재하는 것을 아실 수 있으실 겁니다. 즉, 스레드가 100개 있어도 PID 는 하나입니다.

글쓴이의 이미지

답변 감사합니다.

세벌의 이미지

"틀리지요" 라고 하면 아니되지요. "다르지요" 라고 해야죠.

언제나 친절한 답변을 해주시는 jachin 님께 괜히 트집잡아봅니다 :p

jachin의 이미지

세벌님도 자유게시판에 번역 질문 올리실 때, 잘 올리셨어야죠~ :P

어서 질문하는 방법 읽고 오세요.

익명 사용자의 이미지

Quote:
When fork(2) is called in a multithreaded process, only the calling thread is duplicated in the child process.

http://man7.org/linux/man-pages/man3/pthread_atfork.3.html

Quote:
To make the remainder of the discussion of CLONE_THREAD more readable, the term "thread" is used to refer to the processes within a thread group.

http://man7.org/linux/man-pages/man2/clone.2.html

프로세스가 무엇이고 스레드가 무엇이며 리눅스의 스레드가 프로세스인지 아닌지 구분하는 게 의미가 있을 수도 있겠지요. 하지만 어차피 인공적인 개념일 뿐이고 필요에 따라 바꿀 수 있는 것들인데, 저는 제가 필요한 상황에서 리눅스의 스레드들이 어떻게 동작하는지만 이해할 수 있다면 정확한 정의나 구분 같은 것에는 아주 자세하게 따지고 싶지는 않습니다. 학부 운영체제 시험 준비 중인 게 아니라면요.

글쓴이의 이미지

답변 감사합니다.
저도 스레드들이 어떻게 동작하는지만 이해하고 프로그램을 만들었는데
포플에서 명확한 단어?, 흐름? 을 적어야 해서 혼란이 오기 시작했습니다...ㅜ

글쓴이의 이미지

스레드 생성 후 스레드에서 exec를 하고 종료를 하면 메인 스레드 까지 종료되는 것이 아니라 생성한 스레드만 종료되서 질문을 했습니다.
exec는 프로세스를 대체 한다는 뜻인데 실제로 사용하면 프로세스 대체가 아닌 함수를 실행한 스레드를 대체하는 것으로 보여 Process = Thread 라고 생각했습니다.

익명 사용자의 이미지

그거 확실한가요?

Quote:
Note the following further points:

* All threads other than the calling thread are destroyed during an execve(). Mutexes, condition variables, and other pthreads objects are not preserved.

http://man7.org/linux/man-pages/man2/execve.2.html

직접 실험해 보신 것 같아서 조금 조심스럽습니다만 한번 더 확인해 보시는 건 어떨까요?

글쓴이의 이미지

제가 틀렸군요... 죄송합니다.

별도의 스레드에서 fork 후 자식 구간에서 exec함수를 호출할 때입니다.

        auto i = thread([]() {
 
		int pid = fork();
		if (pid == 0)
		{
			execl("/bin/ls", "ls", "-a", 0);
		}
	});
	while (true) cout << "MAIN" << endl;
	return 0;

exec 함수는 프로세스를 대체한다는 것인데
왜 별도의 스레드에서 fork 후 자식 프로세스? 에서 exec를 호출하고 종료해도 메인 스레드가 죽지않아

Process = Thread 라고 생각했습니다.

댓글 달기

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