준비 대 완료 비동기 IO 메모리 사용량?


12

Rust에서 비동기 IO를 구현하는 것에 대한 이 이야기 를 보고 있었고 Carl은 두 가지 잠재적 모델을 언급했습니다. 준비와 완성.

준비 모델 :

  • 커널에게 소켓에서 읽고 싶다고 말하십시오.
  • 잠시 다른 일을하세요…
  • 커널은 소켓이 준비되면 알려줍니다
  • 당신은 읽습니다 (버퍼 채우기)
  • 필요한 것은 무엇이든 해
  • 버퍼를 비 웁니다 (Rust에서 자동으로 발생)

완성 모델 :

  • 커널이 채울 버퍼를 할당합니다
  • 잠시 다른 일을하세요…
  • 커널은 버퍼가 채워 졌을 때 알려줍니다
  • 데이터에 필요한 모든 것을 수행
  • 버퍼 해제

준비 모델을 사용하는 Carl의 예에서는 준비된 소켓을 채우고 전역 버퍼를 해제하여 메모리를 훨씬 적게 사용하는 것처럼 보일 수 있습니다 .

이제 내 가정 :

소켓이 "준비"되었다고 말할 때 (커널 공간에서) 후드 아래에 데이터가 이미 존재합니다. 네트워크를 통해 (또는 어디서나) 소켓에 들어 왔으며 OS가 데이터를 보유하고 있습니다.

메모리 준비가 마술처럼 준비 모델에서 일어나지 않는 것처럼 보이지 않습니다. OS가 당신에게서 그것을 추상화하고 있다는 것입니다. Completion 모델에서 OS는 데이터가 실제로 유입되기 전에 메모리를 할당하도록 요구하고 있으며 무슨 일이 일어나고 있는지 분명합니다.

준비 모델의 수정 된 버전은 다음과 같습니다.

  • 커널에게 소켓에서 읽고 싶다고 말하십시오.
  • 잠시 다른 일을하세요…
  • 수정 : OS로 데이터가 들어옴 (커널 메모리의 일부)
  • 커널은 소켓이 준비되었다고 알려줍니다
  • 읽습니다 (위의 커널 버퍼와 별도로 다른 버퍼를 채 웁니다 (또는 포인터를 얻습니까?)).
  • 필요한 것은 무엇이든 해
  • 버퍼를 비 웁니다 (Rust에서 자동으로 발생)

/ 내 가정

사용자 공간 프로그램을 작게 유지하고 싶지만 실제로 여기서 일어나는 일에 대한 설명을 원했습니다. 하나의 모델이 본질적으로 더 적은 메모리를 사용하거나 더 높은 수준의 동시 IO를 지원한다는 것을 알지 못합니다. 나는 이것에 대한 생각과 더 깊은 설명을 듣고 싶습니다.


나는 또한 그 YouTube 대화에서 여기에 도착했습니다. 방법 IO 비동기 또는 방법 이벤트 루프를 구현하는 방법에 대해 배우는 사람의 경우, 녹 팀은 "Aysnc 인터뷰"의 재생 목록이 여기에 지역 사회에서 매우 지식이있는 사람들 인터뷰
cacoder을

답변:


5

준비 모델에서 메모리 소비는 응용 프로그램이 소비하지 않은 데이터의 양에 비례합니다.

완료 모델에서 메모리 소비는 미해결 소켓 호출 량에 비례합니다.

대부분 유휴 상태 인 소켓이 많은 경우 준비 모델은 더 적은 메모리를 사용합니다.

완료 모델에 대한 쉬운 수정이 있습니다. 1 바이트의 읽기를 시작하십시오. 이것은 작은 버퍼 만 소비합니다. 읽기가 완료되면 나머지 데이터를 가져 오는 다른 (동기식) 읽기를 실행하십시오.

일부 언어에서는 완료 모델이 구현하기가 매우 간단합니다. 나는 그것이 좋은 기본 선택이라고 생각합니다.


1

Completion 모델에서 OS는 데이터가 실제로 유입되기 전에 메모리를 할당하도록 요구하고 있으며 무슨 일이 일어나고 있는지 분명합니다.

그러나 공간을 할당 한 것보다 많은 데이터가 들어 오면 어떻게됩니까? 커널은 여전히 ​​데이터를 삭제하지 않도록 자체 버퍼를 할당해야합니다. (예를 들어, usr의 답변에 언급 된 1 바이트 읽기 트릭이 작동하는 이유입니다.)

단점은 완성 모델이 더 많은 메모리를 소비하는 반면, 버퍼를 유지하면 하드웨어가 직접 또는 외부로 DMA 할 수 있기 때문에 복사 작업을 더 적게 수행 할 수 있다는 것입니다. 또한 완성 모델은 적어도 Windows IOCP에 대해 다른 스레드에서 실제 복사 작업 (있는 경우)이 실제 복사 작업을 수행하는 경향이 있다고 의심하지만 확실하지는 않지만 준비 모델은 비 차단 read()또는 write()요구.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.