티스토리 뷰
● 도입
- 파일 시스템은 메모리와 비슷하다.
- 페이징(고정 분할 방식)과 같이 전체 디스크 공간을 일정한 크기로 나누고 그 공간에 주소를 할당해 관리한다.
- 일정한 크기로 나눈 공간을 메모리에서는 페이지라고 부르고 파일 시스템에서는 블록이라고 한다.(한 블록의 크기는 1~8kb)
- 파일 시스템은 파일 정보를 파일 테이블로 관리하는데 여기에는 파일이 시작하는 블록의 위치 정보도 담겨있다.
- 하나의 파일은 여러 개의 블록으로 이루어져 있는데 이 블록들을 어떻게 연결하느냐에 따라 연속 할당과 불연속 할당으로 나눌 수 있다.
● 연속 할당과 불연속 할당
1. 연속 할당
- 파일을 구성하는 블록들을 디스크에 연속적으로 저장하는 방식
- 파일의 시작 블록만 알면 파일의 전체를 찾을 수 있다.
- 메모리의 세그멘테이션 기법처럼 외부 단편화가 발생하기 때문에 실제로는 사용되지 않는 방식이다.
2. 불연속 할당
- 디스크의 비어있는 공간에 파일을 구성하는 블록들을 분산해 저장하는 방식
- 분산된 블록들은 파일 시스템이 관리한다.
- 불연속 방식에는 연결 할당과 인덱스 할당이 있다.
● 연결 할당과 인덱스 할당
1. 연결 할당
- 자료 구조 중 연결리스트 방식을 이용하는 것이다.(파일에 속한 데이터를 연결리스트로 관리)
- 연결리스트는 각 노드가 데이터와 포인터를 가지고 있는데 데이터는 해당 노드가 저장하고 있는 데이터이고 포인터는 이전 노드와 다음 노드의 주소를 가리킨다.
- 하나의 노드의 포인터를 이용해 모든 노드를 순환할 수 있다.(null을 만날 때까지 데이터를 순환해 모든 데이터를 얻는다.)
- 즉, 파일 테이블에는 시작 블록에 대한 정보만 저장하고 나머지는 연결리스트를 이용해 다른 블록에 접근하는 방식이다.
2. 인덱스 할당
- 파일 테이블의 블록 포인터가 데이터 블록을 직접 연결하는게 아니리 데이터들의 인덱스를 가지고 있는 인덱스 블록을 연결한다.
- 접근하려는 파일의 데이터가 0, 3, 4번이라고 해보자
- 그렇다면 해당 파일을 구성하는 0, 3, 4번을 저장한 인덱스 블록이 있고 해당 인덱스 블록을 파일 테이블의 블록 포인터가 기리키게 된다.
- 인덱스 블록의 0, 3, 4번을 참조하면 모든 데이터를 찾을 수 있다.
- 인덱스 할당은 데이터가 많아서 테이블이 꽉 찬 경우 인덱스 블록을 더 만들어 연결하기 때문에 테이블을 확장할 수 있다.
- 파일의 크기가 작다면 데이터를 바로 참조하는 블록 포인터를 이용하고 파일의 크기가 크다면 간접 포인터를 이용해 많은 데이터에 접근할 수 있다.
- 만약 더 큰 데이터가 필요하면 이중 간접 포인터, 삼중 간접 포인터를 이용할 수 있다.
● 디스크
- 도입 부분에서 파일 시스템은 전체 디스크 공간을 일정한 크기로 나누고 그 공간에 주소를 할당해 관리한다고 했다.
- 이때 일정한 크기로 나눈 공간을 블록이라고 한다.(한 블록의 크기는 1~8kb)
- 디스크를 1kb로 나누면 낭비되는 공간을 줄일 수 있지만 그 만큼 관리해야 하는 블록의 수가 많아진다.
- 8kb로 나누면 관리해야 하는 블록의 수는 적지만 내부단편화로 인해 낭비되는 공간이 많아진다.
- 디스크에 파일을 저장할 때마다 빈 공간을 찾기 위해 모든 공간을 뒤지는 방식은 비효율적이다.
- 이에 파일 시스템은 효율적인 관리를 위해 빈 공간을 모아둔 free block list를 가지고 있다.
- 만약 특정 파일을 삭제한다면 파일 시스템은 해당 파일의 모든 정보를 지우는 것이 아니라 파일 테이블에서 해당 파일의 헤더를 삭제하고 이를 free block list에 추가한다.
ex) apple.txt 파일을 삭제하면 파일 테이블에서 apple.txt의 헤더를 지워주고 apple.txt가 사용했던 블록 4, 11, 14번을 free block list에 추가한다.
- 이렇게 처리하면 사용자는 마치 파일이 삭제된 것처럼 보이지만 사용했던 블록의 데이터는 아직 그대로 남아있기에 포렌식을 통해 데이터를 복구할 수 있다.
'CS > 운영체제' 카테고리의 다른 글
#38 페이지드 세그멘테이션(배치정책) (0) | 2023.07.12 |
---|---|
#37 페이징(배치정책) (0) | 2023.07.11 |
#35 가상메모리 - 세그멘테이션(배치정책) (0) | 2023.07.09 |
#34 메모리 - 메모리 할당방식 (0) | 2023.07.08 |
#33 가상메모리 (0) | 2023.07.06 |
- Total
- Today
- Yesterday
- MySQL
- OS
- API
- Phaser
- Java8
- java
- 운영체제
- SpringBoot
- 코딩테스트
- nosql
- 빅데이터
- 프로그래머스
- db
- 자료구조
- Spring Boot
- node.js
- 프로세스
- 알고리즘
- 빅데이터 분석기사
- spring
- jpa
- 코테
- DART
- MongoDB
- git
- Stream
- Phaser3
- 메모리
- SQL
- Advanced Stream
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |