Sync와 Async
- 일반적인 경우 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기라하며, 그렇지 않은 경우는 비동기라고 한다.
- 여기서 동기에서 동시에라는 표현은 값이 변환 되기 전까지 blocking되어 있는 것이며 비동기의 경우 blocking 되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임해 바로 바로 다음 코드를 실행하는 것을 말한다.
- 동기/비동기는 두 개 이상의 무엇인가가 시간을 맞춘다/ 안맞춘다로 구분할 수 있다.
- 동기 방식은 메서드 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식이며 한 함수가 끝났다는 시간과 바로 다음 함수가 시작하는 시간이 같다.
- 비동기 방식은 여러 개의 처리가 함께 실행되는 방식으로 동기 방식에 비해 단위 시간당 많은 작업을 처리할 수 있다. 그러나 CPU나 메모리를 맣ㄴ이 사용하는 작업을 비동기로 처리하면 자원의 과부하가 올 수 있으며 프로그램의 복잡도가 증가하게 된다.
Blocking I/O Model
- I/O 작업은 User Level(application)에서 직접 수행할 수 없고 실제 I/O 작업은 Kernel Level(OS)에서 일어난다.
- User Process는 커널(OS)에게 I/O 작업에 대한 요청을 해야하며 I/O 작업을 처리하기 위해 User Level에 있는 Application이 시스템콜(System call)을 수행한다.
- 이 때, 문맥교환(Context-switching)이 발생하며 Kernel Level에서 해당 I/O 작업이 끝나고 데이터를 반환하면 그 때가 되서야 애플리케이션 단에서 스레드에 걸렸던 Block이 풀리게 된다.
- 어플리케이션 관점에서 본다면 Block이 걸려 실제 아무 것도 동작하지 않는 것처럼 보이지만 실제로 커널에서는 I/O 작업을 수행하느라 block 된 것이며 여기서 Block I/O 문제가 발생한다.
Synchronous와 Block IO의 차이
1) Synchronous(동기)
- 작업을 요청하면 해당 작업의 결과가 나올 때까지 기다린 뒤 task를 처리하는 것이며, I/O 작업에 대한 readiness를 기다린다.
- 특정 I/O 작업을 하기 위해 준비가 되었는지를 초점에 두며 I/O 작업 준비에 대한 이벤트의 발생을 기다리다 해당 이벤트가 발생하면 그에 따른 적합한 처리를 수행한다.
2) Blocking
- I/O 작업이 끝날 때까지 대기하는 것을 말하며, 끝나기 전까지 함수가 반환(return) 처리 되지 않는다.
- 커널이 작업을 완료하기 전까지 User Process는 작업을 중단한 채 대기한다.
- 동기화를 위해 Blocking을 수행하는 것이다.
시스템의 반환을 기다리면서 대기 큐에 머무는 것이 필수가 아닌 경우는 synchronous이며 시스템의 반환을 기다리면서 대기 큐에 머무는 것이 필수라면 blocking이다. 따라서 Sync/Async 같은 경우 결과값을 기다리는지에 대한 개념이며 Block/Non-Blcok은 제어권에 대한 개념이다. Block/Non-Blcok은 Sync/Async와 다른 관점으로 내가 직접 제어할 수 없는 대상(I/O or Multi Thread)를 상대하는 방법에 대한 분류이다.
Event Driven Model이란
- 이벤트 통지 모델이며 Non-Blocking에서 제기된 문제를 해결하는 방법 중에 하나이다.
- Non-Blocking은 애플리케이션에서 데이터가 준비되었는지를 계속해서 확인하는 게 아니라 Kernel Level에서 데이터가 준비되었다면 콜백 또는 이벤트를 발생해 어플리케이션에게 알린다.
- User Level에서 계속해서 데이터가 준비되었는지 확인할 필요가 없으며 다음 작업을 수행하다가 커널에서 이벤트가 발생했다면 다시 그 작업으로 돌아가서 일을 처리하면 된다.
1) Synchronous(동기)
- 작업을 요청한 후에 해당 작업에 대한 결과가 나올 떄까지 기다린 후 처리하는 것을 말한다.
- I/O 작업 준비에 대한 이벤트를 기다렸따가 해당 이벤트가 발생하면 그에 따른 적합한 처리를 수행한다.
2) Asynchronous(비동기)
- 작업을 요청한 뒤 다음 task를 처리하다가 해당 작업이 완료되었따는 이벤트가 발생하면 다시 그 작업을 수행한다.
- I/O 작업이 완료되었다는 이벤트를 받는다면 그에 적합한 Handler를 수행한다.
Synch는 작업을 보내고 완료되었다는 시스템 콜을 기다리며, Async는 작업을 보내고 곧 바로 다른 작업을 수행한다.
3) Blocking
- I/O 작업이 끝나 함수가 데이터를 반환(return)할 때까지 대기한다.
- 커널이 작업을 완료하기 전까지는 User Process 는 작업을 중단한 채 대기 큐에서 대기한다.
- I/O 작업은 CPU를 거의 쓰지 않아서 Blcoking 방법은 CPU 자원 낭비가 심하다.
4) Non-Blocking
- Blocking은 커널 작업이 완료될 때까지 대기하므로 CPU 자원 낭비가 심하며 이런 문제를 극복하고자 Non-Blocking이 생겼다.
- I/O 작업을 진행하면서 유저 프로세스는 작업을 중단하지 않는다.
- 유저 프로세스가 I/O 작업이 필요한 프로세스를 수행하면 I/O 작업을 처리하기 위해 커널에 시스템 콜을 호출한다.
- 커널에서 함수의 진행 상황과 상관 없이 바로 결과를 반환(맨 처음에는 완료되지 않았다는 결과)한다.
Blocking은 애플리케이션 실행 시에 대기 큐에 들어가서 요청에 대한 시스템콜이 완료된 후에 응답을 보내며
Non-Blocking은 애플리케이션 실행 시에 대기 큐에 들어가지 않고 실행 여부와 관계없이 바로 응답을 보낸다.
Blocking은 대상의 작업이 끝날 떄까지 제어권을 대상이 가지고 있는 것이며, Non-Blocking은 대상의 작업 완료 여부와 관계없이 새로운 작업을 수행하는 것이다.
Sync + Non-Blocking
- 유저 Application이 커널에 시스템 콜을 하면 커널은 바로 결과가 완료되지 않았음을 알린다.
- 이후에 할 일을 하고 다시 물어보고 결과값이 존재한다면 완료된 결과값을 반환한다.
- 시스템 콜을 하고 결과값을 기다리고 받은 이후 다른 일을 했기 때문에 Sync이다.
- 아직 커널에서 함수가 끝나지 않아(제어권이 다른 함수로 안 넘어감)으로 Non-Blocking이다.
- 계속해서 polling을 수행해서 문맥교환이 지속적으로 발생해 지연이 발생한다.
'CS > 운영체제' 카테고리의 다른 글
스레드 안전(Thread-Safety)란? (0) | 2022.09.25 |
---|---|
프로세스와 스레드의 차이 (1) | 2022.09.11 |
컴퓨터 시스템의 동작 원리-3 (0) | 2021.10.28 |
컴퓨터 시스템의 동작 원리-2 (0) | 2021.10.28 |
컴퓨터 시스템의 동작 원리-1 (0) | 2021.10.28 |