운영체제 기본/Linux/메모리 매핑/파일 매핑과 COW: 두 판 사이의 차이

잔글 관리자님이 운영체제 기본/Linux의 메모리 매핑/파일 매핑과 COW 문서를 운영체제 기본/Linux/메모리 매핑/파일 매핑과 COW 문서로 이동했습니다: Linux 각론 제목을 계층형 경로로 통일
Linux 계층형 경로에 맞춰 문서 링크 갱신
 
1번째 줄: 1번째 줄:
{{이전 다음 문서
{{이전 다음 문서
|이전=← 이전 문서<br>[[운영체제 기본/Linux의 메모리 매핑/익명 메모리 매핑|익명 메모리 매핑]]
|이전=← 이전 문서<br>[[운영체제 기본/Linux/메모리 매핑/익명 메모리 매핑|익명 메모리 매핑]]
|목차=[[운영체제 기본/Linux의 메모리 매핑|메모리 매핑 목차]]
|목차=[[운영체제 기본/Linux/메모리 매핑|메모리 매핑 목차]]
|다음=다음 문서 →<br>[[운영체제 기본/Linux의 메모리 매핑/MMIO 장치 매핑|MMIO 장치 매핑]]
|다음=다음 문서 →<br>[[운영체제 기본/Linux/메모리 매핑/MMIO 장치 매핑|MMIO 장치 매핑]]
}}
}}


39번째 줄: 39번째 줄:


== 읽기 폴트와 페이지 캐시 ==
== 읽기 폴트와 페이지 캐시 ==
PTE가 없는 주소를 읽으면 [[운영체제 기본/Linux의 메모리 매핑/페이지 폴트 처리|공통 페이지 폴트 경로]]를 지나 다음 분기로 들어간다.
PTE가 없는 주소를 읽으면 [[운영체제 기본/Linux/메모리 매핑/페이지 폴트 처리|공통 페이지 폴트 경로]]를 지나 다음 분기로 들어간다.


<pre>
<pre>
48번째 줄: 48번째 줄:
</pre>
</pre>


<code>filemap_fault()</code>는 해당 파일 오프셋의 페이지를 [[운영체제 기본/Linux의 파일시스템/페이지 캐시|페이지 캐시]]에서 찾고, 필요하면 파일시스템을 통해 데이터를 읽는다. 입출력을 기다리는 동안 태스크가 잠들거나, 잠금을 놓았다가 처리를 재시도할 수 있다. 페이지가 준비되면 <code>finish_fault()</code>가 PTE를 연결하고, 사용자 모드의 load가 다시 실행된다.<ref name="filemap">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/filemap.c?h=v6.12 Linux v6.12, mm/filemap.c], filemap_fault와 filemap_map_pages.</ref><ref name="memory">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/memory.c?h=v6.12 Linux v6.12, mm/memory.c], do_read_fault, do_cow_fault, do_shared_fault, do_wp_page, finish_fault.</ref>
<code>filemap_fault()</code>는 해당 파일 오프셋의 페이지를 [[운영체제 기본/Linux/파일시스템/페이지 캐시|페이지 캐시]]에서 찾고, 필요하면 파일시스템을 통해 데이터를 읽는다. 입출력을 기다리는 동안 태스크가 잠들거나, 잠금을 놓았다가 처리를 재시도할 수 있다. 페이지가 준비되면 <code>finish_fault()</code>가 PTE를 연결하고, 사용자 모드의 load가 다시 실행된다.<ref name="filemap">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/filemap.c?h=v6.12 Linux v6.12, mm/filemap.c], filemap_fault와 filemap_map_pages.</ref><ref name="memory">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/memory.c?h=v6.12 Linux v6.12, mm/memory.c], do_read_fault, do_cow_fault, do_shared_fault, do_wp_page, finish_fault.</ref>


페이지가 이미 준비되어 있다면 <code>do_fault_around()</code>와 <code>filemap_map_pages()</code>가 주변 페이지까지 연결할 수 있다. 그 경로에서 해결되면 <code>filemap_fault()</code>를 호출하지 않는다. 첫 접근이 항상 저장장치 읽기를 일으키는 것도, 매 페이지마다 반드시 폴트가 하나씩 발생하는 것도 아니다.<ref name="filemap"/><ref name="memory"/>
페이지가 이미 준비되어 있다면 <code>do_fault_around()</code>와 <code>filemap_map_pages()</code>가 주변 페이지까지 연결할 수 있다. 그 경로에서 해결되면 <code>filemap_fault()</code>를 호출하지 않는다. 첫 접근이 항상 저장장치 읽기를 일으키는 것도, 매 페이지마다 반드시 폴트가 하나씩 발생하는 것도 아니다.<ref name="filemap"/><ref name="memory"/>
81번째 줄: 81번째 줄:
|}
|}


이미 private 익명 사본을 갖고 있고 그 PTE가 쓰기 가능하면, 이후 쓰기는 폴트 없이 진행한다. 그 사본도 <code>fork()</code> 뒤에는 [[운영체제 기본/Linux의 메모리 매핑/익명 메모리 매핑#fork와 쓰기 시 복사|익명 페이지의 COW]] 대상이 될 수 있다.<ref name="memory"/>
이미 private 익명 사본을 갖고 있고 그 PTE가 쓰기 가능하면, 이후 쓰기는 폴트 없이 진행한다. 그 사본도 <code>fork()</code> 뒤에는 [[운영체제 기본/Linux/메모리 매핑/익명 메모리 매핑#fork와 쓰기 시 복사|익명 페이지의 COW]] 대상이 될 수 있다.<ref name="memory"/>


<code>MAP_PRIVATE</code>는 파일의 일관된 스냅샷을 보장하는 기능은 아니다. 매핑 뒤 다른 경로에서 파일이 변경되었을 때 아직 private 사본으로 갈라지지 않은 부분에서 무엇이 보일지에 의존해서는 안 된다. 여기의 핵심 보장은 '''이 매핑을 통한 private 쓰기가 원래 파일에 반영되지 않는다는 것'''이다.<ref name="man-mmap">[https://man7.org/linux/man-pages/man2/mmap.2.html Linux man-pages, mmap(2)], MAP_PRIVATE와 MAP_SHARED.</ref>
<code>MAP_PRIVATE</code>는 파일의 일관된 스냅샷을 보장하는 기능은 아니다. 매핑 뒤 다른 경로에서 파일이 변경되었을 때 아직 private 사본으로 갈라지지 않은 부분에서 무엇이 보일지에 의존해서는 안 된다. 여기의 핵심 보장은 '''이 매핑을 통한 private 쓰기가 원래 파일에 반영되지 않는다는 것'''이다.<ref name="man-mmap">[https://man7.org/linux/man-pages/man2/mmap.2.html Linux man-pages, mmap(2)], MAP_PRIVATE와 MAP_SHARED.</ref>
101번째 줄: 101번째 줄:


{{이전 다음 문서
{{이전 다음 문서
|이전=← 이전 문서<br>[[운영체제 기본/Linux의 메모리 매핑/익명 메모리 매핑|익명 메모리 매핑]]
|이전=← 이전 문서<br>[[운영체제 기본/Linux/메모리 매핑/익명 메모리 매핑|익명 메모리 매핑]]
|목차=[[운영체제 기본/Linux의 메모리 매핑|메모리 매핑 목차]]
|목차=[[운영체제 기본/Linux/메모리 매핑|메모리 매핑 목차]]
|다음=다음 문서 →<br>[[운영체제 기본/Linux의 메모리 매핑/MMIO 장치 매핑|MMIO 장치 매핑]]
|다음=다음 문서 →<br>[[운영체제 기본/Linux/메모리 매핑/MMIO 장치 매핑|MMIO 장치 매핑]]
}}
}}
{{운영체제 기본 둘러보기}}
{{운영체제 기본 둘러보기}}