블록 모드: scanf() 해보시면 터미널상에서 엔터를 칠 때까지 프로그램의 실행이 중지되어 있듯이, 데이터가 입력될 때까지 실행이 중단되는 방식을 말합니다.
논블록 모드는 더 이상 읽을 데이터가 없을 경우 데이터가 생길 때까지 기다리지 않고 바로 리턴하는 방식을 말합니다. 이때, 에러값을 리턴하지요. (EAGAIN 혹은 EWOULDBLOCK) 기본값(블록 모드)으로는 데이터가 없으면 생길 때까지 기다립니다.
그리고 블록 모드나 논블록 모드는 필요한 곳에 맞게 사용하면 됩니다. 쓰레드를 생각해봐도 단일 쓰레드냐 멀티 쓰레드냐 하는 것은 상황에 따라 더 적절한 방법이 따로 있다고 생각합니다. 많은 파일 디스크립터를 소수의 쓰레드로 처리할 때 논블록 모드가 필수적으로 필요할 수 있습니다.
블록 모드만 사용하는 것은 프로그램의 구조를 단순하게 유지하기에 좋고 그만큼 잘못된(비효율적인) 코드를 만들 가능성도 줄어듭니다. 따라서 블록 모드를 우선으로 고려하는 것이 바람직합니다. 그러나 많은 파일 디스크립터를 다룰 때 쓰레드나 프로세스도 많이 필요해지는 부담이 있겠지요.
busy waiting은 잘못된 코딩의 문제이지 블록/논블록의 문제는 아니라고 생각됩니다. sleep과 read(non-block)의 조합도 적당히 사용하면 시스템에 별 부담이 없습니다. 또한 게임 클라이언트와 같이 어차피 CPU 100% 쓰는 경우, 매번 select+read 할 바에는 바로 non-block read하는 게 더 효율적이기도 합니다.
'it 기본 상식들' 카테고리의 다른 글
하이브리드 앱이란 (0) | 2015.06.24 |
---|---|
윈도우 서비스 경로 (0) | 2015.06.23 |
코드 리팩토링 관련 글 (0) | 2015.05.27 |
컴퓨터 용량 단위 (0) | 2015.05.07 |
eclipse go back (0) | 2015.04.21 |