운영체제중 프로세스 스케쥴링이랑 멀티스레드가 잘 이해가 안가서 질문드립니다.

tmshdnqhem3의 이미지

안녕하세요. 운영체제를 공부하고 있는 프로그래머입니다.

뒤늦게 공부하고 있는데, 잘 이해가 가지 않는 부분이 있어서 질문드립니다.

기초적인 질문일 것같은데, 부끄럽네요.

드리기전에 멀티코어&멀티프로세스 환경에서 모든 프로세스가 멀티스레드로 작동하고 있다고 가정하겠습니다.

질문을 다음과 같습니다.

1. 멀티코어에서 동시에 같은 프로세스가 작동할 수 있습니까?

1.1 프로세스 스케쥴러는 레디 상태의 프로세스가 적재된 레디 큐에서 선별하는걸로 알고있기에, 동시에 같은 프로세스가 실행될 수 없다고 생각합니다. 이게 맞을까요?
1.2 만약 실행될 수 없다면, 스레드에서 임계영역이란 동시간에 같은 코드(자원)을 접근하는게 아니라, 순차적으로 접근한다고 봐도 될까요?

2. 프로세스에서 I/O 인터럽트가 발생하면, 프로세스가 블로킹 상태가 되어 I/O 완료 인터럽트가 발생할 때까지 레디 큐에 적재되지 않는걸로 알고있습니다.

다만, 이게 멀티 스레드 일 때는 어떻게 됩니까?

스레드 하나에서 인터럽트가 발생하면 스레드가 블로킹이 되고 프로세스가 블로킹이 되는게 아닌걸로 알고있습니다. 그렇다면, I/O 인터럽트가 발생한 프로세스가 실행된다는건, 프로세스 스케쥴러의 단위가 스레드가 된다는 것같은데, 그럴 것같지는 않습니다.

해당 환경에서 프로세스 스케쥴러는 어떻게 작동하나요?

tmshdnqhem3의 이미지

실수로 두개를 작성했는데, 삭제하는 방법을 잘 모르겠네요;

AustinKim의 이미지

운영체제를 이론으로 배우기는 정말 힘들 것 같아요.
개념들이 오락 가락하고 머리에 남기도 힘들죠. 이렇게 고민하시는 시간에 아래와 같은 책을 보시면서 간단한 운영 체제를 만들어보는 실습을 하시면 더 효율적으로 운영체제를 이해할 수 있을 것 같습니다.

http://www.yes24.com/Product/Goods/84909414

도움이 됐으면 하는 마음에 주제 넘는 이야기를 했으니 너그럽게 봐 주셨으면 좋겠구요.

질문하신 내용을 지금 사실 상 IT 세상을 제패한 운영체제인 '리눅스 커널' 기준으로 간단히 답해드립니다.

1.1 프로세스 스케쥴러는 레디 상태의 프로세스가 적재된 레디 큐에서 선별하는걸로 알고있기에, 동시에 같은 프로세스가 실행될 수 없다고 생각합니다. 이게 맞을까요?
=> 동시에 같은 프로세스는 실행될 수 없습니다.

1.2 만약 실행될 수 없다면, 스레드에서 임계영역이란 동시간에 같은 코드(자원)을 접근하는게 아니라, 순차적으로 접근한다고 봐도 될까요?
=> 임계영역을 락으로 보호했다면 프로세스는 순차적으로 접근합니다.

2. 프로세스에서 I/O 인터럽트가 발생하면, 프로세스가 블로킹 상태가 되어 I/O 완료 인터럽트가 발생할 때까지 레디 큐에 적재되지 않는걸로 알고있습니다.
=> 프로세스가 실행 도중에 인터럽트가 발생해도 프로세스는 런큐(레디 큐)에 그대로 남아 있습니다.

... 프로세스 스케쥴러의 단위가 스레드가 된다는 것같은데, 그럴 것같지는 않습니다.
=> 리눅스 커널에서는 스레드나 프로세스나 모두 프로세스로 간주합니다. 따라서 스케줄링의 단위는 프로세스가 됩니다.

(개인블로그)
http://rousalome.egloos.com

익명 사용자의 이미지

친절한 답변 감사합니다.

추천해주신 책은 사서 읽어보겠습니다. 제가 찾고있었던 책입니다.
임베디드로 찾아야하는지 몰라서 헤메고 있었네요.

2번 답변에서 인터럽트가 발생한 스레드, 프로세스를 모두 프로세스로 간주한다는게 잘 이해가 되지 않네요..
스레드와 프로세스 스케쥴링에대해 공부가 부족한 것같습니다.
혹시 해당 내용을 공부할 수 있을 키워드를 부탁드려도 될까요?

Stephen Kyoungwon Kim@Google의 이미지

프로세스에 쓰레드가 여럿 있고 멀티 코어 환경이라면 동시에도 수행은 가능합니다. 쓰레드가 1, 2 두 개인 프로세스라면 한 코어는 1, 다른 코어는 2를 수행할 수 있습니다. 공유 자원이 있고 보호가 안 되었다면 동시에 접근되어 레이스 컨디션도 발생될 수 있고요.

설령 동시에 수행이 가능하지 않은 상황--예컨대 싱글 코어--이라고 해도, critical section은 흔히 상당히 깁니다. 그러니까 락이 없다면, 그 코드 어딘가 중간쯤 수행 중에 타이머 인터럽트가 발생해서 수행 중이던 쓰레드/프로세스를 내리고 다른 쓰레드/프로세스를 올리는 게 가능한데, 그 새로운 쓰레드/프로세스가 이 공유 자원에 접근할 수도 있죠. 따라서 락이 없이 공유 자원에 대한 레이스 컨디션을 없애는 건 불가능하진 않아도 간단하진 않겠죠.

마지막 질문에 대해서는 소위 레디큐에서 PCB 객체를 끄집어 내서 거기에 맞게 컨텍스트 스위치를 하겠죠? 리눅스는 이 PCB 객체를 프로세스 따로 쓰레드 따로 쓰지 않는다는 얘기로 보입니다. 같은 타입의 struct를 쓰레드와 프로세스 모두에게 사용한다는 얘기로 보입니다. 큐에 넣을 때도 쓰레드냐 프로세스냐에 따라 다른 규칙을 적용하여 넣진 않는다는 얘기로 이해됩니다.

일단.. 프로세스와 쓰레드를 써보지 않았는데 그 스케쥴링부터 이해한다는 건 말이 안 된다고 개인적으로 생각합니다.

https://www.amazon.com/Computer-Systems-Programmers-Perspective-3rd/dp/013409266X

위의 책에 나온 시스템 프로그래밍을 먼저 공부하시면 도움이 되리라 생각합니다.

그리고 OS 책은:
https://www.amazon.com/Operating-System-Concepts-Abridged-Companion/dp/1119456339/ref=sr_1_2?dchild=1&keywords=Operating+System+Concepts&qid=1591034337&s=books&sr=1-2

번역본도 아마 있을 걸로 생각합니다.

C/C++ 모두 fork, exec, wait (waitpid) 예제를 찾아 보시고 이해하시고 연습해 보시면 도움이 되실 거 같고요. 쓰레드는 C의 경우 thread와 프로세스의 유저 레벨에서 차이는 코드와 가상 메모리 공간을 공유하느냐 안 하느냐인 것 같은데, pthread가 C 라이브러리로 많이 쓰시는 거 같고 c++은 std::thread가 있습니다.

tmshdnqhem3의 이미지

우선 답변감사합니다. 주신 답변을 보면 부족하다는 생각이 듭니다.

글에 적었다싶이, ""멀티코어&멀티프로세스 환경에서 모든 프로세스는 멀티스레드로 동작""한다고 가정하겠습니다. 또한 공룡책 8판도 읽으면서 공부중이며, 멀티스레드 프로그래밍 경험 또한 있습니다. 안타깝게도 윈도우 환경이지만, 멀티스레드 프로그래밍을 해보았고 그에대한 내용도 배웠습니다.

다만, 제가 운영체제를 읽기전에 멀티스레드 프로그래밍부터 시작했습니다.
문제는 제가 멀티스레드를 배우면서 이해한 내용과 운영체제에서 가르치는 프로세스/스레드 스케쥴링이 서로 상충하고 있어서 정리가 되지않습니다.

------------------------------

우선 멀티 코어에서 동시에 실행이 어떻게 가능한건지 다시 질문을 드리고싶습니다.
말씀하신 것처럼 멀티스레드에서는 멀티코어 1,2에서 같은 스레드가 실행될 수 있다고 배웠는데, 지금 운영체제에서는 프로세스 스케쥴링(라운드 로빈)을 배우면 같이 실행될 수가 없다는 결론이 나옵니다. 왜냐면 레디큐에서 판별하는데 실행중인 프로세스는 레디큐에 적재되지 않기때문입니다.

이것에 관한 내용을 찾지 못했습니다.

------------------------------

스레드/프로세스를 같은 struct를 사용한다면, 이해가 됩니다. 다만 이걸 알기위해서는 어떤 키워드가 필요한지 알고싶습니다. 지금까지 본 공룡책에서는 같은 struct를 쓴다는 내용이 없습니다.

tmshdnqhem3의 이미지

부끄럽게도 제가 글을 잘못읽었습니다.

시스템 프로그래밍도 배웠고, 운영체제도 배웠는데 구멍이 뚫렸습니다.
제가 가볍게 넘긴 파트에서 해당 내용이 적혀있었네요..

친절한 답변 감사합니다.

익명 사용자의 이미지

어느 책 어느 파트인지 말씀해주시면 저도 집에 가서 읽어보고 싶습니다~

익명 사용자의 이미지

공룡책의 5 챕터 CPU 스케쥴링에서 다중처리기 스케쥴링에 있습니다.

tmshdnqhem3의 이미지

추가로 도움이 될 것같은 포스팅을 같이 드립니다..

공룡책(8판)은 어렴풋이 설명해놔서 따로 찾았습니다.

https://ypangtrouble.tistory.com/entry/%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81

http://jake.dothome.co.kr/scheduler/

라스코니의 이미지

멀티코어에서 동시에 같은 프로세스가 작동할 수 있습니까? 라는 의미를 좀더 설명해 주실수 있나요?
1) 하나의 실행 파일이 1개 이상으로 실행되어 다수의 프로세스가 멀티 코어에서 실행되는 것을 의미하시는 건가요?
2) 아니면, 하나의 프로세스가 (여러개의 쓰레드로 구성되어 있는) 여러 코어에서 동시에 각 쓰레드를 구동할 수 있다는 것을 의미하시는 건가요?

익명 사용자의 이미지

2번을 의미합니다.

라스코니의 이미지

CPU affinity에 의해서 쓰레드는 특정 프로세서에서 실행될 수 있도록 할수 있지 않나요?
제가 알기로 CPU 점유율을 높일 수 있는 프로그램(해석 프로그램, 인코딩 프로그램 등)은 이런 기법이 필수라고 알고 있는데요.

익명 사용자의 이미지

특정 코어나 프로세서에서 동작할 수 있게할 수 있는걸로 알고있습니다만, 저는 그런 상황을 가정하지 않습니다.
오히려 특정하지 않거나 할 수 없다면, 어떻게 동작하는지를 알고싶은 것입니다.

댓글 달기

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