이거 4가지를 이해해놓아야 여러가지로 확장할 수 있음. 특히 블로킹=동기, 논블로킹=비동기로 생각하기 쉬운데 층위 자체가 다른 개념.

(솔직히 나도 제대로 이해했는지는 모르겠지만, 내가 이해하는 바로는 이러하다.)


-------------------------------------------------------------------------------------


블로킹 : 어플이 커널에 시스템콜을 날린다. 이때 커널은 이 콜에 대해 콜의 내용을 다 수행하고 나서야 리턴해준다.

-> 어플은 리턴이 안 오는 동안 놀게 됨. 작업이 완료된 리턴값을 받아감.


논블로킹 : 어플이 커널에 시스템콜을 날린다. 이때 커널은 이 콜에 대해 바로 리턴한다. 하지만 리턴 후에도 작업을 수행한다.

-> 어플은 바로 리턴이 왔으므로 일단 돌아갈 수 있음. 그러나 리턴값에 작업이 안 되어있을 수 있다.


-------------------------------------------------------------------------------------


동기 : 어플과 커널간에 일을 처리함에 있어 정해진 순서가 있다.

-> 어플은 첫번째 일이 제대로 수행되고 나서 두번째 일을 요청한다.

커널도 첫번째 일을 다 처리하고 나서 두번째 일에 착수한다.


비동기 : 어플과 커널간에 일을 처리함에 있어 정해진 순서가 없다.

-> 어플은 첫번째 일의 완료 여부와 관계 없이 두번째 일을 요청한다.

커널도 첫번째 일이 다 처리되지 않았어도 두번째 일에 착수한다. 돌려줄 때도 두번째 일을 먼저 돌려줄 수도 있다.


-------------------------------------------------------------------------------------


그리고 이러한 개념을 조합해서 IO 모델이 나옴.


- 블로킹 & 동기

동기 : 일단 한 단계가 완료되어야 다음 단계를 수행할 수 있는 작업이 있다.

블로킹 : 단계가 완료될까지 죽치고 있는다.


- 블로킹 & 비동기

비동기 : 여러 단계가 뒤죽박죽되도 된다.

블로킹 : 일꾼을 여러놈 만들어서 각자 커널 앞에 죽치게 만든다.


- 논블로킹 & 동기

동기 : 일단 한 단계가 완료되어야 다음 단계를 수행할 수 있는 작업이 있다.

논블로킹 : 단계가 완료되지 않았는데 돌아온다. 그러니 다시 또 보낸다. 완료된 놈 가져올 때까지 계속 보낸다.


- 논블로킹 & 비동기

비동기 : 여러 단계가 뒤죽박죽되도 된다.

논블로킹 : 단계가 완료되지 않았는데 돌아온다. 대신 커널이 다되면 불러준다. 그동안 다른 단계를 위해 새로운 놈 보낸다.