5. 직접 입출력
System/System Programming

5. 직접 입출력


직접 입출력


  다른 운영체제들과 마찬가지로 리눅스 커널은 디바이스와 응용 프로그램 사이에 캐시, 버퍼링, 입출력 관리 등과 같은 복잡한 계층을 구현하고 있다. 성능이 중요한 응용 프로그램에서는 이런 복잡한 계층을 우회해서 직접 입출력을 관리하고 싶을 수도 있다.





  독자적으로 입출력 시스템을 운영하는 것은 확실히 ... 매력적이다! 전반적인 파일 시스템 구조를 뜯어보면서 지식을 더 쌓아나가고, 더 나아가 결과물까지 구현이 된다면 좋은 포트폴리오로 남을 수 있을 것이다. 하지만 보통 들인 노력에 비해 효과가 미미하며, 사실 운영체제 수준에서 제공하는 도구는 애플리케이션에서 가능한 방법보다 훨씬 뛰어난 성능을 낸다. 물론 데이터베이스 시스템은 독자적인 캐시를 선호한다. 또한 운영체제의 개입을 가능한 최소한으로 줄이기를 원한다.

  open() 시스템 콜 호출에 O_DIRECT를 사용하면 커널이 입출력 관리를 최소화하도록 한다. 이 플래그를 넘기면, 페이지 캐시를 우회하여 사용자 영역 버퍼에서 직접 디바이스로 입출력 작업을 시작하게 할 수 있다. 모든 입출력은 이전 포스팅에서 다루었던 동기화 방식으로 동작하며, 호출은 입출력 자업이 완료된 후에야 반환된다.

  직접 입출력을 수행할 때 요청하는 크기, 버퍼 정렬, 파일 오프셋 등은 모두 디바이스의 섹터 크기[각주:1]의 정수배가 되어야 한다. 애플리케이션에서 호환성을 유지하기 위해서는 논리 블록 크기보다 더 큰 값으로 맞추도록 해야 한다.


  1. 일반적으로는 512byte [본문으로]

'System > System Programming' 카테고리의 다른 글

7. 파일 탐색하기 - lseek()  (0) 2019.04.25
6. 파일 닫기 - close()  (0) 2019.04.24
4. 동기식 입출력 - fsync(), fdatasync()  (2) 2019.04.22
3. 파일 쓰기 - write()  (0) 2019.04.16
2. 파일 읽기 - read()  (0) 2019.04.15