세마포어의 자원이 value개라고 생각하고, 다른 쓰레드들이 자원을 다 가져가서 0인 상태에서. 1번 쓰레드가 진입 할 때 wait을 하여 크리티컬 섹션에 대기하기 위해 문 앞 리스트에 등록하고 자고 있고, 이전에 자원을 받은 쓰레드들이 크리티컬 섹션을 나올 때, signal을 호출해서 문 앞 리스트에서 1번을 꺼내서 깨우는 관점으로 보시면 이해 될 것 같습니다
1. signal()이 호출되는 경우 우선 자원 반납을 하기 위해 S→value의 값을 증가시킵니다. 2. S→ value의 값이 0보다 작거나 같은 경우에는, 대기큐에서 기다리고 있는 프로세스가 존재한다는 뜻이므로 추가적으로 프로세스를 대기 상태에서 준비상태로 바꿔주는 작업까지 해줘야 합니다. 이 때 value가 0인 경우 1개의 프로세스가 대기하고 있다는 뜻이고 0보다 작은 경우에는 value의 절댓값 + 1 만큼의 프로세스가 대기하고 있다는 뜻입니다.
20:15 오류 정정: 다익스트라는 네덜란드 사람이고 Proberen과 Verhogen은 네덜란드어라고 합니다. ^_-;
교수님 항상 좋은 강의 감사합니다. 34:29 의 signal 부분의 if condition 이 0보다 클때로 바뀌어야하지않을까요 자원이 있을때 비로소 웨이팅큐에있는 프로세스를 깨워줘야하는것 아닌가요?
코드는 0보다 작거나 같다가 맞는것 같습니다.
작거나 같다면 이미 웨이팅큐에 대기하고있는 것들이 있다는 지표로 이해하면 될까요?
웨이팅 큐에 대기하느냐보다는 세마포어를 획득한 프로세스가 세마포어를 릴리즈했느냐를 기준으로 생각하는 것이 좋을 듯하네요.
@@joonion 어떤 말씀인신지 잘 모르겠습니다 ㅠ 왜 if 컨디션에서 0보다 작거나 같아야하는지 설명가능하신가요??
세마포어의 자원이 value개라고 생각하고,
다른 쓰레드들이 자원을 다 가져가서 0인 상태에서.
1번 쓰레드가 진입 할 때 wait을 하여 크리티컬 섹션에 대기하기 위해 문 앞 리스트에 등록하고 자고 있고,
이전에 자원을 받은 쓰레드들이 크리티컬 섹션을 나올 때, signal을 호출해서 문 앞 리스트에서 1번을 꺼내서 깨우는 관점으로 보시면 이해 될 것 같습니다
1. signal()이 호출되는 경우 우선 자원 반납을 하기 위해 S→value의 값을 증가시킵니다.
2. S→ value의 값이 0보다 작거나 같은 경우에는, 대기큐에서 기다리고 있는 프로세스가 존재한다는 뜻이므로 추가적으로 프로세스를 대기 상태에서 준비상태로 바꿔주는 작업까지 해줘야 합니다.
이 때 value가 0인 경우 1개의 프로세스가 대기하고 있다는 뜻이고 0보다 작은 경우에는 value의 절댓값 + 1 만큼의 프로세스가 대기하고 있다는 뜻입니다.
믿고보는 교수님 강의 ~! 선댓글 후감상입니당 ㅎㅎ
매우 고마운 말씀이네요! ^^;
교수님 이번강의도 잘 봤습니다!
혹시 28분 00초에 s1을 실행하고 바로 signal을 호출하는데 wait를 호출하지 않고 signal을 호출할 수 있나요?
만약에 안된다면 wait를 호출해야 하는데 호출을 한다면 초기 값이 0이라 교착상태에 빠지지 않나요?
wait이나 signal은 동기화 기능이므로 언제든 호출이 가능해야 합니다. 그러니 함수 내부에서 예외 처리를 해주죠. 예로, signal은 대기 중인 프로세스가 있으면 깨워 주도록 하면 됩니다.
10/18 좋은 강의 감사합니다!