본문 바로가기

카테고리 없음

네티>NIO>IO>시스템콜> 운영체제(OS)

배경 

소켓통신관련 소스(xxx-2.0.22.jar)를 보던중 Netty라는 프레임워크가 있는 것을 보고, 전에 이희승 개발자분이 만든걸로 알고있는 배경지식에 더불어 조금 알아보고 싶어졌다.

Netty는 프로토콜 서버나 클라이언트같은 네트워크 앱의 개발의 편리함을 가능하게 하는 NIO 클라이언트 서버프레임워크이다. 

 

I/O?

I/O 작업은 User(유저 레벨)에서 직접 수행할 수 없고, 실제 IO 작업을 수행하는 것은 Kernel(커널 레벨)에서만 가능하다.
유저 프로세스(또는 스레드)는 커널에게 요청을 하고 작업 완료 후 커널이 반환하는 결과를 기다릴 뿐이다.

대기해야 하느냐에 따라 블로킹/논블로킹으로 나뉘고, 논블로킹도 io작업상황결과를 주도적으로 기다리느냐 수동적으로 기다리느냐에 따라 동기적/비동기적으로 나뉠수있다. 

 

Blocking Model

기본I/O,  linux에서 모든 소켓 통신은 기본 blocking으로 동작한다. I/O 작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다.

https://ju3un.github.io/network-basic-1/

 

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

https://medium.com/pocs/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%95%EC%9D%98%EB%85%B8%ED%8A%B8-1-d36d6c961566

 

리눅스 커널(운영체제) 강의노트 [1]

커널을 공부하는 마음가짐

medium.com

https://medium.com/pocs/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%95%EC%9D%98%EB%85%B8%ED%8A%B8-2-78406a13c5c9

 

리눅스 커널(운영체제) 강의노트[2]

2장을 들어가기 앞서

medium.com

시스템콜↑