Operating System Concepts 13장 File-System Interface

[운영체제 정리] · 2024. 12. 17. 17:32

Unix File System 유인물

 

  • 파일을 생성하면 그 파일에 대한 FCB(File Control Block)가 생긴다. UFS에서는 inode라고 한다.

 

  • FCB 구성 요소
  • Data block : 이용가능한 저장 공간
  • inode blcok : 각 파일의 inode => 파일에 대한 정보를 담고 있는 고유한 식별자
  • super block : 파일 시스템에 대한 정보를 가지고 있다. (메타 데이터)
  • Boot block : File system에 있는 코드를 메모리에 올린다. 

 

입출력 장치를 크게 둘로 나눴다.

  • character device : 하나씩 읽고 씀
  • block device : 읽거나 쓸 때 블록단위로 함

 

디렉토리들은 ufs에서 전부 file로 등록이 됨

 

C file directory

  • inode 번호가 할당됨 inode 번호가 있어야 찾아갈 수 있다.

파일 시스템의 조상은? => root 

root/directory/

 

directory file들은 전부 파일 타입2 => 유인물 B부분

 

파일 tree에서 non-leaf는 directory file들 leaf는 일반 file이다.

부모 : .. , 자기 자신 : .

 

D 

12 - 14 : 파일 타입

나머지 9 bit는 rwx rwx rwx 

 

디스크를 블락 단위로 쪼갬 : A에 100개 할당, 빈블락을 찾아서 할당 빈파일이 늘어났다

 

E 

처음에 direct addressing 은 block을 직접 가리키고 12-14는 inderict로 간접적으로 가리킨다.

12는 찾아가면 256짜리 table 이있고

13은 double indirect 여서 256 x256

14는 트리플

 

 

F

파일을 하나 생성하게 되면 1.inode를 할당하고 2.dierctory에 등록을 한다.

 

그러면 PCB에 File descriptor table이 생기는데 여기에 stdin, stdout, stderr파일이 있다. 얘네는 사용자의 terminal과 연결 되어 있다. > 중요!

 

0,1,2는 std를 가리키고 3부터 file table을 가리킨다.

fd1 = open(f1) ; file descriptor 생성 => read(fd1)을 넣음

 

file table은 오픈할때마다 만들어짐 하지만 inode table은 여러번 오픈해도 하나밖에 없음

 

즉 open을 한번하면  A PCB에서 open mode와 offset을 확인하는 파일 테이블을 만듦 => 그러면 file table에서 inode table을 찾고 inode table에서 inode number를 index로 disk를 접근, 그 disk는 [Boot B,Super B,inode, Data B]로 구성되어 있어 offset/block size로 E 테이블에서 블록을 찾는다. 그 inode 번호를 갖고 있는 첫번째 블락을 갖고옴

 

 

file delete를 하면 inode table 회수, 블락들 회수, 파일 directory 회수

 

Disk Cache —> 디스크에 있는 내용을 메모리에 올려놓는다.

ㄴ> 디스크의 접근 시간이 많이 걸리니까 한번 읽어 놓은 것은 메모리에 올려놔서 접근시간을 줄인다.

 

close를 해도 파일 디스크립터 테이블과 open File Table은 사라지지만 inode table 부분은 안사라진다.

 

Fork 유인물 

 

redirect 

 

‘>’ 아웃풋을 바꿀때

 

fd1 = create(f1); => 없는 파일을 만듦 따라서 create!

close(stdout);

dup2(fd1,stdout);

close(fd1);

 

‘<‘ 인풋을 바꿀때 

fd1 = open(f1); => 있는 파일을 연다 따라서 open!

close(stdout);

dup2(fd1,stdin);

close(fd1);

 

piping

 

%cat f1 | wc 라고 했을 때 pipe(fildes);라는 시스템 콜로 임시 pipe file(buffer)가 생성된다.

 

그리고 자식의 자식을 만들고 이게 생산자역할을 함 

fildes[1]이 out 역할, fildes[0]이 in 역할

 

close(stdout);

dup2(fildes[1],stdout);  => 자식의 out을 stdout에서 fildes[1]으로 바꿈

close(fildes[1]);  

close(fildes[0]);

 

close(stdin);

dup2(fildes[0],stdin); => wc의 in을 fildes[0]으로 바꿈 

close(fildes[0]);

close(fildes[1]);