728x90

비동기 I/O와 동기 I/O

- 동기 I/O의 경우 

    -> Write라는 함수 호출이 되는 순간 데이터가 전송되고 함수가 반환되는 순간이 데이터 전송이 끝나는 순간이라 하면 함수의 호출과 데이터 전송이 동기화 되어 있고 함수의 반환과 데이터 전송의 끝이 동기화 되어 있음

    -> Write함수 호출이 되면 데이터 전송이 끝나기 전까지는 반환이 되지 않기 때문에 다른 일을 할 수 없음

    -> CPU 사용 내용을 보면 CPU를 원활히 사용하지 못하는 모습을 보이는데 I/O 연산때문에 CPU가 blocking 된것을 볼 수 있음

- 비동기 I/O의 경우

    -> Write라는 함수 호출이 되는 순간 데이터가 전송되는 것은 똑같지만 함수가 반환하는 시점이 데이터 전송의 끝을 의미하지는 않음

    -> Write함수가 호출되자마자 함수를 반환하고 내부적으로 데이터를 전송을 하는 것이 비동기 I/O의 특징

    -> Write함수가 호출되지마자 함수가 반환하기 때문에 또 다른 일을 할 수 있음

    -> I/O는 CPU에 의존성이 낮기 때문에 가능한 일

    -> CPU 사용 내용을 보면 CPU를 계속 사용하고 있는 것을 볼 수 있고 CPU가 일을 할 수 있는 적절한 양을 분배 후 동시에 I/O 연산을 진행중인 것

- 비동기 I/O가 좋다고 해서 무조건 비동기 I/O로 작성해야할 필요는 없음

 

비동기 I/O의 종류

- 중첩 I/O

    -> I/O 함수를 호출하고 반환되기 전에 다른 I/O를 중첩하여 호출하는 방식

    -> CPU는 I/O를 진행할 때 느리기도 하고 기다리는 시간이 있는데 동시에 여러 I/O를 중첩하여 진행을 하면 기다리는 시간을 줄일 수 있음

- 완료 루틴 기반 I/O

    -> I/O 연산이 끝나고 하는 부가 작업을 하기 위해 I/O가 끝났는지 확인을 해줘야 하는데 어떤 I/O가 끝났는 지 일일이 확인하는 것은 부담스러운 작업인데 이 문제를 해결하기 위해 등장

    -> 각 I/O가 끝났을 때 실행하는 루틴(함수)를 묶어 끝나면 자동으로 실행할 수 있게 해줌

    -> 어떤 I/O가 끝났는지 따로 확인할 필요가 없음

728x90

+ Recent posts