지난 시간
page cache

- page cache는 메모리 관리의 중요한 개념으로, 운영체제가 효율적으로 메모리를 사용하기 위해 페이지 프레임을 관리하는 방식과 관련이 있다.
- 운영체제는 메모리에 페이지 프레임(page frame)을 할당하여, 프로세스가 당장 필요로 하는 데이터를 메모리에 올려둔다. 당장 필요하지 않은 데이터는 메모리에서 쫓아내고, 필요한 경우 다시 불러온다.
- 프로세스의 주소 공간을 구성하는 각 페이지는 두가지 상태 중 하나다.
- swap area: 메모리에서 쫓겨난 페이지가 디스크이 swap area로 내려가 있는 상태. 페이지가 다시 필요해지면 스왑영역에서 메모리로 다시 로드된다.
- page cache:메모리가 올라가 있는 상태로, 최근에 사용된 페이지가 캐싱되어 있어 빠르게 접근할 수 있다.
- page cache는 디스크 i/o를 줄이고 메모리 접근 속도를 높이기 위해 사용되며, 효율적인 메모리 활용을 통해 시스템 성능을 최적화한다.
buffer cache

- 프로그램이 실행될 때, 파일 입출력을 수행하는 경우가 발생할 수 있다.
- 프로그램이 파일을 읽기 위해
read
시스템 호출을 하면, 운영체제는 디스크에 있는 파일 데이터를 파일 시스템을 통해 읽어온다.
- 이 데이터는 먼저 버퍼 캐시에 저장된 후, 사용자 프로그램에 전달된다.
- 이후 동일한 데이터 요청이 발생하면, 디스크에 접근하지 않고 버퍼 캐시에서 데이터를 바로 제공하여 성능을 향상시킨다
비교

핵심
- page cache는 process의 주소 공간을 구성하는 page가 swap area에 내려가있는가? page cache에 올라가 있는가?에 대한 내용
- buffer cache는 파일 데이터가 file system storage에 저장되어 있는가? 운영체제의 buffer cache에 올라가 있는가?에 대한 내용
단위
- page cache의 단위는 page단위가 될 수 밖에 없음. 4KB(킬로 바이트) 단위의 page 사용 중.
- buffer cache의 단위는 디스크에서 어떤 파일의 block을 읽어와라 ~ 하는데, block이라는 것은 논리적인 block, 디스크에서는 이 sector 단위를 이야기함. 이 sector나 논리적인 블록이 옛날엔 512 byte였음. 그래서 4KB의 page에 비해서 다소 작은 단위임.
- 하지만 최근에는 buffer cache가 page cache와 통합이 되면서 (특히 리눅스) 그래서 buffer cache에서 사용하는 단위도 똑같은 4KB의 page 단위를 쓴다는 것.
Memory-Mapped I/O
파일 입출력을 효율적으로 처리하기 위해 메모리를 사용하는 기법이다. 이 기법에서는 프로세스의 주소 공간의 일부를 파일에 매핑하여, 파일에 대한 입출력을 메모리 접근처럼 수행할 수 있도록 한다.
- 주소 공간의 매핑 :
- 프로세스의 주소 공간 일부를 파일 시스템의 특정 파일에 매핑한다. 이 매핑을 통해, 해당 메모리 영역에 접근하는 것이 곧 파일의 특정 부분에 접근하는 것과 동일해진다.
- 메모리 접근을 통한 파일 입출력 :
- 매핑이 완료되면, 프로세스는 파일에 데이터를 쓰거나 읽는 대신, 마치 메모리에 데이터를 쓰고 읽는 것처럼 파일에 접근할 수 있다.
- 예를 들어, 파일의 내용을 읽기 위해 별도의
read
시스템 호출을 사용할 필요 없이, 매핑된 메모리 영역에서 직접 데이터를 읽으면 된다.
Page Cache and Buffer Cache

기존의 read, wirte 시스템 콜을 쓰는 방식에 대해서 이 그림을 통해 먼저 설명한 후
그리고, Unified Biffer Cache때 어떻게 구조가 바뀌었는지 이야기해보자.
기존
기존의 파일 데이터를 읽고 쓰는 방법은, 두가지 interface가 있는 것.

파일 입출력 하는 방법
-
- file을 open 한 다음에 read() wirte() 시스템 콜을 하는 것. 그러면 운영체제가 해당하는 파일의 내용이 buffer cache에 있으면 바로 전달, 없으면 디스크 파일 시스템에서 읽어와서 전달.
- 이것이 read/write 시스템 콜을 이용하는 경우에 i/o를 하는 경로임
- file system => buffer cache : 운영체제가 file system에 있는 내용을 buffer cache에 읽어오고 , 그런 다음에 사용자 프로그램한테 전달.
- 전달받은 사용자 프로그램은 자신의 주소 영역이 있는 page에 buffer cache에 있는 내용을 copy 해서 사용한다.
-
- memory mappend i/o
- 이것도 처음에 시스템 콜을 한다.
- 자신의 주소공간 중에 일부를 file에다가 mapping을 한다.
- 이렇게 mapping을 해놓더라도 어처피 디스크에 있는 파일을 buffer cache에 읽어오는 것은 똑같음.
- 그 내용을 page cache에 copy를 한다.
- 그럼 그 내용이 파일의 mapped된 내용이 된다.
- 지금부터는 사용자 프로그램이 자신의 page cache에다가 데이터를 메모리에 읽고 쓰듯이 요청하게되면, 그것이 read/write가 된다.
차이점 정리
1. read/write 시스템 콜을 사용할 때
- 해당 내용이 buffer cache에 있든 없든 항상 운영체제한테 요청해서 받아와야 한다.
- memory-mapped I/O 사용할 때
- 일단 page cache에 올라온 내용은, 운영체제의 도움을 받지 않고, 자기 영역에 접근하는 방식.
장점: 이미 메모리에 올라와있는 내용에 대해서는 커널의 도움을 받지 않고, 자신이 직접 접근할 수 있다.
기존의 buffer cache 환경

- 파일 입출력을 할 때는 buffer cache를 통과해야 한다.
- buffer cache에 있는 내용을 자신의 page cache에다가 한번은 복사해야 하는 오버헤드가 있음.
최근의 unified buffer cache

- 필요에 따라 page cache에서 공간을 할당해서 사용한다. (따로 buffer cache x)
프로그램의 실행




-
장점: Memory-mapped I/O를 사용하면 파일의 내용이 가상 메모리에 올라온 후, 시스템 콜 없이 CPU가 직접 접근할 수 있다. 즉, 캐시에 적재된 데이터를 별도의 복사 과정 없이 애플리케이션의 주소 공간에서 바로 사용할 수 있어 성능 오버헤드를 줄일 수 있다.
-
단점: Memory-mapped I/O는 페이지 캐시(즉, 버퍼 캐시)를 가상 메모리에 매핑하는 방식이므로 데이터 일광성 문제에 주의해야 한다. 특히, 동일한 파일을 여러 프로세스가 공유하는 경우, 한 프로세스에서 변경한 내용이 다른 프로세스에서 즉시 반영되지 않을 수 있다.