안녕하세요? 허니입니다. 파일 시스템에 대해 어느정도 익숙하신 분들이라면 파일시스템의 내부 구조가 궁금하실 거라 생각합니다. 이번에는 파일시스템을 더 자세하게 즉, 내부 구조에 대해 포스팅을 하겠습니다. 학생이나 연구원분들에게 많은 도움이 될 것이라고 생각하며 언제든지 질문은 환영입니다.

 


오늘의 주제

 

 파일시스템의 내부구조

boot block

file system descriptor

file descriptor

data block

 

 디스크의 구조

 파일의 read/write 경로

 read/write 하기 위한 정보

 


파일 시스템의 내부구조


파일 시스템은 다음과 같은 여러개의 물리적인 분할 영역(partition)으로 구성되어있다.각각의 partition을 보다 상세히 살펴보자.

 

 부트블록(boot block)
boot라는 것은 컴퓨터를 켤 때 컴퓨터가 동작할 수 있도록 하는 준비 작업을 말한다. 바로 컴퓨터가 부팅 될 때 시스템에 OS를 설치하기 위해서 필요한 정보들이 저장되어 있는 디스크 영역이 부트블록이다. 다시 말해 OS가 디스크를 포함한 시스템을 제어하기 위해 필요로 하게 되는 정보들이 저장되어 있는 블록인 것이다.

 

 

 파일시스템 설명자(file system descriptor)
파일 시스템 설명자에는 파일의 크기, 파일의 개수, 디스크의 특성, 디스크블록이 먼지 등에 의해 손상했는 지의 여부 등이 판단되는 bad 블록 등의 내용이 담겨져 있다.

 

 파일 설명자(file descriptors)
파일은 컴퓨터를 껐다 켜도 남아있게 마련이다. 그것은 파일이 이미 디스크에 블록단위로 저장되어 있기 때문이다. 그렇기 때문에  파일이 어떤 블록에 저장되어 있는지를 알려주는 정보가 있어야 하는데 그러한 정보는 바로 file descriptor에 저장되어 있는 것이다. 앞서 설명한 Meta data도 file descriptor에 기록되어 있다.

 

 데이터블록(data block)
데이터 블럭은 찾고자하는 실제 데이터들이 저장되어 있는 블록인 것이다. 데이타들을 찾기 위한 가장 밀접한 정보들은 파일설명자에 저장되어 있기 때문에 데이터 블록과 거리상으로 밀접해야 한다. 그러나 디스크의 용량이 자꾸 커져감에 따라 하나하나의 파일설명자블록과 데이터 블록이 멀어져가게 되었다. 그렇기에 최근에는 파일설명자의 정보를 디스크를 구성하고 있는 실린더 곳곳에 분산시켜 놓게 되었다.


디스크의 구조


디스크는 트랙이라고 불리는 동심원에 자료를 저장하는데 이 동심원은 자기적으로 만들어진 것이기 때문에 눈으로 볼 수는 없다. 또한 하나의 트랙은 여러 개의 섹터로 나뉜다. 이러한 트랙들의 수직적 집합을 바로 실린더라고 한다. 데이터들은 트랙에 비트 형태로 저장되는데 디스크의 기억용량은 한 면 당 트랙의 수, 비트의 밀도, 기록 가능한 면의 수 등에 의해 결정된다. 한 면 당 트랙의 수는 디스크의 물리적 크기, 자료를 기록하는 기술 등에 따라 다르다.

그림 58 디스크의 구조

 

자료를 읽고 쓰기 위해서는 읽기/쓰기 헤드가 원하는 자료가 위치하고 있는 트랙 위에 위치해야 한다. 읽기/쓰기 arm이 원하는 자료의 위치를 찾아내면 디스크를 읽기/쓰기 헤드밑에서 회전하게 함으로써 필요한 자료에 접근할 수 있다. 보통 여러 개의 flat이 있을 경우에는 여러 개의 접근 arm을 사용하게 되는 것이다.
 

그림 59 하드 디스크의 Arm


파일을 read/write 하는데 어떤 경로로 이뤄질까?


파일을 read/write 하기 위해서는 open이라는 과정을 거치게 된다. 컴퓨터 시스템에게 파일을 사용하겠다는 통보가 이뤄지는 단계로 파일이름을 확인하고 그 파일에 접근가능한지를 판단하고 파일설명자를 할당하게 된다. read/write를 하게 될 파일이 실제 존재한다는 것은 디렉토리를 살펴봄으로 확인이 가능하다. 파일의 존재와 접근여부를 확인한 후 리턴하여 실제 파일을 open 하게 되는 것이다.
 


read/write 어떤 정보들을 통해 실행될까.

 

read/write의 실행 정보를 살펴보기에 앞서 read/write 명령어가 어떤 수행을 하는지 잠깐 살펴보자. read란 명령이 떨어지면 버퍼캐쉬에 있는 내용을 사용자 버퍼로 읽어오는 동작이 이뤄지고 write라는 명령은 버퍼에 내용을 버퍼캐쉬에 쓰는 동작을 한다.  실제로 어떤 한 파일에 대한 read를 실행하게 되면 다음과 같은 정보들이 참조되어 처리되게 된다.
 
 - read (파일설명자, 버퍼, 길이, 내부주소)
 
각각의 의미를 알아보면 다음과 같다.

정보

의미

파일 디스크립터

파일이 저장되어 있는 디스크블록에 관한 정보 제공

버퍼

디스크로부터 읽어 들어올 주소  

길이

읽으려는 바이트 수

내부주소

파일의 현재위치, 파일 포인터가 내부주소를 가르킴


예를 들어 read( fd, buf1, 100, 35)이면 100바이트를 buf1에 35로부터 읽어오기를 의미한다. 여기에서 read의 역할은 파일을 읽고 파일포인터를 옮기는 것이다. 이와 같이 write( fd, buf4, 300, 20) 이라고 명령되면 buf4의 20으로부터 300바이트 쓰기가 실행되는 것이다.

 


보다 상세히....프로세스와 연결시켜....

 

 1) read가 명령되면 먼저 파일 설명자를 체크하게 된다.
파일 설명자를 체크하고 파일의 현재위치를 알아내게 되면 먼저 그 파일이 버퍼 캐쉬에 저장되어 있는지를 확인한다.

 2) 버퍼캐쉬 확인
만약 버퍼캐쉬에 찾고자하는 파일이 있으면 그 내용을 그대로 read하면 된다. 그러나 버퍼캐쉬에 찾고자하는 파일이 없을 경우 다음과 같은 일이 진행된다.

 3)파일 설명자를 통해 알아낸 파일의 현재 위치로부터 주어진 길이까지 해당되는 물리적 디스크블록을 찾는다.
그러나 여기서 한가지 문제에 부딪히게 되는 것이다. 바로 파일은 연속적으로 존재하지만 이 파일이 디스크상으로 저장될 때는 블록단위로 쪼개져 이곳 저곳에 흩어져 저장되어 있는 것이다. 그렇기에 논리적인 파일 offset을 물리적인 디스크 블록으로 매핑해야 하는 과정이 필요하다.

 4) 디스크에 블록으로 저장된 파일의 위치는 찾는 작업이 끝나면 디스크 I/O을 통해 장치구동기(Device driver)를 호출하게 된다.

 5) 장치구동기(Device driver)는 커널로부터 read에 관한 요구사항을 받아 디스크 컨트롤러에게 다음과 같은 명령을 한다. (read/write,실린더 번호, 블록번호) 몇 번 실린더에 몇 번 블록을 리드 혹은 라이트해라.

6) 디스크컨트롤러에게 명령이 전해졌다고 해서 바로 작업이 수행되는 것은 아니다.
서론에서 공부한 프로세스라이프사이클에 따라 sleep 상태로 들어가게 되는 것이다. sleep 상태로 들어가는 이유는 호출한 장치구동기(Device driver)가 서비스를 제공하기 위한 해당 조건이 만족될 때를 기다리기 위해서이다.
 
이러한 명령을 받은 디스크 컨트롤러는 다음과 같은 과정을 거친다.
1.해당파일을 찾고 2.DMA (direct memory access) 메모리에 접근해 입력/출력을 버퍼캐쉬를 통해 처리하고 3.인터럽터를 건다.
인터럽트를 수행하는 프로세스는 해당 서비스 루틴을 wake up 시키고 버퍼에 저장되어 있는 내용을 카피해 리턴하게 되는 것이다. read/write 한가지를 수행하기 위해서도 컴퓨터 시스템 내부적으로는 이와 같이 복잡한 과정들을 거치게 되는 것이다.

 

그림 60 Read/Write의 수행과정
 

 잠깐, 상식!

장치구동기(Device driver) 란...
프린터, 모니터, 디스크 등과 같은 주변장치들을 제어하고 관리하는 방법을 OS에게 알려주는 프로그램. OS에서는 시스템에 설치되어 있는 주변장치를 제어, 관리하기 위하여 Device driver에서 제공되는 기능을 이용한다.


 


요점정리

 

 파일 시스템의 내부구조
1) 부트블록(boot block)
2) 파일시스템 설명자(file system descriptor)
3) 파일 설명자(file descriptors)
4) 데이터블록(data block)

 

 디스크의 구조
디스크는 트랙이라고 불리는 동심원에 자료를 저장하고 하나의 트랙은 여러 개의 섹터로 나뉜다. 이러한 트랙들의 집합을 바로 실린더라고 한다.
이러한 실린더의 집합을 디스크라고 한다.

 

 read/write의 실행정보: read (파일설명자, 버퍼, 길이, 내부주소)
 


퀴즈

 

 퀴즈1) 파일 시스템의 내부구조중 파일 설명자(file descriptors)의 역할은 무엇인가?

 퀴즈2) 파일을 read/write 하기 위해서는 open이라는 과정을 거치게 된다. open을 통해 어떤 일들이 수행되나?

 퀴즈3) read( fd, buf1, 100, 35)이라는 명령문이 의미하는 것은 무엇인가?

 퀴즈4) read가 명령되면 먼저 파일 설명자를 체크하고 명령을 수행하기 앞서 버퍼캐쉬 확인하게 된다. 그 이유는 무엇인가?

 퀴즈5) 디스크컨트롤러에게 명령이 전해졌다고 해서 바로 작업이 수행되는 것은 아니라 우선 sleep 상태로 들어가게 된다. 그 이유는 무엇인가?

 

 정답1) 파일설명자는 파일이 어떤 블록에 저장되어 있는가 하는 정보를 알려주는 역할을 한다.

 정답2) open은 컴퓨터 시스템에게 파일을 사용하겠다는 통보가 이뤄지는 단계로 파일이름을 확인하고 그 파일에 접근가능한지를 판단하고 파일설명자를 할당하게 된다.

 정답3) 100바이트를 buf1의 35로부터 읽어오기를 의미한다.

 정답4) 만약 버퍼캐쉬에 찾고자하는 파일이 있으면 그 내용을 그대로 read하면 되기 때문에 명령문 수행에 앞서 버퍼캐쉬를 확인하는 것이다.

 정답5) sieep 상태로 들어가는 이유는 호출한 장치구동기(Device driver)가 서비스를 제공하기 위한 해당 조건이 만족될 때를 기다리기 위해서이다.

 

목 차

 운영체제를 시작하는 분들을 위해

 운영체제의 역사와 구체적으로 어떤 일들을 수행하나요?

 운영체제의 목표와 역할이 미래에도 계속 증대될까요?

 운영체제를 이해하기 위해 필요한 기본 개념들은 무엇인가요?

 운영체제 프로세스 생애주기(Process Lifecycle)는 무엇인가요?

 운영체제 프로세스 관리(Process Management)는 어떻게 하나요?

 운영체제 프로세스(Process)의 처리 속도는 어떻게 높일까?

 운영체제 스레드(Thread)는 무엇인가요?

 운영체제 스케줄링 (Scheduling)은 어떻게 하나요?

 운영체제 스케줄링 알고리즘의 비교 기준이 있나요?

 운영체제 프로세스 동기화가 무엇인가요?

 운영체제에서 세마포어(Semaphore)란?

 운영체제 메모리 관리(Memory Management)는 어떻게 하나요?

 운영체제 메모리 분할 방법은 어떻게 하나요?

 운영체제 가상메모리(Virtual Memory)는 무엇인가요?

 운영체제 Page in/out, Swapping 등이 Page Table Entry와 어떤 관계인가요?

 운영체제 메모리 관련해서 알아야 할 개념은 어떤것이 있나요? (TLB, Locality, Working Set, Overlay)

 운영체제 Page replacement (페이지 대체) 알고리즘이란?

 운영체제 파일시스템(File System)은 어떻게 운영되나요?

 운영체제 파일시스템 내부구조는 어떻게 되나요?

 운영체제 디스크 공간 할당(Disk Space Allocation) 알고리즘과 효과적 알고리즘의 판단 기준은?

 운영체제 파일시스템에서 접근 시간, 디스크 스케줄링을 위한 알고리즘, I/O 시스템이란?

 리눅스 인터럽트 (Interrupt)에 대해 자세히 설명해 주세요.

 인텔 구조에서 운영체제 가상 메모리 (Virtual Memory)는?

 운영체제 아키텍처의 종류는 얼마나 있나요?

 

+ Recent posts