비동기(Async)와 동기(Sync)
비동기(Async)란 지금 당장 호출(call)은 해야 하지만 결과는 나중에(back) 받아도 되는 경우에 사용된다. 반대로 동기(Sync)는 지금 요청하고 결과도 받아야 하는 경우 사용한다.
예를들어, 요리에 바쁜 어머니가 아들한테 그릇 세팅하라고 시키는 것은 비동기이다. 그릇은 미리 세팅되어 있으면 좋다. 그래서 어머니 스레드는 아들 스레드에게 그릇세팅 로직을 호출(CALL) 했고 아들은 어머니가 요리하고 있는 사이 그릇 세팅을 완료한 다음 어머니에게 알린다(Back). 요리가 끝난 어머니는 세팅되어 있는 그릇에 음식을 담는다. 동기(Sync)의 경우, 라면을 끓일 때, 스프를 넣고 물이 끓어야 면을 넣는다. 이것은 동기다. 스프를 넣는 로직이 수행되고 물이 100도씨가 되어야 면을 넣는 로직이 수행될 수 있다.
이처럼 비동기(Async)는 로직을 호출(call)하고 처리는 잠시 뒤로(back) 미루는 것이고 동기화(Sync)는 로직을 순서대로 처리하는 것을 의미한다.
그럼 개발 관련 예시로 이해해보자.
Javascript에서 ajax, axios 라이브러리는 비동기 통신으로 유명하다. 클라이언트가 서버에 요청을 보낼 때, 서버에서 응답이 올 때까지 클라이언트 로직이 멈추어 있을 수 없다. 요청은 ajax나 axios에게 맡기고 클라이언트는 나머지 로직을 수행한다. 그러다가 응답이 오면 콜백함수(CallBack)로 처리한다.
동기 방식의 대표적인 예는 JDBC가 있다. 서버와 DB 사이의 통신은 트랜잭션 단위로 이루어진다. 원자성이 중요하므로 처리 하나 하나가 동기적으로 완료되어야 한다. 만약 하나의 과정에서 오류가 발생하면 전 과정이 모두 롤백된다. 서버가 JDBC에게 DB 통신을 요청하면 JDBC가 요청을 하고 결과를 응답할 때까지 서버는 대기한다. 그리고 응답결과를 받으면 다음 로직을 수행한다.
OS 관점에서의 동기와 비동기
동기와 비동기의 개념은 서로 다른 처리단위 사이에서 이해하는 것이 좋다.
스레드나 프로세스 같은 처리단위는 CPU(처리기)에 할당되는 단위이다. 어머니 스레드가 아들 스레드에게 그릇 세팅 요청을 했을 때, 어머니 스레드가 그릇 세팅이 완료될 때까지 대기하면 동기(Sync), 대기하지 않고 다른 로직을 처리하면 비동기(Async)이다. 서버 프로세스는 DB 프로세스가 응답을 반환할 때까지 대기 하므로 동기(Sync)이다.
블로킹 동기 ( Sync-Blocking )
프로세스는 준비큐에 들어가 대기하다가 처리기 할당을 받는다. 그러다가 I/O가 발생하거나 다른 동작이 선행되어야 하는 경우 블로킹 시켜 블록큐에 대기한다. 블록상태는 RAM 메모리를 할당받은 상태여서 언제든 선행작업이 완료되면 준비큐에 들어갈 수 있다. 대부분의 동기(Sync) 방식은 블로킹 방식으로 이루어진다.
서버 프로세스가 작업을 처리하다가 DB 요청 로직을 만나면 I/O 작업이 필요하므로 블로킹 처리가 된다. DB 컴퓨터에서 작업을 처리하고 서버 컴퓨터로 응답결과를 반환할때까지, 서버프로세스는 블록상태가 되어 블록큐에서 대기한다. 그러다가 I/O가 완료되면 다시 준비상태가 되어 준비큐에서 처리기 할당을 대기한다.
이것이 블로킹 동기 방식(Sync-Blocking)이다.
블록상태가 되지 않고 처리기를 계속 점유하면서 I/O가 완료되었는지 체크하는 방식도 있다. 이것은 논블로킹 동기(Sync-NonBlocking) 방식으로, I/O가 완료될 때가지 CPU를 계속 점유한다는 점에서 효용이 떨어져 잘 사용하지 않는다.
넌블로킹 비동기 ( Async-NonBlocking )
비동기 방식은 동기 방식처럼 I/O를 대기하지 않는다. 다른 프로세스나 스레드를 생성 및 실행만 시키고 바로 다른 일을 한다. 그러므로 블록상태가 되지 않고 처리기를 점유하며 작업을 처리한다. Async-Blocking 방식도 존재한다고는 하는데 거의 사용되지 않는다고 한다.
https://interconnection.tistory.com/141
'CS > OS' 카테고리의 다른 글
[OS] 가상메모리(Virtual Memory)란? (0) | 2024.01.25 |
---|---|
[OS] 멀티 프로세스 vs 멀티 스레드 (0) | 2024.01.18 |
[OS] 프로세스 스케줄링 ( Process Scheduling ) (0) | 2024.01.17 |
[OS] PCB란 무엇일까? (0) | 2024.01.15 |
[OS] 프로세스(Process)란 무엇일까? (0) | 2024.01.15 |