배경
소켓통신관련 소스(xxx-2.0.22.jar)를 보던중 Netty라는 프레임워크가 있는 것을 보고, 전에 이희승 개발자분이 만든걸로 알고있는 배경지식에 더불어 조금 알아보고 싶어졌다.
I/O?
I/O 작업은 User(유저 레벨)에서 직접 수행할 수 없고, 실제 IO 작업을 수행하는 것은 Kernel(커널 레벨)에서만 가능하다.
유저 프로세스(또는 스레드)는 커널에게 요청을 하고 작업 완료 후 커널이 반환하는 결과를 기다릴 뿐이다.
대기해야 하느냐에 따라 블로킹/논블로킹으로 나뉘고, 논블로킹도 io작업상황결과를 주도적으로 기다리느냐 수동적으로 기다리느냐에 따라 동기적/비동기적으로 나뉠수있다.
Blocking Model
기본I/O, linux에서 모든 소켓 통신은 기본 blocking으로 동작한다. I/O 작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다.
NIO(Non-blocking I/O) - ex) node.js
유저가 커널에게 (유저->커널) read작업을 요청하면
데이터가 입력이 됬든 안됬든 요청하는 그 순간, 바로 결과가 반환된다.
이 때, 입력 데이터가 없으면 입력 데이터가 없다는 결과 메세지(EWOULDBLOCK)를 반환한다.입력 데이터가 있을 때 까지 1-2번 반복. (2번에서 결과 메세지를 받은 유저는 다른 작업 진행이 가능하다.)
입력 데이터가 있으면 유저에게(커널->유저) 결과가 전달된다.
이 경우 I/O의 진행시간과 관계가 없기 때문에(대기x) 어플리케이션에서 작업을 오랜 시간 중지하지 않고도 I/O 작업을 진행할 수 있다.
그러나 반복적으로 시스템 호출이 발생하기 때문에 이 경우 역시 자원이 낭비된다
역시 Non-Blocking의 제기된 문제를 해결하기 위해I/O 이벤트 통지 모델(동기, 비동기 모델)(수신 버퍼나 출력 버퍼의 이벤트를 통지한다는 의미)이 도입되었다.
동기(Synchronous) Model
약간 blocking, non-blocking 개념과 혼동될 수 있다.
I/O 작업이 진행되는 동안 유저 프로세스는 결과를 기다렸다가 이벤트(결과)를 직접 처리하는 방식이다.
이 때 유저 프로세스는 blocking 방식처럼 다 될 때까지 기다릴 수도 있고, non-blocking처럼 커널에 계속 요청하는 방식으로 기다릴 수도 있다.
여기서 요점은, '오매불망이던, 딴 짓을 하면서던 결국은 기다린다'는 것이다.
결국 notify를 유저 프로세스가 담당하여 주체적으로 진행하며, 커널은 유저 프로세스의 요청에 수동적으로 응답한다.
비동기(Asynchronous)
I/O 작업이 진행되는 동안 유저 프로세스는 관심이 없다.
그저 자신의 일을 하다가 이벤트 핸들러에 의해 알림이 오면 처리하는 방식이다.
유저 프로세스는 요청 후에, I/O 동기화를 신경쓸 필요가 없고 이벤트 핸들러(또는 callback)에 의해 운영체제에서 처리 결과를 통지 받는 방식이다.
결국 notify를 커널이 담당하여 주체적으로 진행하며, 유저 프로세스는 수동적인 입장에서 통지가 오면 그 때 I/O 처리를 한다.
블로킹(Blocking), 논블로킹(Non-Blocking), 동기(Synchronous), 비동기(Asynchronous) 정리
- 블로킹(Blocking): I/O 작업 상황(결과) 기다림 O / 대기 큐 필수 stay O
- 논블로킹(Non-Blocking): I/O 작업 상황(결과) 기다림 O / 대기 큐 필수 stay X
- 동기(Synchronous): I/O 작업 상황(결과) 기다림 O / 대기 큐 필수 stay X
- 비동기(Asynchronous) : I/O 작업 상황(결과) 기다림 X / 대기 큐 필수 stay X
기타 - 커널에게 부탁할 일이 생기면 System call(System Call이란 멀티유저 시스템에서 한 프로세스가 다른 프로세스에 I/O로 함부로 접근해 데이터를 망치는 일을 사전방지(Prevent)하기 위해 나온 방법)을 한다,
모드비트(1,0)
커널모드,유저모드
참고자료
https://ju3un.github.io/network-basic-1/
블로킹(Blocking), 논블로킹(Non-Blocking) - I/O 모델 (1)
당분간 네트워크 관련 개념에 관한 포스팅으로 정리를 하려고 한다. 일단 네트워크 프로그래밍에서 가장 기본적인 개념에 대해 정리할 예정이다. 이번 포스팅에서는 Blocking/Non-Blocking Model에 대
ju3un.github.io
https://ju3un.github.io/network-basic-2/
동기(Synchronous), 비동기(Asynchronous) - I/O 모델 (2)
이번 포스팅에서는 동기, 비동기에 대해 정리를 해보려고 한다. 마침 방금 전에 개인 프로젝트로 DebugView 주제가 나와서 친구랑 이야기하고 있는데 콜백 함수 언급으로 비동기 이야기가 나오면
ju3un.github.io
https://luckyyowu.tistory.com/133
운영체제 04 : 시스템 콜 (시스템 호출, System Call)
참고 도서는 'Operating System Concepts 8th' 입니다. (포스팅 하단부 참고) 개인공부 후 자료를 남기기 위한 목적으로 포스팅합니다. 내용 상에 오류가 있을 수 있습니다. 2.3 시스템 호출 (System Calls) 정
luckyyowu.tistory.com
운영체제 04 : 시스템 콜 (시스템 호출, System Call)
참고 도서는 'Operating System Concepts 8th' 입니다. (포스팅 하단부 참고) 개인공부 후 자료를 남기기 위한 목적으로 포스팅합니다. 내용 상에 오류가 있을 수 있습니다. 2.3 시스템 호출 (System Calls) 정
luckyyowu.tistory.com
https://jeong-pro.tistory.com/145
자바 NIO 정리 #1 개요 ("JAVA는 느리다"라는 말이 생긴 이유와 개선책, 성능이 좋아지는 입출력 포
"자바는 느리다" - 어디가 느릴까? 진짜 느릴까? "자바는 느리다." 라는 말은 어느 정도 프로그래밍을 해온 개발자들이라면 들어봤을 법한 말이다. 그런데 자바가 어디가 느리고 왜 느린지, 그
jeong-pro.tistory.com
리눅스 커널(운영체제) 강의노트 [1]
커널을 공부하는 마음가짐
medium.com
리눅스 커널(운영체제) 강의노트[2]
2장을 들어가기 앞서
medium.com
시스템콜↑