I/O 작업은 컴퓨터 시스템과 외부 장치 또는 데이터 소스 간의 데이터 전송을 나타내는 작업입니다. 입출력 작업은 데이터를 읽거나 쓰는 것을 의미하며, 파일 시스템, 네트워크, 디바이스 등과의 상호 작용을 포함합니다. 예를 들어, 파일 읽기/쓰기, 네트워크 통신, 사용자 입력 처리 등이 I/O 작업에 해당합니다.
과정
요청 발생: 프로세스(스레드)는 I/O 작업을 필요로 할 때 프로세스(스레드) 내부에서 해당 I/O 작업 요청을 전달합니다. 프로세스(스레드)의 메모리를 공유하므로 스레드 간 데이터 공유가 가능합니다.
운영체제 처리: 프로세스(스레드)의 I/O 요청도 운영체제가 처리하며, 필요한 경우 디바이스 드라이버 등을 활용하여 하드웨어와 통신합니다. 이 과정에서 프로세스(스레드)의 I/O 요청은 대기 상태로 전환됩니다.
대기 상태: I/O 요청이 처리될 때까지 해당 프로세스(스레드)는 대기 상태(Blocked)가 됩니다. 그러나 이 때 스레드 간의 동시성을 활용하여 다른 스레드가 작업을 계속할 수 있습니다.
작업 완료: 운영체제가 I/O 작업을 완료하면 해당 결과가 프로세스(스레드)에게 반환됩니다. 프로세스(스레드)는 해당 결과를 처리하고 계속해서 다른 작업을 수행합니다.
Blocking I/O는 입출력 작업이 완료될 때까지 호출한 프로세스나 스레드가 대기하도록 만드는 방식입니다. 즉, I/O 작업이 완료될 때까지는 다른 작업을 수행하지 않고 대기하는 것을 말합니다.
1. Read()를 호출
2. 커널에 read I/O를 요청
3. read가 끝날 때까지 application은 block이 되어 다른 작업은 금지
4. 즉, read I/O가 수행될 때까지 application이 다른 작업을 수행하지 못 함
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작업 완료 처리
피드백 및 개선점은 댓글을 통해 알려주세요😊