-
open() retrieves metadata from disk to main memory
-
파일의 메타데이터를 메인 메모리로 올려놓는 것!

-
논리 디스크 안에 파일 시스템 있으면 메타 데이터도 저장되어 있고 파일 정보도 저장되어 있음.
-
메타데이터에는 파일 정보 위치를 가리키는 포인터도 있음. 이게 메모리로 올라간다 by open()
-
open(”/a/b/c”)
: 디스크로부터 파일 c(파일 c는 디렉토리 /a/b에 있음)의 메타데이터를 메모리로 가져온다.
-
이를 위해 directory path를 search한다.
-
루트 디렉토리 “/”를 open하고 그 안에서 파일 “a”의 위치를 획득
<aside>
💡 주의! 디렉토리도 파일이다!
</aside>
-
파일 “a”를 open 후 read해 그 안에서 파일 “b”의 위치 획득
-
파일 “b”를 open 후 read해 그 안에서 파일 “c”의 위치 획득
-
파일 “c”를 open한다.
-
파일 open()하는 과정

- 사용자 프로세스에서 시스템 콜을 한다 → open(”/a/b”). open()은 시스템 콜이므로 cpu 제어권이 운영체제로 넘어간다.
- 운영체제 내에는 각 프로세스를 관리하기 위한 자료구조인 PCB와 현재 오픈한 파일이 어떤 건지 전역적으로 관리하는 테이블(Open file table)이 존재한다.
- open()을 실행하면 가장 먼저 접근하는 게 root 디렉토리. root 디렉토리의 메타데이터는 처음부터 알려져 있다. 운영체제는 이를 이미 알고 있음.
- 운영체제가 root 디렉토리의 메타데이터를 먼저 메모리에 올린다. 이때 root 파일을 open한다.
- root 메타데이터에는 root contents 위치정보가 들어있음. 여기로 접근해 root 디렉토리 파일의 contents를 찾는다.
- root는 디렉토리 파일이다. 파일 내부에는 디렉토리 안에 들어있는 파일들의 메타데이터를 보관하고 있다.
- 이때 메타데이터에는 content 위치에 대한 포인터를 들고 있지 실제 파일을 들고 있지 않음.
- root 디렉토리 내용에 가면 a라는 파일의 메타데이터가 들어있는 것!
- 이 a 메타데이터를 디스크로부터 읽어서 메모리에 올린다. 이제 a의 메타데이터는 메모리에 올라와 있다.
- 파일 시스템 내에서 a 파일 콘텐츠의 위치 정보가 들어있겠지.
- a 메타 데이터 정보를 통해 a content 위치에 접근한다. 여기서 b의 메타데이터를 찾는다.
- b 메타데이터를 메모리에 올린다.
⇒ 여기까지 오면 open(”/a/b”) 가 끝난다.
디렉토리 끝에 있는 최종 타겟 파일을 메모리에 올리는 작업이 open()!
- open()은 시스템 콜로, 결과값을 반환해준다. 각 프로세스마다 그 프로세스가 오픈한 파일에 대한 메타데이터 포인터를 갖고 있는 배열이 PCB 내에 들어있는데, 이것이 파일 디스크립터 테이블(fd table)!
- open()을 통해 메모리에 올린 b의 메타데이터 주소값을 가리키는 포인터가 fd 테이블 내에 들어간다.
- 테이블 내 몇 번째 인덱스에 b의 메타데이터 주소값이 들어가있냐! 이 인덱스 값이 바로 fd이다.
- 얘가 open()에 대한 return 값이다.
- 우리는 b를 open했기 때문에 fd를 통해 fd 테이블에 접근해 곧바로 b의 메타데이터가 들어있는 메모리 내 주소값으로 이동 가능하다. (루트 디렉토리부터 다시 1~7 과정을 반복할 필요가 없다.)
- 이 fd로 read/write 요청이 가능하다!
-
파일 read?

- 인자로 fd를 넣어서 read()를 실행한다.
- 곧바로 b의 메타데이터로부터 b의 content 위치에 접근한다.
- read에서 인자로 넣어준 용량만큼 디스크에서 메모리로 읽어온다.
- 사용자 프로세스한테 읽어온 파일을 다이렉트로 전달하지 않는다.
- 운영체제가 자신의 메모리 공간 일부에 먼저 읽어놓는다.
- 그 다음에 사용자 프로그램한테 내용을 카피해서 전달해준다.
if 이 프로그램 혹은 다른 프로그램에서 동일 파일을 읽으려고 하면?
⇒ 다시 디스크에 방문하지 않고 커널에 올려놓은 파일을 사용자 프로세스에 복사한다!!
이것이 바로 버퍼 캐싱!(buffer caching)
!
-
VM에서 페이징 기법: 이미 메모리에 올라온 페이지에 대해서는 중간에 운영체제가 끼어들지 못함. 하드웨어 단에서 주소변환해서 바로 접근. 페이지 fault뜨면 그제서야 cpu 제어권이 운영체제로 넘어와서 스왑 영역에서 해당 페이지 읽어오고 하는 작업을 했음.
-
파일에 대한 read/write하는 시스템에서는 운영체제가 버퍼 캐시를 갖고 있음.
-
파일 시스템에서 버퍼 캐시: 요청한 내용이 버퍼 캐시 안에 있든/없든 간에 운영체제한테 cpu 제어권이 넘어가게 된다.