티스토리 뷰


안녕하세요. 최근에 동기와 비동기, 블록킹과 논블록킹에 관련된 글이 자주 보이길래 저도 한번 찾아보고 나름 정리해 보았습니다.
그런데 사실 동기, 비동기와 블록킹 논블록킹을 함께 거론하는 글들을 보면 제 입장에서는 잘 이해가 되지 않는 게 많았습니다. 제가 잘 몰라서 그런 것이 가장 크거니와 사실 저 문제에 대해 논의하는 분들의 글을 자세히 보면 하나의 논리에 초점이 맞춰지는 게 아니라 각기 조금씩 다르게 알고 이해한 상태에서 글을 쓰고있다는 느낌을 받았기 때문입니다. 잘 모르는 제 입장에서 보면 A 라는 분이 쓰신 글을 보고 아 그렇구나 하다가도 B 라는 분이 쓴 글을 보면 어? A 라는 분이 쓴글이랑 조금 다르네? 이건가? 하고 매우 혼란을 겪은 적이 한 번이 아니었습니다. 그래서 일단은 제 나름대로 이해할 수 있고 이해한 선에서 정리된 정도의 내용이라도 포스트로 일단 남겨놓고 추후에 좀 더 확실하게, 진짜 100% 를 알게되면 수정하자는 생각에서 올려봅니다. 주절주절 서론이 길지만 간단히 말씀드려서 지금 제가 올리는 내용이 100% 맞다는 것이 아니라는 것입니다. 저 역시 잘 모르는 개발자라 하나하나 이해하고 가려는 입장이라는 것을 말씀드립니다.

일단 간단히라도 이해하기 위해서 blocking 과 non-blocking 관련해서는 직접 그림을 그려 보았습니다. 다른 분들은 어떤 툴 같은 것으로 이쁘게 그리고 정리하시던데 저는 뭔가 아날로그 감성인지 직접 더 그리는게 더 편하고 수월했네요.



위 그림이 제가 이해한 blocking 과 non-blocking 입니다.

non-blocking 의 경우를 먼저 간단히 설명해보자면 주체를 3가지로 나눴습니다.

REQUEST - CPU - I/O
또는
USER PROCESS(Application) - KERNEL - I/O
또는 커피숍을 예로 들어서
손님 - 카운터직원 - 제조직원

이제 설명을 해보자면 NON-BLOCKING 의 경우 순서가 이러합니다.

1. 손님 A 가 카운터 직원에게 주문을 합니다. (REQUEST -> CPU, PROCESS -> KERNEL)
2. 카운터 직원은 손님 A 의 주문을 접수 받고 제조 직원한테 전달합니다. (CPU -> I/O, KERNEL -> I/O)
3. 제조 직원은 제조를 시작하고 카운터 직원은 손님 A 의 주문을 마칩니다. (I/O WORKING, CPU -> REQUEST, KERNEL -> PROCESS)
4. 카운터 직원은 다음 손님 B 의 주문을 받습니다. (REQUEST -> CPU, PROCESS -> KERNEL)
5. 카운터 직원은 손님 B 의 주문을 접수 받고 제조 직원한테 전달합니다. (CPU -> I/O, KERNEL -> I/O)
6. 제조 직원은 제조를 시작하고 카운터 직원은 손님 B 의 주문을 마칩니다. (I/O WORKING, CPU -> REQUEST, KERNEL -> PROCESS)
7. 제조 직원은 손님 A 의 커피를 모두 제조하였다고 카운터 직원에게 이야기 합니다. (I/O COMPLETE, I/O -> CPU, I/O -> KERNEL)
8. 카운터 직원은 손님 A 에게 커피가 나왔다고 이야기 합니다. (CPU -> REQUEST, KERNEL -> PROCESS)
9. 제조 직원은 손님 B 의 커피를 모두 제조하였다고 카운터 직원에게 이야기 합니다. (I/O COMPLETE, I/O -> CPU, I/O -> KERNEL)
10. 카운터 직원은 손님 B 에게 커피가 나왔다고 이야기 합니다. (CPU -> REQUEST, KERNEL -> PROCESS)


손님 A 와 B 의 경우 주문 접수 후 커피 제조가 끝난 후 카운터 직원의 호출 전까지는 각자의 볼일을 볼 수 있으며 카운터 직원 역시 손님 A 와 B 의 주문을 접수 후에 손님들이 더 있다면 계속해서 다음 손님들의 주문을 접수, 처리 할 수 있습니다.
(I/O 가 WORKING 상태라도 CPU, KERNEL 은 NO WATING 상태)


반면에 BLOCKING 의 경우는 이러합니다.

1. 손님 A 가 카운터 직원에게 주문을 합니다. (REQUEST -> CPU, PROCESS -> KERNEL)
2. 카운터 직원은 손님 A 의 주문을 접수 받고 제조 직원한테 전달합니다. (CPU -> I/O, KERNEL -> I/O)
3. 제조 직원은 제조를 시작하고 카운터 직원과 손님 A 는 제조 직원이 커피를 제조할 때까지 기다립니다. (I/O WORKING)
4. 제조 직원은 손님 A 의 커피를 모두 제조하였다고 카운터 직원에게 이야기 합니다.(I/O COMPLETE, I/O -> CPU, I/O -> KERNEL)
5. 카운터 직원은 손님 A 에게 커피가 나왔다고 이야기 합니다. (CPU -> REQUEST, KERNEL -> PROCESS)
6. 손님 B 가 카운터 직원에게 주문을 합니다. (REQUEST -> CPU, PROCESS -> KERNEL)
7. 카운터 직원은 손님 B 의 주문을 접수 받고 제조 직원한테 전달합니다. (CPU -> I/O, KERNEL -> I/O)
8. 제조 직원은 제조를 시작하고 카운터 직원과 손님 B 는 제조 직원이 커피를 제조할 때까지 기다립니다. (I/O WORKING)
9. 제조 직원은 손님 B 의 커피를 모두 제조하였다고 카운터 직원에게 이야기 합니다.(I/O COMPLETE, I/O -> CPU, I/O -> KERNEL)
10. 카운터 직원은 손님 B 에게 커피가 나왔다고 이야기 합니다. (CPU -> REQUEST, KERNEL -> PROCESS)


손님 B 는 손님 A 가 주문한 커피가 제조되기 전까지는 주문을 할 수 없으며 카운터 직원 역시 손님 B 의 주문을 받을 수 없습니다. 또한 손님 B 이후로도 더 손님이 있을 경우에도 마찬가지로 손님 A 의 커피가 제조되기 전까지는 계속해서 기다리는 상황입니다.
(I/O 가 WORKING 상태라면 COMPLETE 전까지 CPU, KERNEL 은 WATING 상태)



저는 쉽게 중간 단계인 카운터 직원 (CPU, KERNEL) 기준으로 이해하였습니다. 카운터 직원이 주문을 받고 주문 받은 손님에게 음료를 내줄 때 까지 주문을 받지 않으면 BLOCKING, 주문만 계속 받고 음료는 나중에 나오는 대로 내준다면 NON-BLOCKING 이라고 말이죠.



그리고 동기(synchronous), 비동기(asynchronous) 에 관련해서는 기준을 손님 (REQUEST, PROCESS, APPLICATION) 으로 생각하였습니다.

동기식일 경우는 손님은 카운터 직원에게 계속해서 커피가 준비되었는 지 상황을 물어봅니다. 그리고 준비가 되면 커피를 받겠죠. (동기화)

비동기식일 경우는 손님은 그냥 자기 할일을 합니다. 주문을 한 후에 밖에 나가서 핸드폰이라도 잠깐 만지고 있다가 카운터 직원이 커피가 준비되었다고 알려오면 그때 가서 커피를 받아 옵니다.





** 일단은 여기까지가 제가 이해한 내용입니다.
동기, 비동기의 내용은 이런 글도 보았습니다. 카운터 직원이 주문을 접수 받은 대로 줄 때가 동기(손님 A > 손님 B > 손님 C ..) 이며 나오는 순서 대로 줄 때 비동기 (손님 B > 손님 A > 손님 C...) 라고 말이죠. 이 부분에 대해서는 저도 어떤게 맞는 말인지 잘 이해가 가지 않습니다. 아니 이해라기 보다는 뭐가 답인지 잘 모르겠습니다. 조대협님의 블로그를 보면 Single Thread 기반 비동기 서버에 관한 내용과 그림이 있는데 그림을 보면 이러합니다.

Client A 의 요청 (0분 0초)
CPU JOB 이 받음 (0분 0초)
IO JOB 으로 전달 (0분 1초)
IO JOB 이 수행 시작 (0분 1초 ~)
Client B 의 요청 (0분 2초)
CPU JOB 이 받음 (0분 2초)
IO JOB 으로 전달 (0분 2초)
IO JOB 이 수행 시작 (0분 2초)
IO JOB 이 Client B 의 요청 Complete (0분 5초)
CPU JOB 이 Client B 에게 call back (0분 6초)
IO JOB 이 Client A 의 요청 Complete (0분 10초)
CPU JOB 이 Client A 에게 call back (0분 11초)

이렇게 우연찮게 Client A 가 먼저 요청이 들어왔지만 뒤 이어 들어온 Client B 의 IO 수행 시간보다 길어져 B 가 먼저 callback response 를 받고 있습니다. 그래서 이렇게 보면 카운터 직원이 주문 받은 순서 대로 주는게 아니라 나오는 대로 주는게 비동기 같기도 하고 참 헷갈립니다. 어떤게 맞는 지는 뭔가 좀 더 공부가 필요 할 것 같습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함