동기와 비동기 차단과 비차단
너무 헷갈린다. 대충 동기화는 전체 프로세스간의 전달 방식 차단은 한 쓰레드의 상태를 나타내는거 같은데 보통 (차단, 동기), (비차단,비동기)와 묶여서 사용되어 같은듯 다르게 느껴진다.
그래서 내 방식대로 정리할거다. 근데 멍청해서 틀릴 수도 있음.
근데 어느 블로그에선 이걸로 설명하고 어느 블로그에선 틀렸다고 한다. select가 synchronous에 더 가깝다는데 나도 그렇게 생각한다.
asynchronous 하면서 blocking 한 경우가 있을까? 순서는 자유로운데 상태는 blocking이면 결국 Synchronous하게 진행되는거 같은뎅
암튼 찾다가 가장 마음에드는 설명을 발견해서 올려본다. (출처 https://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking )
synchronous / asynchronous 는 두 모듈간의 관계를 설명한다.
blocking / non-blocking 한 모듈의 상태를 설명한다.
An example:
Module X: "I".
Module Y: "bookstore".
X asks Y: do you have a book named "c++ primer"?
1) blocking: X는 대답을 받을 때까지 기다린다. (X 는 blocking 상태)
2) non-blocking : Y가 대답하기 전까지 X는 다른 일을 자유롭게 할 수 있다. 매 분마다 Y가 대답했는지 확인하거나 또는 Y가 대답하기 전까지 돌아가지 않는다.
3) synchronous : X는 Y의 대답을 받을 때까지 기다린다. X는 Y가 끝날 때까지 진행되지 않는다.
4) asynchronous : Y가 대답하기 전까지 X는 다른 일을 자유롭게 할 수 있다. Y가 대답하기 전까지 돌아가지 않는다.
2)와 4)의 case가 non-blocking과 asynchronous의 차이이다.
non-blocking & synchronous 한 예시 (비효율적이지만 이해를 위한 예시)
// thread X
while (true) {
msg = recv(Y, NON_BLOCKING_FLAG);
if (msg is not empty)
{ break;}
sleep(2000); // 2 sec
}
// thread Y
// prepare the book for X
send(X, book);
non-blocking이 asynchronous을 의미하지 않는다. X는 분명 block되지 않았지만 그렇다고 진행되는 상태는 아님. 뭔가 select하고 비슷한거 같음..
암튼 중요한건 이것들을 구분할줄 알아야됨.
또 다른 예시를 보자
// Module X = Module X1 + Module X2
// Module X1
while (true) {
msg = recv(many_other_modules, NON_BLOCKING_FLAG);
if (msg is not null) {
if (msg == "done") {
break;
}
// create a thread to process msg
}
sleep(2000); // 2 sec
}
// Module X2
broadcast("I got the book from Y");
// Module Y
// prepare the book for X
send(X, book);
여기서 알 수 있는점
- X1 is non-blocking
- X1 and X2 are synchronous
- X and Y are asynchronous (첫번재 예제와 다르게 다양한 모듈에서 recv한다 즉 X와 Y간의 약속이 없음)
이런 방식으로 구분할 수 있다. 중요한건 어떤 상황에서 어떠한 방식으로 구현하는게 효율적인지 고민하는거다.
궁금한 점 :
1) thread의 blocking 상태가 process의 waiting상태 같은건가?
2) 비동기적 비차단 형식의 통신이 있나?
'학교공부 > 운영체제' 카테고리의 다른 글
Memory Management Starategies (0) | 2020.05.20 |
---|---|
Deadlock (0) | 2020.05.15 |
Synchronization (0) | 2020.05.09 |
Process Scheduling - 2 (0) | 2020.05.01 |
Process Scheduling (0) | 2020.04.29 |