일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 토비의 스프링
- list
- JPA
- Stack
- 자바 ORM 표준 JPA 프로그래밍
- SpringBoot
- 보조스트림
- GC
- Kotlin
- Real MySQL
- mysql
- 토비의 스프링 정리
- 이스티오
- Stream
- 백준
- Java
- Collection
- gradle
- OS
- jvm
- K8s
- 자바
- spring
- IntellJ
- 스트림
- 쿠버네티스
- redis
- thread
- MSA
- 스프링
Archives
- Today
- Total
인생을 코딩하다.
I/O 관점에서 Blocking/Non-blocking 본문
728x90
반응형
공부한 것 기록하기..
Blocking의 종류
- blocking은 thread가 오랜 시간 일을 하거나 대기하는 경우 발생
- CPU-bound blocking: 오랜 시간 일을 한다.
- IO-bound blocking: 오랜 시간 대기한다.
CPU-bound blocking
- thread가 대부분의 시간 CPU 점유
- 연산이 많은 경우
- 추가적인 코어를 투입
IO-bound blocking
- thread가 대부분의 시간을 대기
- 파일 일기/쓰기, netowrk 요청 처리, 요청 전달 등
- IO-bound non-blocing 가능하다.
Blocking의 전파
- 하나의 함수에서 여러 함수를 호출하기도 하고, 함수 호출은 중첩적으로 발생
- callee는 caller가 되고 다시 다른 callee를 호출
- blocking한 함수를 하나라도 호출한다면 caller는 blocking이 된다.
- 함수가 non-blocking하려면 모든 함수가 non-blockingdldjdi gksek.
- 따라서 I/O bound blocking 또한 발생하면 안된다.
두 I/O 모델의 공통점과 차이점
- Application이 Kernel 결과에 관심이 있다.
- Application의 Kernel로 부터 받은 결과를 이용해서 다음 작업을 수행한다.
- caller는 callee의 결과에 관심이 있다 -> 동기
A 모델 | B 모델 |
Kernel이 응답을 돌려주기 전까지 Application은 아무것도 하지 않는다. | Kernel이 응답을 돌려주기 전에 Application은 다른 일을 수행한다. |
caller는 Callee가 완료될때까지 대기 -> Blocking | caller는 callee를 기다리지 않고 본인의 일을 한다 -> Non-blocking |
동기 Blocing I/O | 동기 Non-blocking I/O |
recvfrom을 호출 | recvfrom을 주기적으로 호출 |
blocking socket을 이용해서 read/writer을 수행 | non-blocking socket을 이용해서 read/write 수행 |
쓰레드가 block 된다.(wait queue에서 기다린다) | 작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환 |
두 I/O 모델의 공통점
- kernel이 Application의 실행을 막지 않는다.
- caller는 callee를 기다리지 않고 본인의 일을 한다 -> Non-blocking
B 모델 | C 모델 |
Application은 Kernel의 결과에 관심이 있다. | Thread1은 Kernel의 결과에 관심이 없다. |
결과를 이용해서 액션을 수행한다. | Kernel은 작업을 완료 후 Thread2에게 결과를 전달한다. |
caller는 callee의 결과의 감시이 있다 -> 동기 | caller는 callee의 결과에 관심이 없다 -> 비동기 |
동기 Non-blocking I/O | 비동기 Non-blocking I/O |
recvfrom을 주기적으로 호출 | aio_read를 호출 |
non-blocking socker를 이용해서 read/write 수행 | 작업이 완료되면 커널이 완료 시그널을 보내거나 callback을 호출 |
작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환 |
I/O 모델
동기 | 비동기 | |
Blocking | Application은 Kernel가 I/O 작업을 완료할 때까지 기다린다. 그 후 결과를 직접 이용해서 이후 본인의 일을 수행한다. | X |
Non-blocking | Application은 Kerenl에 주기적으로 I/O 작업이 완료되었는지 확인한다. 중간중간 본인의 일을 할 수 있고 작업이 완료되면 그때 본인의 일을 수행한다. | Application은 Kernel에 I/O 작업 요청을 보내고 본인의 일을 한다.작업이 완료되면 Kernel은 signal을 보내거나 callback를 호출한다. |
728x90
반응형
'Java' 카테고리의 다른 글
ColpletableFuture (0) | 2024.01.20 |
---|---|
함수 호출 관점에서 동기/비동기, Blocking/Non-blocking (0) | 2024.01.20 |
[JAVA] 상수 풀(String Pool)은 GC가 될까? (0) | 2022.04.08 |
자바 병렬 프로그래밍 - 스레드 안전성(Thread Safe) (2) (0) | 2021.11.18 |
자바 병렬 프로그래밍 - 병렬 처리의 중요성 (1) (3) | 2021.11.07 |
Comments