write()가 비동기적으로 쓰고 있나요?

write()가 비동기적으로 쓰고 있나요?

운영 체제 개념의 관점에서

I/O 성능에 영향을 미칠 수 있는 또 다른 문제는 파일 시스템에 대한 쓰기가 동기적으로 발생하는지 아니면 비동기적으로 발생하는지 여부입니다.

동기식 쓰기디스크 하위 시스템에서 수신한 순서대로 발생합니다.쓰기 작업은 버퍼링되지 않습니다.. 그러므로,호출 루틴은 계속하기 전에 데이터가 디스크 드라이브에 도착할 때까지 기다려야 합니다.

안에 비동기식 쓰기,데이터는 캐시에 저장됩니다., 제어권이 호출자에게 반환됩니다.

대부분의 쓰기는 비동기식입니다. 그러나 메타데이터 쓰기 등은 동기식일 수 있습니다.open운영 체제는 종종 프로세스가 쓰기를 동기적으로 수행하도록 요청할 수 있도록 시스템 호출에 플래그를 포함합니다 .예를 들어 데이터베이스는 원자성 트랜잭션에 이 기능을 사용하여 데이터가 필요한 순서로 안정적인 저장소에 도달하도록 보장합니다.

  1. 동기 쓰기에서는 "쓰기가 버퍼링되지 않습니다". 동기 쓰기와 직접 I/O는 동일한 개념인가요?

  2. open"운영 체제는 쓰기가 동기적으로 수행되도록 프로세스가 요청할 수 있도록 시스템 호출에 플래그를 포함하는 경우가 많습니다 ." 동기 쓰기는 어떤 함수를 호출하여 달성되며, 어떻게 됩니까? ?​open()O_DIRECT

  3. write()기본적으로 차단하고 버퍼 캐시에 쓰기가 완료되면 반환된다는 것이 맞습니까(반드시 파일에 쓸 필요는 없음)? write()참조에 정의된 대로 동기 쓰기가 수행됩니까?

  4. aio_write()비동기 I/O라고도 합니다. 비동기식으로 작성 하시겠습니까 aio_write(), 아니면 비동기적으로 작성하지 않으시겠습니까?

감사해요.

답변1

O_SYNC와 O_DIRECT는 다음과 같이 다릅니다.

  • O_SYNC는 디스크 동기화를 유발하지만 콘텐츠는 캐시로 들어가므로 캐시에서 읽은 것입니다.
  • O_DIRECT는 캐싱을 우회하지만 동기화하지는 않습니다.
  • (예를 들어) 습격의 경우, 내가 아는 한 O_DIRECT로 인해 항목이 습격으로 전송될 수 있지만 해당 값 이하로는 전송되지 않습니다.
  • O_SYNC는 전체 디스크 동기화를 발생시켜 다른 파티션 및 기타 파일의 데이터 동기화를 발생시키고 하드웨어 캐시도 플러시할 수 있습니다.

재차단, 예, 아니오:

  • 파일 시스템이 동기식으로 마운트되지 않은 경우 데이터가 커널에 복사되자마자 반환됩니다. 커널에 사용 가능한 버퍼 공간이 있는 한 이는 즉각적입니다. 더 이상 버퍼 공간이 없으면 버퍼 공간이 생길 때까지 차단됩니다.
  • 파일 시스템이 동기 마운트를 사용하는 경우 차단됩니다.

재개설, 출처 man 2 open:

   O_SYNC Write operations on the file  will  complete  according  to  the
          requirements  of  synchronized I/O file integrity completion (by
          contrast with the synchronized  I/O  data  integrity  completion
          provided by O_DSYNC.)

자세한 내용은 맨페이지를 참조하세요.

관련 정보