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 - [ 참고문헌] ( #참고문헌 )
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 >
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
8589file의 크기가 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
9599linked 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+ root의 block pointer 획득
264+ <br/>
265+ b. root의 data block read
266+ <br/>
267+ 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+ 이름이 “foo”인 항목의 inode number 획득
277+ <br/>
278+ b. inode number를 통해 inode table에서의 주소 계산
279+ <br/>
280+ c. foo의 inode sturct read
281+ <br/>
282+ foo의 block pointer 획득
283+ <br/>
284+ d. foo의 data block read
285+ <br/>
286+ 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+ inode bitmap read
296+ <br/>
297+ b. 미사용 중인 inode number 선택 후 사용 중으로 변경하기 위해
298+ <br/>
299+ inode bitmap write
300+ <br/>
301+ c. foo의 하위 항목들에 대한 linked list에
302+ <br/>
303+ 획득한 inode number와 “bar” 명칭으로 항목 추가하기 위해
304+ <br/>
305+ bar data block write
306+ <br/>
307+ d. bar inode struct read
308+ <br/>
309+ (inode struct 초기화 위함)
310+ <br/>
311+ e. bar inode struct write
312+ <br/>
313+ (inode struct 초기화 위함)
314+ <br/>
315+ f. foo inode struct write
316+ <br/>
317+ (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+ bar inode struct read
327+ <br/>
328+ b. 현재 사용 중인 data block number 확인하기 위해
329+ <br/>
330+ data bitmap read
331+ <br/>
332+ c. 미사용 중인 data block number 선택 후
333+ <br/>
334+ 사용 중으로 변경하기 위해
335+ <br/>
336+ data bitmap write
337+ <br/>
338+ d. bar data block write
339+ <br/>
340+ e. bar inode write
341+ <br/>
342+ (access time 등 갱신 위함)
343+ </blockquote>
344+ </div>
345+ </details>
346+ </td >
347+ </tr >
348+
349+ </table >
350+
240351<hr />
241352
242353## 참고문헌
0 commit comments