Skip to content

Commit 9de333d

Browse files
committed
✅ Finish FileSystem
1 parent 691ab5d commit 9de333d

2 files changed

Lines changed: 131 additions & 20 deletions

File tree

05/yongki/FileSystem.md

Lines changed: 131 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
- [Block](#block)
55
- [Inode struct](#inode-struct)
66
- [Directory](#directory)
7-
- [File descriptor & Inode](#file-descriptor--inode)
7+
- [File descriptor](#file-descriptor)
88
- [Reading a file from Disk](#reading-a-file-from-disk)
99
- [Creating & Writing a File from Disk](#creating--writing-a-file-from-disk)
1010
- [참고문헌](#참고문헌)
@@ -23,12 +23,8 @@
2323
파일 시스템은 이 섹터를 여러 개 모아서 block이라는 단위를 사용한다.
2424
</p>
2525
<p>
26-
OS는 disk를 일정한 크기의 block으로 나누어 저장한다. 대개 block의 크기는 4KB이다.
27-
</p>
28-
<p>
29-
블록에는 Inode와 데이터 블록으로 이루어져 있다.
30-
Inode에는 파일 이름과 데이터가 들어 있는 하위 블록에 대한 인덱스가 있다.
31-
</p>
26+
OS는 disk를 일정한 크기의 block으로 나누어 저장한다.
27+
</p>
3228
</td>
3329
</tr>
3430
</table>
@@ -41,8 +37,16 @@
4137
<br/>
4238

4339
- `Allocation structure block`
44-
45-
bitmap의 방법으로 inode struct와 data에 대해 used/unused 정보가 저장된다.
40+
<table>
41+
<tr>
42+
<td width="50%">
43+
<img src="assets/bitmap-consistent.png">
44+
</td>
45+
<td>
46+
bitmap의 방법으로 inode struct와 data block의 data에 대해 used/unused 정보가 저장된다.
47+
</td>
48+
</tr>
49+
</table>
4650
<br/>
4751

4852
- `Key meta data block`
@@ -80,38 +84,38 @@ file의 size, mode, permission, 소유자, 각종 시각 등이 저장된다.
8084

8185
각 file마다 하나의 Inode struct가 부여된다.
8286

83-
Inode struct에서 가장 중요한 정보는 실제 data가 저장된 user data block의 pointer이다.
87+
Inode struct에서 가장 중요한 정보는 실제 data가 저장된 `user data block` pointer이다.
8488

8589
file의 크기가 block의 size보다 클 경우에는 여러 block을 사용해야 하기 때문에 data block을 가리키는 여러 pointer 변수들이 Inode struct에 존재하게 된다.
8690

8791
### Directory
8892

89-
directory는 file의 한 종류이다.
93+
Directory는 file의 한 종류이다.
9094

91-
그렇다면 directory의 Inode struct는 어떻게 구성되어 있을까? Inode struct의 일반적인 구성과 동일하다.
95+
그렇다면 Directory의 Inode struct는 어떻게 구성되어 있을까? Inode struct의 일반적인 구성과 동일하다.
9296

93-
directory의 data block에서의 data가 다른데, directory 하위 항목들에 대한 linked list를 저장된다.
97+
Directory의 `data block`에서의 data가 다른데, Directory 하위 항목들에 대한 linked list를 저장된다.
9498

9599
linked list의 각 node는 Inode number와 name을 구성 요소로 갖는다.
96100
이때 Inode struct pointer를 직접 저장하지 않고 단순 index 번호만 저장함으로써 공간을 절약한다.
97101

98-
directory마다 단순 선형 linked list를 운용하게 될 경우 깊은 계층 구조를 갖는 directory에서 성능이 많이 하락하기 때문에 B-tree와 같은 자료구조를 사용해 성능을 향상시키기도 한다.
102+
Directory마다 단순 선형 linked list를 운용하게 될 경우 깊은 계층 구조를 갖는 Directory에서 성능이 많이 하락하기 때문에 B-tree와 같은 자료구조를 사용해 성능을 향상시키기도 한다.
99103

100-
### File descriptor & Inode
104+
### File descriptor
101105

102-
각 process는 고유한 `file descriptor table`을 운용한다.
106+
각 process는 고유한 `File descriptor table`을 운용한다.
103107

104108
그 중 0번은 stdin, 1번은 stdout, 2번은 stderr file로 미리 예약되어 있다.
105109

106-
file descriptor란 해당 process가 어떤 file을 open했을 때 return되는 값인데, 한 process가 한 file을 여러 번 open할 수도 있다.
110+
File descriptor란 해당 process가 어떤 file을 open했을 때 return되는 값인데, 한 process가 한 file을 여러 번 open할 수도 있다.
107111

108-
이 때마다 file descriptor는 새로 할당되게 된다. 즉, 같은 file에 대해 다른 file descriptor를 동시에 가질 수도 있는 것이다.
112+
이 때마다 File descriptor는 새로 할당되게 된다. 즉, 같은 file에 대해 다른 File descriptor를 동시에 가질 수도 있는 것이다.
109113

110-
file descriptor는 `open file table`을 가리킨다.
114+
File descriptor는 `open file table`을 가리킨다.
111115
`open file table`의 각 항목은 status(read/write 등), offset, inode sturct pointer 등을 저장한다.
112116

113117
정리하자면,
114-
file descriptor table은 process마다 별개로 부여되는 local 구조이고,
118+
File descriptor table은 process마다 별개로 부여되는 local 구조이고,
115119
open file table, inode table은 전체 file system에서 하나를 운용하는 global 구조이다.
116120

117121
각 항목이 가리키는 방향은
@@ -130,6 +134,8 @@ file descriptor란 해당 process가 어떤 file을 open했을 때 return되는
130134

131135
## Reading a file from Disk
132136

137+
토글 안의 설명 한줄이 예시 사진 테이블의 한 행에 대한 설명이다.
138+
133139
<table>
134140
<tr>
135141
<th colspan="2">
@@ -237,6 +243,111 @@ file descriptor란 해당 process가 어떤 file을 open했을 때 return되는
237243

238244
## Creating & Writing a File from Disk
239245

246+
<table>
247+
248+
<tr>
249+
<th colspan="2">
250+
251+
</th>
252+
</tr>
253+
<tr>
254+
<td width="50%">
255+
<img src="https://cpm0722.github.io/assets/images/2020-12-01-File-System/04.png">
256+
</td>
257+
<td>
258+
<details>
259+
<summary>1. root directory (“ / “) read</summary>
260+
<blockquote>
261+
a. root의 inode struct read
262+
<br/>
263+
&nbsp;&nbsp;&nbsp;&nbsp;root의 block pointer 획득
264+
<br/>
265+
b. root의 data block read
266+
<br/>
267+
&nbsp;&nbsp;&nbsp;&nbsp;root의 하위 항목들에 대한 linked list 획득
268+
</blockquote>
269+
</div>
270+
</details>
271+
<details>
272+
<summary>2. foo directory (“ /foo “) read</summary>
273+
<blockquote>
274+
a. root의 하위 항목들에 대한 linked list에서
275+
<br/>
276+
&nbsp;&nbsp;&nbsp;&nbsp;이름이 “foo”인 항목의 inode number 획득
277+
<br/>
278+
b. inode number를 통해 inode table에서의 주소 계산
279+
<br/>
280+
c. foo의 inode sturct read
281+
<br/>
282+
&nbsp;&nbsp;&nbsp;&nbsp;foo의 block pointer 획득
283+
<br/>
284+
d. foo의 data block read
285+
<br/>
286+
&nbsp;&nbsp;&nbsp;&nbsp;foo의 하위 항목들에 대한 linked list 획득
287+
</blockquote>
288+
</div>
289+
</details>
290+
<details>
291+
<summary>3. bar file (“ /foo/bar “) create</summary>
292+
<blockquote>
293+
a. 현재 사용 중인 inode number을 확인하기 위해
294+
<br/>
295+
&nbsp;&nbsp;&nbsp;&nbsp;inode bitmap read
296+
<br/>
297+
b. 미사용 중인 inode number 선택 후 사용 중으로 변경하기 위해
298+
<br/>
299+
&nbsp;&nbsp;&nbsp;&nbsp;inode bitmap write
300+
<br/>
301+
c. foo의 하위 항목들에 대한 linked list에
302+
<br/>
303+
&nbsp;&nbsp;&nbsp;&nbsp;획득한 inode number와 “bar” 명칭으로 항목 추가하기 위해
304+
<br/>
305+
&nbsp;&nbsp;&nbsp;&nbsp;bar data block write
306+
<br/>
307+
d. bar inode struct read
308+
<br/>
309+
&nbsp;&nbsp;&nbsp;&nbsp;(inode struct 초기화 위함)
310+
<br/>
311+
e. bar inode struct write
312+
<br/>
313+
&nbsp;&nbsp;&nbsp;&nbsp;(inode struct 초기화 위함)
314+
<br/>
315+
f. foo inode struct write
316+
<br/>
317+
&nbsp;&nbsp;&nbsp;&nbsp;(inode struct 초기화 위함)
318+
</blockquote>
319+
</div>
320+
</details>
321+
<details>
322+
<summary>4. bar file (“ /foo/bar “) write</summary>
323+
<blockquote>
324+
a. write 가능한 여유 있는 data block 존재 여부 확인하기 위해
325+
<br/>
326+
&nbsp;&nbsp;&nbsp;&nbsp;bar inode struct read
327+
<br/>
328+
b. 현재 사용 중인 data block number 확인하기 위해
329+
<br/>
330+
&nbsp;&nbsp;&nbsp;&nbsp;data bitmap read
331+
<br/>
332+
c. 미사용 중인 data block number 선택 후
333+
<br/>
334+
&nbsp;&nbsp;&nbsp;&nbsp;사용 중으로 변경하기 위해
335+
<br/>
336+
&nbsp;&nbsp;&nbsp;&nbsp;data bitmap write
337+
<br/>
338+
d. bar data block write
339+
<br/>
340+
e. bar inode write
341+
<br/>
342+
&nbsp;&nbsp;&nbsp;&nbsp;(access time 등 갱신 위함)
343+
</blockquote>
344+
</div>
345+
</details>
346+
</td>
347+
</tr>
348+
349+
</table>
350+
240351
<hr/>
241352

242353
## 참고문헌
17 KB
Loading

0 commit comments

Comments
 (0)