파일 시스템을 알아보기에 앞서 먼저 이것부터 보겠습니다.
"모든 것이 파일이다" 라는 개념입니다. 실제로 리눅스에서는 모든 것을 파일로 보고 있습니다.
리눅스 파일 종류
1. 일반 파일 : 텍스트파일, 실행파일, 이미지파일 등 대부분의 파일
2. 디렉토리 파일 : 디렉토리도 파일로 취급
3. 링크 파일 : 원본파일을 다른 파일명으로 지정한 것으로 윈도우의 바로가기와 같은 개념. 심볼릭 링크, 하드링크가 있음.
4. 장치 파일 : 하드디스크, 마우스, 모니터, 스피커 등과 같은 장치들도 파일로 취급
5. 파이프, 소켓 파일 등등
이처럼 여러가지를 모두 파일로 인식하고 관리합니다.
파일 시스템이란?
파일 시스템은 "운영체제가 파일을 관리하는 방법" 입니다. 파일의 생성, 삭제, 이동, 복사, 검색, 보안 설정 등 다양한 기능을 제공합니다.
파일 시스템의 종류는 다양합니다. 대표적으로 FAT, NTFS, ext2, ext3, ext4 등이 있지요. 운영체제가 윈도우냐 리눅스냐 macOS냐 에 따라서 사용하는 파일시스템이 조금씩 다릅니다. 여러종류가 있지만 위에서 말한 파일의 생성, 삭제, 이동, 복사, 검색, 보안 설정 등을 어떻게! 하는지가 조금씩 다를 뿐이지 역할은 모두 같습니다.
유닉스계열의 파일 시스템의 구조를 한 번 볼까요?
유닉스계열의 파일 시스템은 크게 4가지 블록으로 구성되어 있습니다.
Boot block : 부팅에 필요한 파일을 가지고 있습니다. 어떤 파일 시스템이라도 가장 먼저 등장하는 블록입니다.
Super block : 파일 시스템에 대한 전체적인 정보를 가지고 있습니다. 전체적인 정보란 비어있는 블록은 무엇이고 사용중인 블록은 무엇이고, 어디부터 어디까지가 Inode list 인지, Data block 인지에 대한 정보입니다.
Inode list : 모든 Inode 파일을 저장하고 있습니다. Inode 파일이라는 것은 실제 파일들에 대한 정보를 가지고 있는 meta data 입니다. 소유자, 실제 파일 데이터 블록 사이즈, 실제 파일 데이터 블록 위치 등의 정보입니다.
Data block : 실제 데이터가 저장되어 있습니다. 데이터는 블록형태로 저장되어 있는데 블록당 사이즈가 보통 4KB 라고 합니다.
i-node는 전통적인 유닉스 계통 파일 시스템에서 사용하는 자료 구조입니다.
Inode를 통해 실제 데이터에 접근하게 됩니다. 그래서 모든 파일들은 각자 고유의 Inode 값을 가지고 있습니다.
ls -i 명령어로 파일들의 i-node 값을 확인 할 수 있습니다.
파일 시스템이 파일을 관리하는 방법이라면, 파일을 사용하는 방법은 무엇이 있을까요?
바로 유닉스계열의 운영체제가 사용하는 file descriptor, 윈도우에서는 이와 비슷한 file handle 가 있습니다.
file descriptor에 대해서 알아볼까요?
파일 디스크립터는 운영 체제가 파일을 다루기 위해 사용하는 일종의 포인터로, 파일을 열거나 닫고, 읽기나 쓰기 등 파일 작업을 수행할 때 사용됩니다.
file descriptor table은 프로세스 당 한개씩 존재하고 file descriptor는 여러개가 있습니다.
예를 들어서 youtube 프로세스가 여러 파일을 사용하려고 합니다. 그 때 사용하는 file descriptor 는 접근하려는 파일에 따라서
인터넷 연결 소켓 디스크립터
동영상 파일 디스크립터
오디오 디바이스 디스크립터
키보드, 마우스 디바이스 디스크립터
등이 있습니다.
youtube 프로세스가 사용하는 file descriptor에서 3번이 동영상 파일 디스크립터라면 이것을 통해 동영상 파일을 열게 됩니다. 열려있는 파일에 대한 정보가 들어있는 open file table은 모든 프로세스가 공용으로 사용합니다.
그림에서 fd 0, 1, 2 가 각각 stdin, stdout, stderr 이라고 써져 있죠? 이것은 어떤 프로세스든 기본적으로 할당되는 디스크립터 입니다.
stdin(Standard Input, 표준 입력) : 키보드나 파일 등으로부터 데이터를 읽어들일 때 사용됩니다.
stdin(Standard Input, 표준 출력) : 프로그램에서 출력한 결과를 화면이나 파일에 쓸 때 사용됩니다.
stderr(Standard Error, 표준 에러) : 프로그램 실행 중 오류가 발생했을 때 오류 메시지를 출력하는데 사용됩니다.
예를 들어서, 사용자로부터 두 수를 입력받아서 더한 결과를 출력하는 프로그램이 있을 때 사용자로부터 입력을 받기 위해서는 stdin을 사용해야 하며, 결과를 출력하기 위해서는 stdout을 사용해야 합니다. 또한, 입력값이 잘못된 경우 오류 메시지를 출력해야 하는데, 이때는 stderr을 사용합니다.
실제로 한번 볼까요?
리눅스 환경에서 ps -ef 명령어로 현재 동작하고 있는 프로세스를 확인할 수 있습니다. e는 모든 프로세스, f는 자세히를 의미하는 옵션입니다. ps -ef 만 치면 너무 많이 나와서 위의 그림에서는 | grep sshd 를 추가로 입력해서 sshd가 들어가는 프로세스만 출력하였습니다. 맨 윈쪽이 user ID 이고 두번째가 Process ID 입니다. PID가 2633인 프로세스의 file descroptor를 볼까요?
sudo ls -trn /proc/[PID]/fd 명령어로 확인할 수 있습니다. 소켓, 파이프 등을 사용하고 있네요!
파일 디스크립터를 통해 확인한 open file table에는 파일에 대한 파일 상태, 파일 위치, 파일 권한 등과 함께 inode 정보도 들어있습니다. 위에서 언급했었던 inode가 여기서도 나오네요! 그래서 이 inode 정보를 통해 실제 파일의 데이터 블록에 접근하게 됩니다.
이미지 출처 및 참고
https://www.easeus.com/diskmanager/file-system.html
https://www.youtube.com/watch?v=UF2WpoVDLdM
https://slidesplayer.org/slide/14722755/
https://twofootdog.tistory.com/51
https://www.youtube.com/watch?v=_itDfNvm09k
https://asfirstalways.tistory.com/145
'운영체제' 카테고리의 다른 글
[OS] 캐시메모리, L1, L2, Mapping 질문답변 (0) | 2023.04.07 |
---|---|
[OS] 가상메모리, 페이징, 세그멘테이션, page fault 질문답변 (0) | 2023.04.07 |
[OS] 메모리 계층구조, 단편화, First fit, Best fit, Worst fit (0) | 2023.03.30 |
댓글