동기와 비동기, 그리고 블로킹과 넌블로킹은 프로그래밍에서 자주 사용되는 개념들로, 데이터 처리 및 I/O 작업의 실행 방식을 설명합니다. 이 개념들은 서로 밀접하게 연관되어 있지만, 각각 다른 관점에서 행동을 설명합니다.
동기(Synchronous) vs 비동기(Asynchronous)
- 동기: 동기 방식에서는 작업 요청과 그 결과가 시간적으로 일치합니다. 즉, 한 작업의 요청이 끝날 때까지 기다린 후 다음 작업을 시작합니다. 이는 작업 처리 순서가 명확하고 이해하기 쉽다는 장점이 있지만, 이전 작업이 완료될 때까지 다음 작업이 대기해야 하므로 리소스 활용에 비효율적일 수 있습니다.
- 비동기: 비동기 방식에서는 작업 요청 후 그 결과와는 독립적으로 다음 코드가 즉시 실행됩니다. 이는 여러 작업을 동시에 처리할 수 있게 하여 리소스 활용을 극대화하지만, 작업의 완료를 관리하기 위한 추가적인 로직이 필요하며 프로그램의 복잡성이 증가할 수 있습니다.
블로킹(Blocking) vs 넌블로킹(Non-Blocking)
- 블로킹: 블로킹 방식에서는 I/O 작업(파일 읽기/쓰기, 네트워크 요청 등)이 완료될 때까지 실행 흐름이 멈추게 됩니다. 이는 프로그램의 실행 흐름을 예측하기 쉽게 하지만, 해당 I/O 작업의 처리 시간동안 CPU가 다른 유용한 작업을 할 수 없다는 단점이 있습니다.
- 넌블로킹: 넌블로킹 방식에서는 I/O 작업을 요청하고 바로 제어권이 반환되어, 요청한 I/O 작업의 완료 여부와 관계없이 즉시 다른 작업을 실행할 수 있습니다. 이는 논블로킹 I/O 작업의 효율적인 관리를 가능하게 하지만, 작업의 완료를 체크하고 관리하기 위한 추가적인 메커니즘이 필요합니다.
장단점
- 동기/블로킹
- 장점: 프로그램의 흐름을 이해하고 관리하기 쉽습니다.
- 단점: 리소스 활용이 비효율적이며, 특히 I/O 작업이 많은 경우 성능 저하가 발생할 수 있습니다.
- 비동기/넌블로킹
- 장점: 리소스 활용이 효율적이며, 멀티태스킹과 고성능을 달성할 수 있습니다.
- 단점: 프로그램의 복잡성이 증가하며, 작업의 완료 상태 관리가 필요합니다.
- 동기/논블로킹
- 작업 완료의 주기적 확인: 작업을 요청한 후, 해당 작업이 완료되었는지를 주기적으로 확인합니다. 이는 CPU의 리소스를 사용하여 반복적으로 상태를 체크하는데, 이 과정을 "폴링(polling)"이라고 합니다.
- 제어권의 반환과 재요청: 요청한 작업이 즉시 완료되지 않더라도, 프로세스는 블록되지 않고 즉시 제어권을 회수합니다. 필요한 경우, 작업의 완료 상태를 확인하기 위해 다시 요청을 할 수 있습니다.
- 장점: 블로킹 방식에 비해 리소스 활용 측면에서 더 효율적일 수 있습니다. 작업을 기다리는 동안 다른 작업을 처리할 수 있으므로, 단일 스레드 환경에서도 여러 작업을 관리할 수 있습니다.
- 단점: 폴링 과정에서 CPU 리소스를 소모합니다. 작업의 완료를 주기적으로 확인하기 위해 CPU가 불필요한 작업에 시간을 할애하게 되며, 이는 특히 작업의 완료까지 오랜 시간이 걸리는 경우 비효율적일 수 있습니다. 또한, 폴링 로직을 구현하는 것이 프로그램의 복잡성을 증가시킬 수 있습니다.
동기와 비동기, 블로킹과 넌블로킹의 선택은 애플리케이션의 요구 사항, 성능 목표, 그리고 개발의 복잡성을 고려하여 결정되어야 합니다.
'여러가지 > 이것저것' 카테고리의 다른 글
단방향 암호화 (0) | 2024.03.21 |
---|---|
비대칭키, 대칭키 암호화 (0) | 2024.03.21 |
컨텍스트 스위칭이란? (0) | 2024.03.18 |
Process와 Thread의 차이 (0) | 2024.03.18 |
웹서버(Apache, Nginx)의 서버간 라우팅 기능과 OSI7 Layer (0) | 2024.03.18 |