[CS] Blocking I/O & Non-Blocking I/O

giggle·2023년 8월 14일
0

📌 I/O 작업

I/O 작업은 컴퓨터 시스템과 외부 장치 또는 데이터 소스 간의 데이터 전송을 나타내는 작업입니다. 입출력 작업은 데이터를 읽거나 쓰는 것을 의미하며, 파일 시스템, 네트워크, 디바이스 등과의 상호 작용을 포함합니다. 예를 들어, 파일 읽기/쓰기, 네트워크 통신, 사용자 입력 처리 등이 I/O 작업에 해당합니다.

과정

  1. 요청 발생: 프로세스(스레드)는 I/O 작업을 필요로 할 때 프로세스(스레드) 내부에서 해당 I/O 작업 요청을 전달합니다. 프로세스(스레드)의 메모리를 공유하므로 스레드 간 데이터 공유가 가능합니다.

  2. 운영체제 처리: 프로세스(스레드)의 I/O 요청도 운영체제가 처리하며, 필요한 경우 디바이스 드라이버 등을 활용하여 하드웨어와 통신합니다. 이 과정에서 프로세스(스레드)의 I/O 요청은 대기 상태로 전환됩니다.

  3. 대기 상태: I/O 요청이 처리될 때까지 해당 프로세스(스레드)는 대기 상태(Blocked)가 됩니다. 그러나 이 때 스레드 간의 동시성을 활용하여 다른 스레드가 작업을 계속할 수 있습니다.

  4. 작업 완료: 운영체제가 I/O 작업을 완료하면 해당 결과가 프로세스(스레드)에게 반환됩니다. 프로세스(스레드)는 해당 결과를 처리하고 계속해서 다른 작업을 수행합니다.

📌 Blocking I/O

Blocking I/O는 입출력 작업이 완료될 때까지 호출한 프로세스나 스레드가 대기하도록 만드는 방식입니다. 즉, I/O 작업이 완료될 때까지는 다른 작업을 수행하지 않고 대기하는 것을 말합니다.

과정


1. Read()를 호출
2. 커널에 read I/O를 요청
3. read가 끝날 때까지 application은 block이 되어 다른 작업은 금지
4. 즉, read I/O가 수행될 때까지 application이 다른 작업을 수행하지 못 함

특징

  • I/O 작업이 완료될 때까지 대기하므로 다른 작업을 수행하지 않습니다.
  • 간단한 구현이 가능하며, 작업이 완료되는 시점을 예측하기 쉽습니다.
  • 여러 클라이언트가 동시에 요청하는 경우, 각 요청마다 스레드가 블로킹되어 자원 낭비가 발생할 수 있습니다. -> 멀티 프로세싱으로 해결 가능

📌 Non-Blocking I/O

Non-Blocking I/O는 I/O 작업을 호출한 프로세스나 스레드가 대기하지 않고 다른 작업을 수행하도록 하는 방식입니다. I/O 작업을 호출하고 나서 즉시 반환되며, 이후에 I/O 작업이 완료될 때까지 주기적으로 상태를 체크하거나 이벤트를 감지하는 방식을 사용합니다.

과정


1. read I/O를 하기 위해 시스템 콜 수행
2. 커널이 시스템 콜을 받자마자 CPU 제어권을 다시 application에게 넘겨줌
3. application이 I/O 작업이 완료되기 전에 다른 작업을 수행 가능
4. 중간중간 시스템 콜을 보내서 I/O가 완료되었는지 커널에게 물어보고, 완료되면 I/O작업 완료 처리

특징

  • I/O 작업이 완료되지 않아도 대기하지 않고 다른 작업을 수행할 수 있습니다.
  • 다수의 작업을 동시에 처리할 때 유용하며, 동시성을 활용하여 효율적인 작업 처리가 가능합니다.
  • 반복적인 상태 체크가 필요하여 코드가 복잡해질 수 있습니다.
  • 여러 클라이언트가 동시에 요청해도 블로킹되지 않기 때문에 자원 활용이 효율적입니다.

참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글