I/O 작업이란?
주로 파일의 입출력을 다룰 때 흔히 볼 수 있다.
네트워크에서도 흔히 볼 수 있는데, 소켓의 read와 send가 그 예시이다.
두 대 이상의 컴퓨터끼리 네트워크 통신을 할 때, 한 쪽에서 send하고 다른 쪽에서 read하는 과정을 통해 통신한다.
I/O 작업은 User 레벨에서 직접 수행할 수 없고 실제 I/O 작업을 수행하는 위치는 Kernel(운영체제)에서만 가능하다.
유저 프로세스는 커널에게 요청을 하고, 작업 완료 후 커널에 반환하는 결과를 기다린다.
소켓(Socket)이란?
네트워크 상에서 동작하는 프로그램 간 통신의 종착점이다. 간단히 말해, 특정 문자들을 조합하여 만든 네트워크 주소이다.
소켓은 프로세스가 네트워크를 통해 데이터를 보내거나 받기 위한 창구 역할을 한다.
그러므로 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓에 데이터를 써 보내거나, 소켓으로부터 데이터를 읽어들여야 한다.
Blocking I/O
I/O 작업이 진행되는 동안 유저 프로세스가 자신의 작업을 중단한 채 대기하는 방식이다.
1. 유저는 커널에게 read 작업을 요청한다. (제어권을 넘겨준다)
2. 데이터가 입력될 때까지 대기한다. (제어권을 넘겨주었기 때문에 자기 작업을 제어할 수 없다)
3. 데이터가 입력되면 유저에게 결과가 전달되어야만 자기 작업을 시작할 수 있다. (제어권을 넘겨받는다)
-> 어플리케이션에서 다른 작업을 수행하지 못하고 대기하게 되므로 자원이 낭비된다.
Non-blocking I/O
I/O 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식이다.
1. 유저는 커널에게 read 작업을 요청한다.
2. 데이터의 입력 여부와 관계없이, 요청하는 순간 결과가 반환된다.
3. 입력 데이터가 있을 때까지 1,2번을 반복한다. (제어권을 넘겨주지 않았기 때문에 자기 작업을 할 수 있다)
4. 입력 데이터가 있으면 유저에게 결과가 전달된다.
-> 어플리케이션에서 작업을 오랜 시간 중지하지 않고 I/O 작업을 진행할 수 있으나, 반복적으로 시스템 호출이 발생하기 때문에 자원이 낭비된다.
Synchronous I/O
작업을 요청한 후 작업의 결과가 나올 때까지 기다린 후 처리한다.
Asynchronous I/O
직전 시스템 호출의 종료가 발생하면 그에 따른 처리를 진행한다.
보통 Blocking = Synchronous, Non-blocking = Asynchronous 로 오해하기 쉽다.
하지만 이 4가지는 모두 다른 개념이며, 서로 조합하여 새로운 개념으로 표현된다.
Synchronous Blocking I/O
가장 기본적인 I/O 모델로, 파일을 읽고 쓰는 일반적인 read, write와 같은 I/O 시스템 호출을 의미한다.
어플리케이션에서 Data call을 호출한 후 시스템에서는 데이터가 어플리케이션 버퍼에 복사되기 전까지 리턴하지 않고, 어플리케이션 프로세스는 자신의 작업을 중단한 채 대기하게 된다.
Asynchronous Blocking I/O
어플리케이션에서 최초 데이터 요청 후 시스템에서 output이 준비되지 않은 상태를 어플리케이션에 즉시 반환,어플리케이션은 blocking상태로 대기한다.
대기 상태에 있다가 시스템에서 output이 준비되었다는 신호를 주면 어플리케이션에서 데이터 상태 체크 후 output을 받아온다.
Synchronous Non-blocking I/O
어플리케이션에서 최초 데이터 요청 후 시스템에서 작업은 이어지고, 시스템에서 output이 준비되지 않은 상태를 어플리케이션에 즉시 반환하며 blocking이 발생하지 않는다.
하지만 해당 작업 이후 어플리케이션에서는 시스템으로 지속적인 데이터 상태 체크를 하게 되고, 시스템 버퍼에 데이터가 저장될 때까지 해당 작업을 지속한 후 시스템에서 데이터가 적재되면 그 때 어플리케이션 버퍼에 저장된 후 종료된다.
(이렇게 지속적으로 상태를 체크하여 데이터를 받는 방식을 Polling 이라고 한다)
Asynchronous Non-blocking I/O
Asynchronous I/O 시스템 호출을 하면 버퍼의 포인터, 크기 및 완료시 통지 방법 등을 시스템에 전달하고 즉시 리턴한다.
이 후에 데이터가 버퍼에 복사되어 준비가 완료되면 어플리케이션으로 신호를 발생하여 알려주는 형태이다.
입력과 출력 사이의 Blocking이나 상태 체크가 없기 때문에 그 사이에 다른 프로세스를 진행할 수 있는 장점이 있다.
'Study in SSAFY > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
[네트워크] IP 주소와 IPv4 (0) | 2022.12.28 |
---|---|
[네트워크] TCP / UDP 의 header 분석 (2) | 2022.12.20 |
[프로그래밍 패러다임] 선언형과 함수형 / 객체지향 / 절차형 (0) | 2022.10.12 |
[디자인 패턴] MVC 패턴 / MVP 패턴 / MVVM 패턴 (0) | 2022.10.12 |
[디자인 패턴] 프록시 패턴 / 이터레이터 패턴 / 노출모듈 패턴 (0) | 2022.10.12 |