운영체제 기본/파일과 입출력: 두 판 사이의 차이

확장한 mmap 각론의 해당 장으로 링크 정리
잔글 Linux 각론 경로 변경에 따른 본문·목차·틀 링크 갱신
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
2번째 줄: 2번째 줄:
|이전=← 이전 문서<br />[[운영체제 기본/가상 메모리|가상 메모리]]
|이전=← 이전 문서<br />[[운영체제 기본/가상 메모리|가상 메모리]]
|목차=[[운영체제 기본#총론|총론 목차]]
|목차=[[운영체제 기본#총론|총론 목차]]
|다음=다음 문서 →<br />[[운영체제 기본/프로세스 간 통신|프로세스 간 통신]]
}}
}}


8번째 줄: 9번째 줄:
== 파일 데이터와 메타데이터 ==
== 파일 데이터와 메타데이터 ==
프로그램이 저장장치의 어느 구역에 데이터가 있는지 직접 관리한다면, 파일이 커지거나 다른 프로그램이 공간을 사용했을 때 배치를 함께 조정해야 한다. 파일 시스템은 저장 공간의 할당과 회수를 맡고, 프로그램에는 이름으로 찾을 수 있는 파일을 제공한다. 일반 파일의 '''데이터'''는 본문의 바이트이고, '''메타데이터'''는 크기, 종류, 소유자와 접근 권한, 접근·수정 시각처럼 파일을 관리하는 정보다. 내용을 저장장치의 어디에서 찾을지 나타내는 블록 매핑도 메타데이터에 속한다. Unix 계열에서는 inode가 이러한 파일별 정보를 담거나 관련 구조를 가리킨다. 이름과 달리 inode 번호는 해당 파일시스템 안에서 파일을 식별한다.<ref name="fs-inode">[https://man7.org/linux/man-pages/man7/inode.7.html Linux man-pages: inode(7)].</ref><ref name="fs-block-map">[https://docs.kernel.org/filesystems/ext4/ifork.html Linux kernel documentation: The Contents of inode.i_block], Extent Tree.</ref>
프로그램이 저장장치의 어느 구역에 데이터가 있는지 직접 관리한다면, 파일이 커지거나 다른 프로그램이 공간을 사용했을 때 배치를 함께 조정해야 한다. 파일 시스템은 저장 공간의 할당과 회수를 맡고, 프로그램에는 이름으로 찾을 수 있는 파일을 제공한다. 일반 파일의 '''데이터'''는 본문의 바이트이고, '''메타데이터'''는 크기, 종류, 소유자와 접근 권한, 접근·수정 시각처럼 파일을 관리하는 정보다. 내용을 저장장치의 어디에서 찾을지 나타내는 블록 매핑도 메타데이터에 속한다. Unix 계열에서는 inode가 이러한 파일별 정보를 담거나 관련 구조를 가리킨다. 이름과 달리 inode 번호는 해당 파일시스템 안에서 파일을 식별한다.<ref name="fs-inode">[https://man7.org/linux/man-pages/man7/inode.7.html Linux man-pages: inode(7)].</ref><ref name="fs-block-map">[https://docs.kernel.org/filesystems/ext4/ifork.html Linux kernel documentation: The Contents of inode.i_block], Extent Tree.</ref>
파일의 소유자와 접근 권한은 운영체제가 파일 접근 요청을 판단하기 위해 관리하는 정보다. 파일을 열거나 경로를 탐색할 때 커널의 파일시스템 코드가 요청한 연산과 이 정보를 확인한다. CPU가 파일 이름이나 소유자를 이해하고 검사하는 것이 아니다. CPU의 메모리 보호는 이 판단을 수행하는 커널 코드와 관리 정보를 사용자 프로그램이 직접 훼손하지 못하도록 뒷받침한다.<ref name="fs-inode" />


일반 파일을 바이트의 나열로 제공하면 프로그램은 저장장치의 세부 구조에 맞춰 매번 코드를 바꾸지 않아도 된다. Unix는 파일뿐 아니라 파이프와 터미널에도 읽기와 쓰기라는 공통 인터페이스를 제공한다. 덕분에 출력 대상을 바꾸어 프로그램을 조합하기 쉽다. 다만 인터페이스가 비슷해도 모든 대상의 성질이 같지는 않다. 일반 파일은 위치를 바꾸어 읽을 수 있지만 파이프는 그렇게 할 수 없으며, 바이트 스트림의 데이터에 붙일 레코드 구조는 프로그램이 정해야 한다. <ref name="source-1">[https://man7.org/linux/man-pages/man2/read.2.html Linux man-pages: read(2)].</ref>
일반 파일을 바이트의 나열로 제공하면 프로그램은 저장장치의 세부 구조에 맞춰 매번 코드를 바꾸지 않아도 된다. Unix는 파일뿐 아니라 파이프와 터미널에도 읽기와 쓰기라는 공통 인터페이스를 제공한다. 덕분에 출력 대상을 바꾸어 프로그램을 조합하기 쉽다. 다만 인터페이스가 비슷해도 모든 대상의 성질이 같지는 않다. 일반 파일은 위치를 바꾸어 읽을 수 있지만 파이프는 그렇게 할 수 없으며, 바이트 스트림의 데이터에 붙일 레코드 구조는 프로그램이 정해야 한다. <ref name="source-1">[https://man7.org/linux/man-pages/man2/read.2.html Linux man-pages: read(2)].</ref>
51번째 줄: 54번째 줄:


== 관련 각론 ==
== 관련 각론 ==
* [[운영체제 기본/Linux의 파일시스템|Linux의 파일시스템]]: 파일시스템 구현 문서의 목차.
* [[운영체제 기본/Linux/파일시스템|Linux의 파일시스템]]: 파일시스템 구현 문서의 목차.
* [[운영체제 기본/Linux의 파일시스템/VFS와 파일 객체|VFS와 파일 객체]]: 디렉터리 탐색, inode, 열린 파일 상태를 Linux 객체와 연산으로 연결.
* [[운영체제 기본/Linux/파일시스템/VFS와 파일 객체|VFS와 파일 객체]]: 디렉터리 탐색, inode, 열린 파일 상태를 Linux 객체와 연산으로 연결.
* [[운영체제 기본/Linux의 파일시스템/ext4의 파일 읽기|ext4의 파일 읽기]]: extent 매핑과 장치 읽기로 파일의 데이터를 공급하는 과정.
* [[운영체제 기본/Linux/파일시스템/ext4의 파일 읽기|ext4의 파일 읽기]]: extent 매핑과 장치 읽기로 파일의 데이터를 공급하는 과정.
* [[운영체제 기본/Linux의 파일시스템/페이지 캐시|페이지 캐시]]: 파일 내용의 재사용과 데이터 준비 상태 관리.
* [[운영체제 기본/Linux/파일시스템/페이지 캐시|페이지 캐시]]: 파일 내용의 재사용과 데이터 준비 상태 관리.
* [[운영체제 기본/Linux의 메모리 매핑/파일 매핑과 COW|mmap을 통한 파일 읽기]]: 주소 영역 등록, 첫 메모리 접근, 파일 폴트와 PTE 설치.
* [[운영체제 기본/Linux/메모리 매핑/파일 매핑과 COW|mmap을 통한 파일 읽기]]: 주소 영역 등록, 첫 메모리 접근, 파일 폴트와 PTE 설치.
* [[운영체제 기본/Linux의 파일 읽기]]: 파일 읽기 인터페이스가 Linux 내부 구현으로 이어지는 과정.
* [[운영체제 기본/Linux/파일 시스템 콜|Linux의 파일 시스템 콜]]: 파일 열기·읽기·쓰기와 파일 위치·수명 관리가 Linux 내부 구현으로 이어지는 과정.
== 참고 문헌 ==
== 참고 문헌 ==
<references />
<references />
63번째 줄: 66번째 줄:
|이전=← 이전 문서<br />[[운영체제 기본/가상 메모리|가상 메모리]]
|이전=← 이전 문서<br />[[운영체제 기본/가상 메모리|가상 메모리]]
|목차=[[운영체제 기본#총론|총론 목차]]
|목차=[[운영체제 기본#총론|총론 목차]]
|다음=다음 문서 →<br />[[운영체제 기본/프로세스 간 통신|프로세스 간 통신]]
}}
}}


{{운영체제 기본 둘러보기}}
{{운영체제 기본 둘러보기}}