File System
파일은 작성자가 정의한 연관된 정보의 모음이다. 파일은 운영체제에서 물리적 대용량 저장장치로 매핑된다. 파일 시스템은 파일이 물리적 장치에 매핑되는 방법과 사용자와 프로그램이 파일을 액세스하고 조작하는 방법을 설명한다.
물리적 저장장치에 대한 액세스 속도가 느릴 수 있으므로 효율적인 액세스를 목표로 파일 시스템을 설계해야 한다. 파일 공유 및 파일에 대한 원격 액세스 지원을 포함하여 다른 요구 사항도 중요할 수 있다.
우리가 사용하는 data들은 물리 장치에 저장되어 있다. 이 물리장치를 우리의 프로그램이 물리 주소를 활용하여 접근해야 한다면, 굉장히 불편하고 어려울 것이다.
OS의 file-system은 이 disk에 저장된 data를 물리 장치에 의한 접근이 아니라 file이라고 하는 논리 구조에 의해 접근할 수 있도록 만들어 준다.(OS가 컴퓨터 system을 편리하게 사용하기 위해 저장된 data에 대한 일관된 논리적 관점을 제공하고 저장장치의 물리적 특성을 추상화 하여 논리적 저장 단위인 file을 정의한다) 이 file이라고 하는 것은 물리 저장장치에 저장되어 있는 data에 대한 '논리 구성 단위'로 생각해도 된다.
실행 파일과 프로세스의 혼동
실행 file은 여러가지 형태로 존재한다. 실행 file 하나로 되어 있는 간단한 형태나 여러 실행 file이 유기적으로 연결되어 작동하는 형태가 있다. 이러한 file은 저장매체에 보관되므로 실행되기 전까지는 하나의 저장된 data 형태로 존재한다. 아래 접은글에서 설명하는데, 그래서 system으로부터 독립하게 된다는 것. 이러한 file들이 실행되어 memory에서 존재할 때 process라고 한다.
process 우선 순위
file은 저장매체에 존재하고 process는 memory에 존재한다. 어떤 실행 file이 여러 번 실행 되었다면 memory에는 여러 개의 같은 process가 존재하게 된다. 각 process는 CPU와 memory와 같은 system의 resource를 나누어 동작하는데 system resource는 한정되어있으므로 우선 순위를 갖는다. 이 우선 순위를 부여하는 것이 CPU scheduling이다.
File Concept
- file은 논리 주소 공간 안에 저장된 논리 단위이다.
- 보통 비휘발성의 보조기억장치에 저장된다.
- user 관점에서 볼 때 file은 논리적 보조저장장치의 가장 작은 할당 요소
- 즉 data가 file 안에 존재해야 보조저장장치에 기록될 수 있다.
- file은 user와 응용 program이 data를 저장하고 검색하는 데 사용하는 방법.
- UNIX, Linux 및 기타 OS는 system 정보(process 세부 사항)에 대한 액세스를 제공하기 위해 file system interface를 사용하는 proc file system을 제공한다.
Types
- Data
- numeric, character, binary...로 표현될 수 있다.
- Program
- user program을 통해 file에 접근하면 file system에 의해 해당 file이 disk에 있는 data로 매핑된다.
File Attribute
user의 편의를 위해 file에 이름을 부여하고 그 이름으로 file을 참조한다. file 이름은 example.c와 같이 하나의 문자열로 나타내는데, 일단 만들어지면 그 file을 생성한 process, user, system으로부터도 독립하게 된다.
- Name
- Identification: 각 file에 대한 unique한 identification이 존재. 이 identification은 우리가 읽을 수 없는 file의 이름
- Type
- Location: file이 저장된 disk의 location. file이 존재하는 장치와 그 장치 내의 위치에 대한 포인터
- Size
- Protection
Time stamp, date, user identification: 접근 수정, 생성 날짜, user 정보 등
File Operations
file 조작에 필요한 최소 연산으로 다음 7가지 기본 연산이 있다.
1. Create: file 생성은 file을 저장할 수 있는 file system 내에서의 공간을 찾아야 한다. 새로 생성된 file 항목을 directory에 만든다.
2. Open: file에 대한 생성과 삭제를 제외한 모든 연산을 하기 전에 반드시 file open() system call을 해야 한다. open() system call이 성공하면 열린 file handle을 return한다.
3. Write: Linux의 경우 open에 의해 file이 create된다. file을 읽기 위해서 file handle과 file에 기록될 정보를 명시하는 system call을 실행한다. System은 file 내의 다음 순차적 write가 일어날 위치를 가리키는 쓰기 포인터(write pointer)를 유지하고 있어야 한다. write pointer는 write가 일어날 때마다 갱신되어야 한다.
4. Read: file을 읽기 위해 file handle과 file이 읽혀야 할 block의 위치(memory에서)를 기술하는 system call을 사용한다. write와 마찬가지로 다음 번 read가 일어날 위치를 가리키는 read pointer를 유지한다.
5. Reposition within file(file 안에서의 위치 재설정) - seek: 현재 file에서의 위치(= file pointer)를 seek(탐색)에 의해 임의의 장소로 옮길 수 있다.
6. Delete: file을 삭제하기 위해 지정된 file을 directory에서 찾는다. 찾으면 모든 file 공간을 해제하고, directory의 항목을 지우거나 사용 가능으로 표시.
7. Turncate: file의 내용은 지우고 속성은 그대로 남기기를 원할 때 사용한다. 일반적으로 초기화 할 때 많이 쓰게 된다.
Open - file table(열린 파일 테이블), 열린 file에 대한 정보
대부분 file operation은 지명된 file과 관련된 directory를 찾는 작업을 한다. 반복적인 탐색을 피하고자 파일이 맨 처음 사용될 때 open() system call을 해야 한다.OS는 모든 열린 file에 대한 정보를 갖는 open-file table(열린 파일 테이블)을 유지한다. 그러고 나서 어떤 file operation(파일 연산)이 필요하게 되면 이 table에서의 인덱스로 그 file을 지정할 수 있게 되므로 더 이상 탐색은 필요로 하지 않게 된다.
일부 system은 file에 대한 첫 참조가 이루어질 때 file을 암묵적으로 연다. 이 file은 자신을 연 작업이나 program이 종료되면 자동으로 닫힌다.
그러나 대부분 OS는 file이 사용되기 전에 먼저 프로그래머가 open() system call을 명시적으로 호출해야 한다.
file이 더는 사용되지 않으면 process에 의해 닫히는데 OS에서 open-file table에 있는 항목을 제고하며 lock을 해제할 가능성이 있다. create()와 delete()는 열린 file보다 닫힌 file을 대상으로 동작하는 system call이다.
close(): 일반적으로 close를 할 때 memory의 내용을 disk로 옮기는 것이 아니다. write를 함과 동시에 disk로 옮기는 write through 방식이 있고 아니면 좀 더 main memory에 수정 내용을 모아서 일정 시간 간격(예를 들면 30초)에 한 번씩 disk에 쓰게 된다.(write-behind or write-back. disk에 write하는 것은 속도가 느리기 때문에 모아서 쓰면 시간을 단축 할 수 있다. 예를 들면 java에서 StringBuffer에 문자열을 모아서 한 번에 print하는 느낌?)
1. File pointer
각 file에서 read나 write를 할 때 read나 write할 위치를 알려주는 data structure.
맨 처음 open할 때 file pointer의 값은 0이다. read를 하게 되면 그 만큼 file pointer가 움직이게 된다. (write도 마찬가지)
2. File-open count
open할 때마다 count의 값이 증가하게 된다. file을 close할 때마다 이 count를 줄이게 된다. 더 이상 file을 open한 user가 없으면 (process가 없으면) 어떤 file들이 open 되었느냐 나타내주는 open-file table에서 그 완전히 close된 file들을 remove하게 된다. file-open count를 통해 close 할 때마다 remove해도 되는 지 안 해도 되는 지 확인이 가능해진다.
3. File location
대부분 file 연산들은 system에 file 내의 data를 읽거나 쓰도록 요구한다. 파일의 위치(대용량 저장장치, 네트워크를 통한 파일 서버, 혹은 RAM 드라이브 등)를 찾기 위한 정보는 operation 마다 directory 구조에서 읽는 것을 피하고자 memory에 저장된다.
4. Access right
file에 대한 access mode 정보
'운영체제' 카테고리의 다른 글
| RPC_Remote Procedure Calls (0) | 2022.08.12 |
|---|---|
| (IPC) Interprocess Communication이 필요한 이유 (0) | 2022.08.05 |
| CPU Scheduling이 필요한 경우와 고려해야할 것들 (0) | 2022.07.29 |
| Process Scheduling (0) | 2022.07.29 |