[OS] File System : File Concept, File Operation

parkheeddong·2023년 6월 3일
0

Operating System

목록 보기
56/63
post-thumbnail

1. File System ( = volume, partition)

하드디스크에 파일들이 저장되어 있는 영역이다.
파일 시스템은 3가지 뷰를 가지고 있다.

🌳 사용자 관점

사용자 입장에서 파일 시스템은 Hierarchical Directory 구조이다.

🌳 커널 관점

커널 관점에서 파일시스템은 블록의 sequence이다.

🌳 디바이스 관점

하드디스크에서는 cylinder, surface, sector number로 구분
SSD에서는 Block, page number로 구분

-> 사용자가 hierarchical 방식으로 파일을 읽어올 것을 요청하면, 운영체제는 커널 관점으로 block number로 변환한다. 그것을 디바이스에 전달하면, 디바이스 컨트롤러는 디바이스 관점으로 변환하여 실제 storage device가 구동된다.

2. File Concept

1) 파일의 정의

Named collection of related information that is recorded on secondary storage

관련된 정보의 "Named" collection이다.
즉, 데이터를 모아서 이름을 붙여준 것 !

2) 파일의 타입

(1) 프로그램 파일과 데이터 파일

(2) 텍스트 파일과 binary 파일

텍스트 파일은 byte단위로 나누었을때 각 byte가 아스키 코드인 것이다.
binary 파일은 byte단위로 나누어도 각 byte가 출력가능한 아스키 코드가 아니다.

3) 메타 데이터(=File Attributes)

파일 a가 10kb라면, 그 파일은 3개의 4kb 블록(파일 데이터) x0, x1, x2로 나뉘어 할당되어 있을 것이다. 그리고 그 블록들은 하드디스크에 흩어져서 저장되어 있을 것이다.

따라서 이후 사용자가 해당 파일을 접근할 때, 블록 x0, x1, x2를 순서대로 찾아야 한다. 더불어 사용자 어플리케이션이 접근권한이 있는지도 검사해야 한다.

이러한 작업을 위해서는 '파일 데이터'만 저장하면 되는 것이 아니라, 파일의 메타 데이터도 저장해야 한다.

✅ 메타 데이터의 종류

파일의 이름
파일의 Identifier(번호)
파일의 종류
파일의 크기
파일의 접근권한
파일의 소유자
파일관련 날짜 정보(최근 접근시간, 최근 변경시간, 생성 시간)
파일데이터의 위치 정보(파일데이터가 3개 블록이라면, 그 블록들이 어디에 있는지)

➡ 메타 데이터 정보 역시 파일 시스템에 저장해야 한다. 이를 'FCB'라고 한다. (File Control Block)

유닉스, 리눅스에서는 FCB를 'Inode'라고 한다.

/d/x 파일이 x0, x1, x2 블록으로 구성되어 있다면 하드디스크에는 오른쪽과 같이 흩어져 있다. 따라서 그 블록이 몇 번째 블록인지 x0, x1, x2의 logical disk 상의 번호 정보를 메타데이터의 위치정보로 저장해야 한다.
즉, /d/x에 접근하려면 해당 파일의 메타데이터에 접근해서 위치정보를 알아야 한다

3. File Operation

Create : 파일의 생성
Open, Close : 파일을 열고 닫기
Read, Write : 파일을 읽고 쓰기
Seek : 파일을 찾기
Delete : 파일을 삭제
Truncate : 파일은 그대로 두고, 파일 내 들어있는 데이터만 버리기 (메타데이터는 그대로 존재)

위 operation은 반드시 운영체제의 system call로 이뤄진다❗❗
(읽기는 'read system call', 생성은 'create system call' 등등)

🔔 Open

파일의 읽기와 쓰기를 하려면 open을 먼저 해야 한다.

어떤 파일이 실제로 active하게 사용되기 전에, open이 먼저 되어야 한다.

open함수의 리턴값으로 file descriptor가 리턴된다.

open("/a/x", rw")
파일의 이름을 받고, 디렉토리를 서치하면서 접근 권한을 검사한다.
해당 파일까지 접근이 다 되면, 그 파일의 'directory entry'(=meta data=fcb)를 읽어 들인다.
그리고 close되기 전까지 메모리에 해당 데이터를 상주시킨다.
메타 데이터의 위치 정보(file descriptor)을 리턴한다.

즉, open의 가장 중요한 역할은 그 파일의 메타 데이터를 읽어들이는 것이다.

read, write를 위해서는 해당 파일의 위치 정보를 알아야 하기 때문이다.
따라서 open된 파일은 앞으로 계속 read, write 작업을 해야 하므로 해당 메타 데이터를 읽어들여서 메모리에 상주시킨다. 따라서 이후 필요할 경우 메타데이터를 읽기 위해 storage까지 가지 않고도 메모리에서 빨리 읽어들일 수 있도록 한다.

🔔 open-file table

컴퓨터 시스템에 현재 여러 프로세스에 의해서 오픈되어 있는 파일이 많을 때, 모든 파일에 대한 inode 정보를 가진 테이블이다.

해당 테이블에 여러 entry들이 있는데, 각 entry마다 프로세스 1, 프로세스 2, 프로세스 3.. 여러 프로세스들이 차곡차곡 entry에 들어오게 된다. 그리고 메타데이터에 대해서 읽고 쓰기가 가능하게 만들어 준다.

보통 2-level open-file table이다.

(1) Per-process table : 프로세스마다 그 프로세스가 오픈한 파일 정보를 담는 테이블
(2) System-wide Table: global table로서, 그 시스템에 오픈된 모든 파일들에 대한 정보를 가진 테이블

🔔 Example : 유닉스 커널의 경우 open

fd1 = open(“/etc/passwd”, O_RDONLY);
fd2 = open(“local”, O_WRONLY);
fd3 = open(“/etc/passwd”, O_RDWR);

process p1이 파일들을 세 번 오픈한다.

/etc/passwd 파일의 inode, local의 inode 등(메타 데이터)가 inode table이 들어오게 된다.

file table은 global table이다.(전체 시스템에 하나뿐인 테이블)

user file descriptor table은 프로세스마다 있는 테이블이다. 프로세스 p1이 오픈한 파일들이 들어 있다.

즉, 각 프로세스별 user descriptor table에는 pointer로 file table의 해당 파일을 가리키고, file table의 각 파일은 inode table에 포인터를 가리킨다.

각 프로세스별 user descriptor table에 0, 1, 2번 standard input, standard output, stadnard error로 고정해서 쓰고 있기 때문에 새로 파일을 오픈하면 3번부터 배정이 된다. 링크를 따라가면 file table의 해당 파일을, 그리고 그 파일 테이블에서 링크를 다라가면 inode table에 메타 데이터가 있다.
/etc/passwd는 두번 오픈 되었다는 (두군데서 나를 포인트하고 있다는) 정보 count 2가 저장된다.

즉 open table은 각 운영체제마다 다르지만 유닉스의 경우, user descriptor table과 file table을 통해 링크로 inode table에서 메타 데이터를 읽어들일 수 있게 된다 ❗❗

4. File Type

유닉스에서는 파일 타입을 5가지로 구분한다.

1) Ordinary File (Regular file)

하드디스크의 디스크 블록을 할당 받아서 정보를 저장하는 파일.

2) Directory File

디렉토리 자체. 즉 디렉토리 구조를 가진 파일.

3) Device File

보조기억장치, 입출력장치. 이들을 유닉스 파일로 취급

5) Named Pipe -> pass

Magig Number란 실행 파일의 종류를 구분하기 위해 사용하는 번호이다.
실행 파일인 경우 inode, 즉 메타데이터 안에 저장된다.

5. 파일의 구조

파일이 어떠한 구조를 가져야 하는가

(1) 일반 사용자 파일의 경우는 구조를 제한하지 않는다.

(2) 리눅스, 유닉스 등 운영체제에서는 '실행파일'은 구조를 제한한다.

컴파일, 링킹이 끝난 이후 실행파일은 특정 구조에 맞추어져야 한다. 프로그램의 실행파일의 여러 정보들에 대해 운영체제가 빠르게 로드하고, 런 하기 위해서이다.

(3) 디렉토리 파일 역시 구조가 제한된다. 일반 사용자가 그 구조를 변경하거나 할 수 없다.

🔔 실행파일의 구조의 대표적 예 : ELF (Executable And Linking Format)

ELF는 실행파일의 표준 포맷이다.

실제 실행파일이나 object 파일, shared 라이브러리, core dump 등에 대해서 커널이 그 구조를 가지고 있다.

어떤 cpu 아키텍쳐에서도 사용될 수 있도록 flexible하게 만들어졌다. 따라서 많은 OS들이 ELF 구조를 사용하고 있다.

(1) ELF Header

magig number
초기 레지스터 값

(2) Segment Header

런타임에 사용되는 segment들을 보여준다.

(3) Section Header

섹션의 크기 정보, 위치 정보, 타입 등을 가지고 있다.

0개의 댓글