일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- functional programming
- 람다 칼큘러스
- 겨울카카오인턴
- Pattern
- JDBC
- 함수형 프로그래밍
- 파이썬
- 디자인패턴
- JavaScript
- DesignPattern
- solid
- Spring
- Collection
- design-pattern
- 자바
- exception
- tcp
- Eclipse
- javscript
- Network
- 로버트마틴
- 큐
- Python
- 백준
- 프로그래머스
- 스택
- lambda calculus
- Collections
- Rails
- Java
Archives
- Today
- Total
개발자 노트
비동기 프로그래밍 - 정리 본문
추후 자바 API 및 기술 블로그들의 소개를 통해서 자세히 풀어나가도록 하겠습니다.
비동기
비동기란?
작업(task)을 순서대로 처리하지 않는 것
언제 사용 하는가?
성능 개선을 위하여 사용.
- I/O 작업이 있을 경우
- CPU bounded JOB이 있을 경우 (배치성)
비동기 프로그램 작성시 고려할 점
- 비동기 작업의 결과물을 어떻게 이용할 것인가?
- callback
- 완료시 추가 작업을 하도록 함수(루틴) 전달.
- blocking
- 모두 완료될 때까지 대기
- buffer 이용
- I/O가 끝나지 않더라도 데이터 이용가능
- callback
- 비동기 작업들이 어떤 상태에 있는가?
- 상태에 따른 대응
- 모두 완료됬을 경우 -> 처리
- 처리 중일 경우 -> 대기 또는 다음 프로세스 진행
- 에러났을 경우 -> 전체 프로세스 실패 등
- 상태에 따른 대응
- 비동기 테스크인 I/O를 어떻게 처리할 것인가?
- non-blokcing (event loop 방식 처리)
- blocking (일반적인 방식으로 Thread에게 I/O 요청) 비동기 작업들의 완료
- 여러 개 잡을 분할하여 처리시 완료 또는 실패 처리
- 모두가 완료되었으면 성공
- 어떻게 모두 성공했는지 판단?
- 하나만이라도 실패한다면 모두 실패(fail fast)
- 어떻게 하나가 실패 했는지 판단?
- 하나만이라도 완료되었을 경우 성공 처리
- 어떻게 판단?
- 완료되는 순서대로 처리
- 모두가 완료되었으면 성공
- Concurrency
- 비동기 작업 목적이 성능 개선이다보니 여러 쓰레드를 이용하여 처리할 때가 있음. 이때 동일한 자원에 접근할 때 동시성 문제를 해결 해야 함.
- volitile
- cpu 레지스터에 캐싱된 값이 아닌, 메인 메모리 값을 참조하도록 함 (공유자원 불일치 문제 해결 목적)
- CompareAndSwap
- Check Then Act를 CPU 레벨에서 operation의 원자성 보장해주는 것. 단 하나의 쓰레드만 해당 operation을 수행할 수 있음.
- 변수에 기대하는 값이 담겨 있을 경우에만 변수의 값을 변경한다.
- synchronization 키워드(lock)을 대신하여 사용. 쓰레드가 블로킹되는 경우 thread가 곧바로 블로킹 상태에서 깨어나지 못함.
- ForkJoinPool
- work-stealing 기법. 쓰레드가 다른 쓰레드에 할당된 잡들을 뺏어서 작업함.
- 쓰레드 별로 Task를 완벽히 균등하게 나눌 수 없음. 따라서, 유휴 쓰레드가 작업 중인 쓰레드의 Task를 뻇어와서 작업할 수 있도록 함.
시스템 단위에서 비동기 처리는?
- 메세지 큐를 이용
- Producer가 작업할 내용에 관한 메세지를 큐에 전달 , Consumer가 해당 메세지를 읽고 작업을 처리하는 방식
- 이벤트 주도 설계 방식에서 의존성을 끊는 목적으로도 메세지 큐 사용
- Transaction의 단위
- 메세지 발행까지를 하나의 Transaction으로 묶음.
- 비동기 Task의 처리 완료 여부는 무관심.
- 메세지가 Task라고 보면 됨. 만약 에러로 인해 Consumer가 처리하지 못했을 경우, 재발행 필요.
반응형
'일반적인 IT주제' 카테고리의 다른 글
2의 보수 (0) | 2022.07.15 |
---|---|
expression과 evaluation이란? (0) | 2020.11.10 |
[DDNS]iptime 서버 주소 등록 (0) | 2020.04.20 |
UI와 API에 대하여 (0) | 2020.03.12 |
Comments