😊
blocking/non-blocking, synchronous/asynchronous
August 21, 2022
시작
읽기 전에 알면 좋은 내용:
- blocking/non-blocking, synchronous/asynchronous 은 운영체제와 관련된 개념이다
- blocking/non-blocking은 I/O와 엮어서 보면 조금 더 이해가 잘되는 듯 하다
- synchronous/asynchronous는 I/O와 엮어서 보면 조금 더 헷갈리는 듯 하다. I/O에서는 synchronous + blocking, asynchronous + non-blocking 방식으로 구현되어 있기 때문에 synchronous = blocking, asynchronous = non-blocking으로 생각되어 헷갈리는 것 같다
- 프로세스는 메모리에 올라가 실행되는 상태에 있는 프로그램이다
- 프로세스는 싱글 or 멀티 스레드를 가질 수 있다
- 스레드는 프로세스의 상태 및 스택에 대한 정보를 공유하지 않고 그 외의 메모리에 저장된 프로세스의 정보를 공유한다
- 프로세스는 스레드에서 작업을 처리한다. 따라서 싱글 스레드인 경우에는 프로세스 = 스레드라고 이해하면 편하다
- 스레드에는 유저 레벨/커널 레벨 스레드가 있다
- I/O 작업은 커널레벨 스레드에서 처리된다
- 하나의 CPU core 에서는 하나의 작업만 처리 가능하다. 만약 여러 작업을 처리해야하거나 메모리가 부족한 경우 현재 프로세스를 PCB 형태로 저장한 후 다른 프로그램을 메모리에 올리는 것을 컨텍스트 스위칭이라 한다. 간단하게 말하면 CPU 에 실행될 프로세스를 교체하는 것이다
- PCB는 프로세스의 상태 정보(이전 작업 정보)를 저장해 놓은 데이터 구조이다
요약
- blocking/non-blocking은 호출되는 프로세스가 제어권을 호출하자마자 돌려주는지 아니면 할일을 처리하고 돌려주는지에 대한 것이다
- synchronous/asynchronous는 호출되는 프로세스의 작업이 완료 되었는지에 대한 결과나 상태를 호출하는 프로세스가 신경 쓰는지에 대한 것이다
Blocking/Non-blocking
유저레벨 프로세스에서 I/O 이벤트를 받게 되면 커널 레벨 프로세스에 처리 요청을 하는데(=시스템 함수를 호출하는데) 이때 컨텍스트 스위칭이라는 것이 발생할 수 있다
Blocking
컨텍스트 스위칭이 발생할때 유저 레벨 프로세스는 blocking이 된다. (=제어권이 유저레벨 프로세스에서 커널로 넘어가 커널에서 I/O 작업이 완료될때 까지 다른 작업을 하지 못한다)
Non-blocking
non-blocking에서는 유저레벨 프로세스에서 커널레벨 프로세스에 I/O 처리 요청을 했는데 커널레벨 프로세스에서 곧바로 제어권을 돌려주어 유저레벨 프로세스가 요청 후 바로 다시 제어권을 갖게되어 다시 작업을 이어서 할 수 있다. 이 후에 유저레벨 프로세스는 polling을 통해 지속적으로 커널레벨 프로세스에 요청한 I/O의 결과 데이터가 준비되었는지 확인하고 준비된 경우에는 짧은 시간동안 blocking이 된다. 그러니까 non-blocking이라고, 아예 blocking이 안되는건 아닐 수도 있다는 것이다
Synchronous/Asynchronous
synchronous와 asynchronous 개념은 context에 따라 다르게 해석될 수 있어서 그런지 이해하기가 힘들었다. 그래서 특징들을 나열하는 걸로 대신했다
Synchronous
- 프로세스에서 어떤 작업을 하고 있다면 해당 작업이 끝날때 까지 다른 작업이 실행되는 것을 막는 것이다 (프로세스가 멀티 스레드인 경우는 이것이 불가능하다. 따라서 synchronous 하지 않다) 즉, 하나의 프로세스에서 작업이 순차적으로 실행되게 보장하는 것이다
- 작업 사이에 인과관계가 있어야 한다. 예를들어 호출되는 함수의 작업 결과를 호출하는 함수에서 사용해야 한다
- I/O에서 non-blocking일때 polling으로 작업 여부를 확인하는 것처럼 작업 완료 상태를 동기화 하는 작업이 지속적으로 이루어진다
Asynchronous
- 프로세스가 멀티 스레드를 가지고 있을때 스레드 A에서 작업 A를 처리하고 스레드 B에서 작업 B가 동시에 처리될 수 있다 스레드 사이의 동작이 순차적으로 진행되지 않아 결과를 예측하기 힘들다 (프로세스가 싱글 스레드인 경우는 자바스크립트에서 Web API가 처리 되는것 처럼 외부에 다른 스레드가 있어야함)
- 작업 사이에 인과관계가 없어도 된다
- 작업 완료 상태에는 관심이 없고 예를 들어 callback 함수 같은 것을 넘겨 주어 해당 함수의 작업이 완료되면 callback으로 알아서 대응되게 한다
끝
자바스크립트가 왜 single threaded + non-blocking인지에 대해 공부하려다가 딥하게 들어갔는데 딥하게 들어가니 예전에 대충 공부해서 그런지 힘들다..
최신 기술이나 포트폴리오도 중요하지만 요렇게 파고드는 것도 재밌는 것 같고 기반을 탄탄히 다지는 느낌이 든다
😊