운영체제의 스레드에 관해서..

kphwan의 이미지

운영체제를 배우고 있는 중 이해가 되었던 부분이..
새로운 것을 배우면서 헷갈리게 되었습니다...
(운영체제 프로젝트 thread을 하다가 궁금증이 생긴것입니다.)

일단 A 라는 스레드가 B 스레드에 인해 lock이 걸려 사용되는 자원을 요구할 경우

A는 내부적으로 waiting 상태에 빠지고 B 스레드가 lock을 풀때까지 기다립니다.

이때 A는 레디큐에서 빠져나와 A의 상태가 BLOCK이 되고 BLOCK된 스레드를 따로 관리해주는

리스트에 insert되어 관리되어 집니다.

이것이 첫번째 상황이구요... 두번째로 세마포어에 관해서 입니다.
(우선 세마포어 구조체 안에는 value라는 값과 스레드를 링크드 리스트로 관리하는 리스트 구조체가 선언되어 있습니다.)

A 라는 스레드가 어떠한 자원을 lock을 걸고 사용하고 있습니다.

이때 B라는 스레드가 A가 lock을 걸고 있는 자원을 요구합니다.
(A가 lock의 권한을 가지고 자원을 쓰고 있기 때문에 B는 접근이 불가능 합니다.)

이때 세마포어에서는 내부 구조체에 value 값을 가지고 있으면서..

이 value값에 따라 접근여부를 허용해 줍니다.

즉, value 값이 초기에는 1이었다가.. A라는 스레드가 해당 자원에 대해 lock을 걸고 사용을 하게 되면

value 값은 0이 됩니다. 이 value값이 0이 거나 0보다 작을때에는 다른 스레드가 lock이 걸린

자원에 접근을 못하게 되죠.. 그럼 이때 B 스레드는 세마포어 구조체 선언되어 있는 스레드를 관리하는 리스트 구조체에

insert되어 이곳에서 A스레드가 lock을 풀기를 기다립니다.

그래서 A가 lock을 풀고 value 값을 1 증가 시키면 그때서야 B가 lock의 권한을 가지고

해당자원에 대해 접근을 하는 것이죠...

이렇게 제가 이해한 내용들입니다.. 그런데 여기서 미묘하게 겹치는 부분이 있습니다..

두 경우다 lock이 걸린 자원을 요구하는데

첫번째의 경우는 BLOCK된 리스트만을 따로 관리해 주는 곳에 스레드가 insert되고.

두번째의 경우는 세마포어 구조체 안에 있는 list에 insert 되어 관리가 된다는 것입니다.

너무 두서없이 쓰게 되었는데요..

제가 잘못 이해하고 있는 부분이 있다면 그것이 무엇인지..

두가지 경우의 차이가 무엇인가요?? 알려주시면 감사하겠습니다.

appler의 이미지

여기서 참고 하시면 될듯..

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread#s-1


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

legendsm의 이미지

우선 case 1과 case 2는 다를게 없네요.
세마포에서 value 가 0과 1만 있다면 뮤텍스와 동일하다고 보시면 되니깐요. (mutex == binary semaphore)

정확한 코드 확인없이 얘기드리는거라서 참조만 하시길.^^;

case 1의 경우는 block list가 전역이고, case 2의 경우 block list가 각 세마포어별로 있는거잖아요?
그렇다면 case 1은, unlock시 모든 block list를 깨워서 다시 경쟁을 시켜야 하고 (다른 lock을 요청한 스레드조차)
case 2는, 해당 세마포어에 block된 스레드만 깨우게 되겠지요.

-_-)/ Gloomynightmare

-_-)/ Gloomynightmare

댓글 달기

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