[운영체제] 파일 시스템 3 : Page Cache & Buffer Cache, Memory-Mapped I/O, Unified Buffer Cache

드림보이즈·2023년 8월 8일
0

Page Cache & Buffer Cache

Page Cache

  • Virtual memory의 paging system에서 사용하는 page frame을 caching에 관점에서 설명하는 용어
  • Memory-Mapped I/O를 쓰는 경우 file I/O에서도 page cache 사용

Memory-Mapped I/O

  • File 일부를 virtual memory에 mapping 시킴
  • 매핑시킨 영역에 대한 메모리 접근 연산은 파일의 입출력을 수행하게 함

Buffer Cache

  • 파일 시스템 통한 I/O 연산은 메모리 특정 영역인 buffer cache 사용
  • file의 locality 활용
    - 한번 읽어온 block에 대한 후속 요청시 buffer cache에서 즉시 전달
  • 모든 프로세스가 공용으로 사용
  • Replacement algorithm 필요(LFU,LRU 등)

Unified Buffer Cache

  • 최근 OS에서는 기존 buffer cache가 page cache에 통합됨

Page Cache는 본래 프로세스의 일부 페이지들을 메모리에 올려놓고 사용할 때 썼는데,
Memory-mapped I/O를 쓰는 경우 file 일부를 메모리에 올리기 때문에 page cache가 사용된다.

File I/O에는 두 가지 유형이 있다. memory-mapped I/O를 사용하거나 open() write()를 쓰거나.

전자의 경우 어떤 프로세스가 memory-mapped I/O를 쓰겠다고 요청하면,
운영체제가 파일 시스템에서 일부를 버퍼 캐시에 가져온 뒤,프로세스의 가상 메모리에 할당한다.
그 내용을 복사해 page cache에 붙여넣어 준다.
이 이후에는 운영체제에 read, write 요청을 할 필요없이, 메모리 접근하듯이 읽고 쓰기가 가능한 것이다.

또는 시스템 콜로 open(), write() 요청을 하면,
운영체제가 파일 시스템에서 해당 파일의 컨텐츠를 버퍼 캐시에 가져온 뒤,
그 내용을 복사해 프로세스에 할당한다.

후자의 경우 문제가 없지만, 전자의 경우 buffercache를 거쳐 page cache에 복붙하는게 비효율적이라는 것이다.
그래서 둘을 통합한 것을 쓰겠다는 것이다.

이제는 너무 익숙한 그림이지만, 여기서 실행파일의 code 영역은 swap area로 쫓겨나는게 아니라 file system에 있다.
code도 일종의 file이기 때문이다.


프로세스 B를 실행 중에, 한 데이터 파일에 대해 memory-mapped I/O를 요청한 상황을 가정해보자.

프로세스 B가 운영체제에
"저 데이터 파일의 일부를 제 가상 메모리 일부에 mapping 시켜주시오"
시스템 콜 한다.

이제 프로세스 B의 가상 메모리 일부에, 데이터 파일의 피지컬 메모리 주소가 매핑되어있다.
이젠 더 이상 운영체제 도움없이, 바로 접근하여 읽고 쓰기가 가능하다.
만약 매핑이 안된다면 page fault가 발생해, 운영체제가 올려줄 것이다.

이 상황에서 프로세스 A가 똑같은 read()로 데이터 파일을 요청한다면? (memory-mapped와 다른 방법으로)
피지컬 메모리에 담긴 내용을 카피해서 프로레스 A의 메모리에 복붙한다.
Buffer cache를 Page Cache가 일치하는 순간인 것이다.

profile
시리즈 클릭하셔서 카테고리 별로 편하게 보세용

0개의 댓글

관련 채용 정보