동기적 처리(synchronous processing)
작업이 순차적으로 이루어지며, 한 작업이 완료되어야만 다음 작업이 시작될 수 있는 처리 방식을 의미한다. 여기서 "작업"은 함수 호출, 계산, 데이터베이스 쿼리, 파일 입출력 등 다양한 형태를 가질 수 있다.
동기적 처리의 특징:
- 순서가 중요: 작업들은 순차적으로 실행되기 때문에, 작업의 순서와 완료 상태가 중요하다.
- 결과 예측 가능: 작업의 순서가 고정되어 있어 결과를 예측하기 쉽다.
- 간단한 로직: 다음 작업은 이전 작업이 완료된 이후에만 시작되므로, 프로그래밍 로직이 상대적으로 간단하다.
- 자원 효율 높지 않을 수 있음: 이전 작업이 끝나기를 기다리는 동안, CPU나 메모리 등의 자원을 효율적으로 활용하지 못할 수도 있다.
예시:
- 파일 읽기: 프로그램이 파일을 읽을 때, 해당 작업이 완료될 때까지 프로그램은 다른 작업을 수행하지 않는다.
- 데이터베이스 쿼리: 쿼리 결과가 반환될 때까지 프로그램은 대기 상태에 기다린다.
- HTTP 요청: 웹 서비스에 데이터를 요청하고 응답을 받을 때까지 다른 작업을 하지 않는다.
비동기적 처리(asynchronous processing)
여러 작업이 독립적으로 실행되며, 한 작업이 완료되지 않아도 다른 작업이 시작될 수 있는 처리 방식을 의미한다. 이 방식은 작업 간의 시간적인 의존성을 최소화하여 자원을 더 효율적으로 활용할 수 있다.
비동기적 처리의 특징:
- 병렬 처리 가능: 여러 작업을 동시에 수행할 수 있다. 이로 인해 시스템 자원을 더 효율적으로 활용할 수 있다.
- 작업 순서 불명확: 작업이 독립적으로 실행되기 때문에, 완료 순서는 예측하기 어렵다.
- 복잡한 로직: 비동기 처리의 경우, 작업이 완료될 시점을 예측하기 어렵기 때문에 콜백, 프로미스, async/await 등의 방법을 사용하여 로직을 관리해야 할 수 있다.
- 리소스 효율성: 작업 간에 의존성이 적어 자원을 더 효율적으로 활용할 수 있다.
예시:
- Web API 호출: 웹 API로 데이터를 요청한 후, 응답이 오면 콜백 함수를 실행하며, 그 사이에 다른 작업을 계속할 수 있다.
- 이벤트 드리븐 프로그래밍: 사용자 입력, 네트워크 응답 등의 이벤트가 언제 발생할지 알 수 없으므로, 이벤트가 발생했을 때 실행될 함수(이벤트 핸들러)를 미리 등록해 둔다.
- 파일 읽기/쓰기: 파일을 읽거나 쓰는 작업을 시작하고, 완료되면 지정한 콜백 함수를 실행합니다. 파일 작업이 진행되는 동안에도 다른 작업을 수행할 수 있다.
동기와 비동기의 가장 큰 차이는 작업의 순서를 보장할 수 있냐이다. 비동기적 처리가 상대적으로 효율적일 수 있지만 작업의 순서가 중요한 경우가 있는데 이 때는 동기적으로 처리해야 한다.
그리고 같이 블로킹과 논블로킹이 많이 언급된다.
블로킹 (Blocking)
블로킹 작업은 작업 수행 도중 다른 작업을 할 수 없도록 자원이나 프로세스를 '막습니다.'
- 작업 흐름: 특정 작업이 실행 중일 때, 그 작업이 완료될 때까지 프로그램의 실행이 중단됩니다.
- 자원 사용: 블로킹 작업이 진행되는 동안 해당 리소스나 스레드는 다른 작업을 수행할 수 없습니다.
- 예시 : 파일 읽기/쓰기, 소켓 통신 등
논블로킹 (Non-blocking)
논블로킹 작업은 작업 수행 도중에도 다른 작업을 할 수 있습니다.
- 작업 흐름: 특정 작업이 완료되지 않았더라도 프로그램의 실행이 계속됩니다.
- 자원 사용: 논블로킹 작업이 실행되더라도 해당 리소스나 스레드는 다른 작업을 병렬로 수행할 수 있습니다.
- 예시: 이벤트 드리븐 프로그래밍, 콜백 등
- 동기 + 블로킹: 함수 호출이 블로킹 방식으로 동작하여, 호출된 함수가 반환될 때까지 다른 작업을 수행할 수 없다.
- 동기 + 논블로킹(참고): 코루틴과 같이 동기적으로 동작하지만 논블로킹인 경우. 여러 작업을 동시에 시작하지만, 작업의 완료를 명시적으로 기다린다.
- 비동기 + 블로킹(참고): 별도의 스레드에서 블로킹 작업을 수행하고, 그 완료 여부를 메인 스레드에서 비동기적으로 확인합니다.
- 비동기 + 논블로킹: 이벤트 루프와 콜백을 사용하여 여러 작업을 동시에 시작하고, 완료되면 콜백 함수를 호출합니다. 작업 도중에도 다른 작업을 할 수 있습니다.
동기와 비동기는 작업의 순서와 동시성에 대한 부분이라면 블로킹과 논블로킹은 자원이나 프로세스 자체를 다른 것을 못하게 '막는다'라는 개념이다.라고 이해를 하긴 했는데 사실 아직은 이런 것들에 대해서 인지만 하고서 스스로 더 다듬어 나만의 이해를 만들어야겠다.
추가로 더 찾아보니 동기 + 논블로킹은 동기적 작업을 하면서 비동기 작업을 진행하는데 동기적 작업이 순서대로 완료 된 후에 비동기 작업 완료하는 것으로 동기적인 부분의 순서를 보장하는 것이다. 즉, 동기 작업은 순서대로 실행되고 완료되는 것을 보장하면서, 비동기 작업은 블로킹되지 않고 병렬로 처리된다. 그리고 비동기 + 블로킹은 거의 사용되지 않지만 비동기 블로킹은 비동기 작업이 진행되는 동안 코드가 어떤 작업으로 인해, 다른 작업이 대기하거나 중단되는 현상을 가리킵니다. 이는 주로 작업을 순차적으로 진행하거나, 특정 조건이 충족될 때까지 다른 작업을 블로킹하는 경우에 발생한다.
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
23.09.03 스웨거(Swagger) (0) | 2023.09.09 |
---|---|
23.09.02 테스트 코드 (Test Code) (0) | 2023.09.09 |
23.08.31 사인드 업로드(Signed Upload) (0) | 2023.09.07 |
23.08.29 뮤텍스(Mutex) (0) | 2023.09.06 |
23.08.24 node.js (Event 모듈) (0) | 2023.09.03 |