운영체제의 스레드에 관해서..
운영체제를 배우고 있는 중 이해가 되었던 부분이..
새로운 것을 배우면서 헷갈리게 되었습니다...
(운영체제 프로젝트 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 되어 관리가 된다는 것입니다.
너무 두서없이 쓰게 되었는데요..
제가 잘못 이해하고 있는 부분이 있다면 그것이 무엇인지..
두가지 경우의 차이가 무엇인가요?? 알려주시면 감사하겠습니다.
여기서 참고 하시면
여기서 참고 하시면 될듯..
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread#s-1
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
뮤텍스와 세마포어 차이정도로 보시면 될듯 한데..
우선 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
댓글 달기