sw사관학교정글/OS 개념정리

[week13] KOCW 운영체제(반효경교수님) - File System Implementation 2

D cron 2022. 1. 30. 01:15

File systems implementation 2

Page cache and buffer cache

운영체제가 file입출력을 할 때 사용자 프로그램의 요청을 받아서 disk에서 읽어온 내용을 그냥 전달하는 게 아니라 자신의 buffer cache 영역에 읽어놓고, 그 내용을 copy로 넘겨주기 때문에 다음번에 동일한 file data에 대한 read, write system call이 오면, disk까지 가지않고 buffer cache에서 처리한다.

예전에는 sector단위는 512byte였다. 최근에는 buffer cache가 page cache와 통합이 되면서 buffer cache에서 사용하는 단위도 4KB를 사용한다(unified buffer cache).

unified buffer cache를 이용하지 않는 File I/O

read, write system call을 쓸 때는 그 내용이 buffer cache에 있든 없든 항상 운영체제에게 요청해서 받아와야 한다. mmap을 쓰게 되면 page cache에 올라온 내용은 운영체제의 도움을 받지 않고 사용자 프로세스가 직접 메모리접근을 통해 I/O를 한다(인터페이스의 차이)

mmap을 사용하는 이유:

mmap을 사용하면 이미 메모리에 올라온 내용에 대해서는 kernel의 도움을 받지 않고 (운영체제를 호출하지 않고) 자신이 직접 자신의 메모리에 접근하듯이 읽고 쓸 수 있다.

unified buffer cache를 이용한 File I/O#### unified buffer cache를 이용한 File I/O

unified buffer cache를 사용하면 기존처럼 buffer cache를 따로 두지 않고, 필요에 따라 page cache에서 공간을 할당해서 쓰는 방식을 사용한다.

read, write system call을 하는 경우 해당 내용이 buffer cache에 올라와 있든 아니든 상관없이 운영체제에게 CPU 제어권이 넘어간다. CPU는 이미 올라와 있는 data는 사용자 프로그램에 copy해주고 메모리에 없다면 disk에서 읽어와서 사용자프로그램에 copy해서 전달한다.

mmap인 경우, 자신의 주소영역중에 일부를 file에 mapping하는 단계를 거치고 나면 사용자 프로그램의 주소영역에 page cache가 mapping된다. 이전처럼 buffer cache의 내용을 copy하는 것이 아니라 그냥 page cache 자체가 사용자 프로세스의 논리적 주소영역에 mapping되어 사용된다(page cache에 직접 읽고 쓴다).

프로그램의 실행

code 부분은 memory에 올라간 다음 쫓겨날 때, swap area로 내려가지 않는다. code부분은 read-only이기 때문에 swap area에 써줄 필요가 없다.

실행파일을 실행시킬 때 loader라는 software가 이 프로그램을 메모리에 올릴때 memory-mapped file을 쓰는 대표적인 방식이 실행파일의 code부분을 쓸 때이다. code 부분은 별도의 swap area 를 가지고 있지 않고 file system의 file을 가진 상태로mapping된 상태이다.

mmap 을 사용하면 datafile 일부를 내 주소공간에 mapping해달라고 system call을 하는 것이다. 그렇게 되면 아래와 같이 된다

memory에 내용이 없다면 page fault가 나고, 물리적인 메모리와 virtual memory가 mapping된다. 이제부터는 OS의 도움을 받지 않고 자신의 주소공간의 일부처럼 사용할 수 있다. 만약 이 내용이 메모리에서 쫓겨날 때는 swap area에 쓰는게 아니라 file에다가 수정된 내용을 써주고 쫓아내야 한다.

mmap 말고 read system call을 사용하는 경우도 있다. 그러면 physical memory의 내용을 copy해서 사용자 process에게 전달해 준다.

사용자 프로그램이 file을 접근하는 방식은 인터페이스가 2가지 존재한다. read, write system call(copy) / memory mapped(copy가 아니라 mapping해서 그대로 사용함 - overhead 줄어듬, 그리고 한번 메모리에 올라오면 kernel 도움없이 사용가능) 방법.

mmap의 주의할 점: 다른 친구도 mmap을 써서 share한다면 consistency가 깨질 수 있다. read, write system call에서는 copy로 전달하기 때문에 그런 문제는 발생하지 않는다.