강좌 & 팁
논블로킹 소켓통신 프로그램을 공부하며 비동기 IO와 무슨 차이인지 헷갈리게 되어서 정리해 보았습니다.
우선 블로킹은 시스템 함수 호출 후 요청작업에서 작업이 완료 될 때까지 스레드가 멈추게 됩니다. 이 경우 말 그대로 컴퓨터에서는 작업이 완료될 때까지 스레드의 코드 실행을 멈추게 됩니다.
반면에 논블로킹에서는 요청을 넘기고, 당장 완료할 수 없다면 리턴해 돌아옵니다.
예를들어 소켓 통신에서 read 할 경우 블로킹은 읽을 데이터가 있을 때까지 기다리지만 논블로킹의 경우 읽을 데이터가 없어도 기다리지 않고
리턴합니다.
여기까지 했다면 이제 프로그램 작성 시 동기와 비동기 IO 프로그램과 블로킹 논블로킹 프로그램이 비슷해 보입니다. 그래서 동기와 비동기 IO 메커니즘도 알아보겠습니다.
동기화 한다는 건 시간을 맞춘다 정도의 의미로 동기 IO는 커널에서 요청작업을 수행해 결과를 알려줄때까지 기다리게 됩니다. 결과를 요청한 타이밍 바로 다음에 맞추어 받는다면 동기 IO라 하는거 같습니다. 여기서 동기 IO는 블로킹 방식과 별로 차이가 없어 보입니다.
비동기 IO에서는 커널에 작업을 요청하면 결과를 기다리지 않고 돌아옵니다. 그리고 결과는 event나 callback 함수를 호출하도록 합니다. 즉, 애플리케이션이 커널에 작업을 요청하고 다른 일을 하다가 요청 작업이 완료되면 커널에서 애플리케이션으로 event나 callback함수를 통해 알려주는 구조입니다.
논블로킹의 경우 프로그램에서 계속적으로 요청을 하고 결과를 확인해야 하지만 비동기는 요청을 걸어놓고 다른작업을 수행하다, 신호가 들어오면 요청이나 작업을 수행한다는 차이를 보입니다.
감사합니다.
[그림 출처] http://devsw.tistory.com/142