티스토리 뷰
안녕하세요. 최근에 동기와 비동기, 블록킹과 논블록킹에 관련된 글이 자주 보이길래 저도 한번 찾아보고 나름 정리해 보았습니다.
그런데 사실 동기, 비동기와 블록킹 논블록킹을 함께 거론하는 글들을 보면 제 입장에서는 잘 이해가 되지 않는 게 많았습니다. 제가 잘 몰라서 그런 것이 가장 크거니와 사실 저 문제에 대해 논의하는 분들의 글을 자세히 보면 하나의 논리에 초점이 맞춰지는 게 아니라 각기 조금씩 다르게 알고 이해한 상태에서 글을 쓰고있다는 느낌을 받았기 때문입니다. 잘 모르는 제 입장에서 보면 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 를 받고 있습니다. 그래서 이렇게 보면 카운터 직원이 주문 받은 순서 대로 주는게 아니라 나오는 대로 주는게 비동기 같기도 하고 참 헷갈립니다. 어떤게 맞는 지는 뭔가 좀 더 공부가 필요 할 것 같습니다.
'프로그래밍' 카테고리의 다른 글
Java Thread 사용 예시 및 block, lock 현상에 대한 대처 (0) | 2017.02.28 |
---|---|
Spring 2.5 + Tiles 2.0.5 적용 및 다중 뷰리졸버(Multi ViewResolver) 적용 시 주의 점. (0) | 2017.02.01 |
오라클 DB 인덱스 사용하기 (0) | 2017.01.17 |
해외 CTO 가 말한 really impressed with the quality (0) | 2017.01.13 |
JSONObject 버그? (4) | 2017.01.10 |
- Total
- Today
- Yesterday
- 남미 저가항공
- 마추피추
- 성계 투어
- Oracle
- Cambodia
- 토레스 델 파이네
- aguas calientes
- 빅토리아폴스
- 햄버거
- 볼리비아
- 남미
- 캄보디아
- Namibia
- 빈트후크
- Cusco
- 아구아스 칼리엔테스
- 후마리
- 족발
- jQuery
- 킹덤 호텔
- calama
- 나미비아
- 쿠스코
- 우유니
- 애드센스
- 칠레
- 성스러운 계곡
- 칼라마
- Uyuni
- 푸에르토 나탈레스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |