daco 2023. 9. 8. 17:09

운영체제

자원을 관리하고 할당하는 특별한 프로그램
프로그램 입장에서 운영체제는 자원에 접근하기 위한 인터페이스를 제공해주는 특별한 프로그램

 

※ 운영체제 핵심 서비스

  • 프로세스 관리
  • 자원 관리 접근 및 할당
  • 파일 시스템 관리

리소스: 실행에 마땅히 필요한 요소

 

커널

운영체제의 심장부

이중 모드

  • 커널 모드: 운영체제 서비스를 제공 받을 수 있는 모드 -> 커널 영역의 코드를 실행할 수 있는 모드
  • 사용자 모드: 운영체제 서비스를 제공 받을 수 없는 모드 -> 커널 영역의 코드를 실행할 수 없는 모드


시스템 콜

운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 소프트웨어 인터럽트

 

strace

시스템 콜을 추적하기 위한 도구

  • -o 파일로 저장
  • -t 타임스탬프
  • -tt 밀리세컨드 타임스탬프
  • -T 각 시스템 호출 소요 시간
  • -c 요약 결과
  • -e 실행 파일의 시스템 호출 결과 필터링


man
명령어 매뉴얼을 보여줌

ps
현재 실행 중인 프로세스를 보여줌

 

open
파일을 여는 시스템 콜

close
파일을 닫는 시스템 콜(자원 해제)

read
파일 디스크립터에서 데이터를 읽어들이는 시스템 콜

write
파일 디스크립터에 데이터를 쓰는 시스템 콜

fork
프로세스 복제하여 자식 프로세스 생성
프로세스들이 계층적으로 구성되는 원리

exec
현재 프로세스의 주소 공간을 새로운 프로세스로 덮어쓰기
자식 프로세스로 하여금 다른 코드를 실행토록 하기

getpid/getppid
현재 PID를 반환하는 시스템 콜
부모 프로세스 PID를 반환하는 시스템 콜

syslog
시스템 로그 메시지 남기기

exit
실행 중인 프로그램 종료

 

운영체제의 프로세스 관리

프로세스란 실행 중인 프로그램 -> 같은 프로그램도 별도의 프로세스가 될 수 있다. ex) 메모장 여러개 열 때 여러 프로세스가 동작한다.

포그라운드 포로세스

사용자와 직접적으로 상호작용하는 프로세스

 

백그라운드 프로세스

뒷단에서 사용자와 직접적으로 상호작용하지 않으면서 실행되는 프로세스

systemctl list-units --type service
어떤 서비스가 현재 어떤 상태인지 어떤 서비스인지 설명이 되어 있음

프로세스 제어 블록(PCB)
프로세스에 대한 식별 데이터 덩어리
들어있는 정보는 PID(PPID), 레지스터, 스케줄링 정보, 메모리 정보, 사용한 파일 정보, 입출력장치 정보 등

pidof [프로세스], pgrep [프로세스]
pid 값을 확인할 수 있다.

문맥 교환
문맥(context): 실행을 재개하기 위해 기억해야 할 정보
문맥 교환: 여러 프로세스들이 번갈아가며 실행되는 원리

 

사용자 영역

스택 영역, 힙 영역, 데이터 영역, 코드 영역(h->l)


코드 영역(텍스트 영역)
실행 가능한 코드; 기계어로 이루어진 명령어
Read-only

데이터 영역
프로그램이 실행되는 동안 유지할 데이터(ex 전역 변수)


BSS 영역

프로그램 실행 동안 유지할 데이터 중 초기값 없는 데이터


힙영역
사용자(개발자)가 직접 할당 가능한 공간
메모리 영역을 할당 했다면 해제하자
직접 해제 하기, 자동으로 해제 하기(가비지 컬렉션)
안해주면 메모리 누수가 생김

스택 영역
임시로 저장되는 영역(ex 매개변수, 지역변수)

힙 영역은 낮은 주소에서 높은 주소로 할당
스택 영역은 높은 주소에서 낮은 주소로 할당
(주소 중복 방지)
코드 영역과 데이터 영역은 정적 할당 영역
힙 영역과 스택 영역은 동적 할당 영역

 

size
text data bss 영역이 얼마나 차지하는지 볼 수 있음


top
리소스 관리할 때 자주 사용
여기서도 코드영역과 데이터영역을 조회할 수 있다

 

대표적인 프로세스 상태

생성 상태(new)
이제 막 PCB를 할당받아 생성된 상태 


준비 상태(ready)
지금 당장이라도 cpu를 할당받아 실행이 될 수 있지만 아직 실행될 차례가 오지않아서 실행 안되고 있는 상태


실행 상태(running)
cpu를 할당받아 실행되고 있는 상태


대기 상태(blocked)
주로 입출력 사용을 요청했을 때 대기하는 상태, 이벤트를 기다리는 상태


종료 상태(terminated)
프로세스가 종료되어 PCB가 폐기되고 자원을 반납하고 있는 상태

준비상태에서 cpu를 할당 받아 실행 상태가 되는 것을 디스패치라고 함
할당된 cpu 이용시간이 끝났다면 다시 준비상태가 되는 것을 타이머 인터럽트(타임 아웃)이라고 함
실행 상태에서 입출력 요청이 일어나면 대기 상태가 되고 입출력 완료가 되면 준비 상태가 됨

top으로 상태를 볼 수 있음

  • S는 state로 상태를 나타냄
  • R: Running: 실행상태
  • S: Sleeping: 대기상태
  • W: Waiting: 준비 상태
  • S: Stopped: 종료 상태
  • Z: Zombie: 프로세스 종료 후 자원이 반환되었지만 커널 영역에 프로세스가 남아있는 상태(PID가 할당 되어있음)


프로세스의 계층적 구조

fork-exec
계층적 구조로 프로세스가 생성되는 원리

 

pstree으로 확인 가능

 

스레드

프로세스를 구성하는 실행 흐름의 단위
각기 다른 스레드 ID, 프로그램 카운터, 레지스터, 스택

프로그램 카운터에 다음에 실행될 명령어의 주소가 있음
레지스터는 명령어를 가져오고 연산 결과를 저장하는 역할
스택은 변수나 주소를 저장하는 공간

프로세스 간에는 기본적으로 자원을 공유하지 않음
스레드 간에는 프로세스의 자원을 공유

프로세스 간에도 자원 공유가 가능하다 -> 프로세스간 통신(IPC)
공유 메모리를 통한 통신, 파이프를 통한 통신, 소켓을 통한 통신 등

 

CPU 스케줄링

프로세스 우선 순위(스레드도 포함)
모든 프로세스(및 스레드)는 실행되기 위해 자원을 필요로 한다.
운영체제가 공정하고 합리적으로 자원을 배분하는 방법을 스케줄링이라 한다.

CPU자원은 한정 되어있고 실행 중인 프로세스는 여러개가 있음
프로세스 우선순위를 고려하여 할당하는 것이 좋다

PR, NI: 낮을수록 높은 우선순위

우선순위의 차이를 보이는 대표적인 프로세스 유형

  • I/O bound process: 입출력 작업이 더 많은 프로세스
  • CPU bound process: CPU 사용이 더 많은 프로세스

일반적으로 I/O bound process가 CPU bound process보다 우선순위가 높음

프로세스 우선순위를 토대로 CPU 할당 받는 방법으로 CPU 스케줄링 알고리즘이 있음

 

스케줄링 큐

자원은 한정되어있고 실행 중인 프로세스는 여러개
프로세스들의 요구사항을 일목요연하게 관리하는 방법

※ 대표적인 스케줄링 큐

  • 준비 큐: CPU 이용을 기다리는 프로세스들의 큐
  • 대기 큐: 대기 상태 프로세스들의 큐 (입출력 요청)

우선순위 낮은 프로세스가 먼저 큐에 삽입되었어도 우선순위 높은 프로세스가 먼저 처리 될 수 있음

 

선점형 스케줄링(타임아웃 기반 문맥교환)

현재 실행 중인 프로세스의 자원을 빼앗아 해당 프로세스에게 할당

장단점
프로세스에 자원을 고루 할당 가능
문맥 교환 과정의 오버헤드

 

비선점형 스케줄링

현재 실행 중인 프로세스 실행이 끝날 때까지 해당 프로세스 대기

장단점
고르지 않은 자원 분배
문맥 교환 과정에서의 오버헤드 적음

 

CPU 스케줄링 알고리즘

전공서 기준
1. 선입 선처리 스케줄링
2. 최단 작업 우선 스케줄링
3. 라운드 로빈 스케줄링
4. 최소 잔여 시간 우선 스케줄링
5. 우선순위 스케줄링
6. 다단계 큐 스케줄링
7. 다단계 피드백 큐 스케줄링

 

선입 선처리 스케줄링(FIFO 스케줄링 (FCFS))

CPU를 먼저 요청한 프로세스부터 CPU 할당
준비 큐에 삽입된 순서대로 실행되는 비선점형 스케줄링
부작용

호위 효과(convey effect): 앞의 프로세스가 긴 시간을 소요할 때 그 뒤의 프로세스들이 그 시간만큼 기다려하는 현상

 

최단 작업 우선 스케줄링(SJF 스케줄링)

준비 큐 프로세스 중 CPU 이용 시간이 짧은 프로세스부터 실행
호위효과 방지

 

라운드 로빈 스케줄링(Round Robin 스케줄링)

선입 선처리 스케줄링 + 타임 슬라이스
준비 큐에 삽입된 순서로 실행하되, 타임 슬라이스만큼 실행
선점형 스케줄링

 

최소 잔여 시간 우선 스케줄링(SRT 스케줄링)

최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
작업 시간 짧은 프로세스부터 처리하되, 타임 슬라이스만큼 돌아가며 실행

 

우선순위 스케줄링

프로세스마다 우선순위 부여, 우선순위 높은 순으로 스케줄링
최단 작업 우선 스케줄링 - 작업 시간 짧은 순으로 우선순위 부여
최소 잔여 시간 스케줄링 - 남은 시간 짧은 순으로 우선순위 부여


아사(starvation) 현상
모든 우선순위 스케줄링 알고리즘의 근본적인 문제
우선순위 낮은 프로세스의 실행이 계속 연기되는 현상
우선순위 높은 프로세스 실행하느라 우선순위 낮은 프로세스 실행을 못함
해결책

에이징(aging): 대기시간이 길어지면 점차 우선순위를 높이는 방식

 

다단계 큐 스케줄링(MLQ)

우선순위별로 준비 큐를 여러개 사용하는 스케줄링
프로세스 유형 별로 큐 구분 가능
큐 별로 다른 스케줄링 알고리즘 적용 가능
큐 별로 다른 타임 슬라이스 적용 가능
기본적으로 프로세스는 큐 간의 이동 불가능 -> 아사 현상 발생

 

다단계 피드백 큐 스케줄링(MFQ)

프로세스가 큐 간의 이동 가능
높은 우선순위 큐에 삽입, 실행이 끝나지 않을 경우 낮은 우선순위 큐에 삽입
에이징 적용
CPU bound, I/O bound 프로세스 구분 가능

 

리눅스 스케줄링

리눅스 스케줄링 정책
실시간 정책 스케줄링(우선순위 높음)

  • SCHED_FIFO
  • SCHED_RR

일반 정책 스케줄링(우선순위 낮음)

  • SCHED_OTHER/SCHED_NORMAL
  • SCHED_BATCH
  • SCHED_IDLE

CFS(Completely Fair Scheduler)
비실시간 프로세스를 대상으로 하는 스케줄링 방식

vruntime(virtual runtime)
프로세스가 그 동안 실행한 시간을 정규화한 정보
vruntime이 작은 프로세스를 다음 실행할 프로세스로 삼음
(vruntime 별 태스크를 고르는 과정에서 RB tree 사용)

타임슬라이스
nice 값에 비례해 가중치 할당, 가중치를 바탕으로 타임 슬라이스 할당

nice

사용자 영역에서 설정한 프로세스 우선순위
사용자 영역에서의 값은 -20~19
커널 영역에서의 값은 0~139

  • 실시간 스케줄링되는 프로세스: 0~99
  • CFS 프로세스: 100~139

nice -n [우선순위] [program]
새 프로세스를 실행할 때 해당 프로세스의 우선순위 부여 가능
기본적으로 설정된 nice 값은 0


renice [우선순위] [PID]
이미 실행 중인 프로세스의 우선순위 부여

 

동기화와 교착상태

프로세스 동기화
동시다발적으로 실행되는 프로세스 실행 순서와 자원의 일관성을 보장해야한다.


운영체제가 제공하는 동기화의 의미

  • 실행 순서 제어: 프로세스를 올바른 순서로 실행하기
  • 상호 배제: 동시에 접근해서는 안되는 자원에 하나만 접근하기 

공유 자원과 임계 구역

  • 공유 자원: 공동의 자원(ex 파일, 전역 변수, 입출력장치 등)
  • 임계 구역: 동시에 접근하면 문제가 발생할 수 있는 공유 자원에 접근하는 코드

레이스 컨디션(race condition)

임계 구역을 동시에 실행하여 자원의 일관성이 깨지는 현상

 

생산자와 소비자 문제
동기화가 이루어지지 않았을 경우 발생할 수 있는 문제를 보여주는 고전적 문제

  • producer: 생산을 하는 프로세스
  • consumer: 소비를 하는 프로세스

 

동기화 해결의 세가지 원칙

1. 상호 배제
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 대기해야 함


2. 진행
어떤 프로세스도 임계 구역에 진입하지 않았다면 진입이 가능해야 함


3. 유한 대기
한 프로세스가 임계 구역 진입을 위해 대기하고 있다면 언젠가 진입이 가능해야 함

뮤텍스 락
자물쇠 역할: 프로세스들이 공유하는 전역변수 lock
자물쇠 잠그기: acquire 함수 lock이 true인지 아닌지 확인 -> 임계 구역 진입 가기전에 쓰는 함수라 볼 수 있음 -> 바쁜 대기

  • 바쁜 대기: 임계 영역(critical area)에서 작업 중인 스레드 B를 기다리는 스레드 A가 있음. 이때, A는 B가 끝날 때까지 즉, 임계 영역에 들어갈 수 있을 때까지 아무 작업도 하지 않고 임계 영역에 접근이 가능한지 무한으로 검사만 하고 있는 현상

자물쇠 열기: release 함수 임계 구역 작업이 끝나면 잠금 해제

세마포
뮤텍스 락은 기본적으로 공유 자원이 하나일 경우 상정
세마포는 공유 자원이 여러 개 있을 경우도 동기화 가능
가라는 신호를 받으면 임계 구역에 진입해도 좋다
멈추라는 신호를 받으면 임계 구역에 진입해서는 안된다
변수 S: 임계 구역에 진입할 수 있는 포르세스의 개수(사용 가능한 공유 자원의 개수)
wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
signal 함수: 임계 구역 앞에서 기다리는 프로세스에게 이제 가도 좋다고 신호를 주는 함수

프로세스 상태 전이 활용
무한 반복 확인 즉 바쁜 대기를 대기 상태로 바꾼 것

실행 순서를 위한 동기화

먼저 실행할 프로세스 뒤에 signal

나중에 실행할 프로세스 앞에 wait

 

조건 변수와 모니터
사용이 간편한 동기화 도구, 모니터
공유 자원에 접근하기 위한 인터페이스를 따로 둠
인터페이스를 통해서만 접근(상호 배제)
실행 순서 제어를 위한 동기화를 위해 조건 변수 사용
wait(), signal() 연산이 가능한 특별한 변수
wait(): 호출한 프로세스를 대기 상태로 전환
signal(): 호출한 프로세스를 깨움

조건 변수를 활용한 실행 순서 제어
아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행 중단
실행될 조건이 충족되었을 때에는 signal을 통해 실행 재개

 

교착상태

일어나지 않을 사건(필요한 자원의 할당)을 기다리면 무한히 대기하는 현상 -> 데드락
ex) 식사하는 철학자 문제

교착 상태 발생 조건 (반드시 x, 확률이 높다)

  • 상호 배제: 동시에 자원 사용이 불가능한 경우
  • 점유와 대기: 자원을 할당받은 채 다른 자원의 할당을 기다리는 경우
  • 비선점: 강제로 자원을 빼앗을 수 없는 경우
  • 원형 대기: 자원을 원형으로 대기할 경우 (ex 식사하는 철학자 문제)

교착상태 해결 방법

교착 상태 예방
교착 상태 발생 조건 네 가지 중 하나를 없애는 것

교착 상태가 발생 배경 원천 차단
교착 상태가 발생하지 않음을 보장할 수 있지만, 여러 부작용이 따르는 방식

  • 상호 배제 조건 없애기
    자원을 공유 가능하도록 변경
    모든 자원에 대해 적용할 수 없음
  • 점유와 대기 조건 없애기
    특정 프로세스에 자원을 모두 할당, 아예 할당하지 않기
    자원의 활용률 저하
  • 비선점 조건 없애기
    선점하여 사용 가능한 자원에 대해서는 효과적(ex CPU)
    모든 자원에 대해 적용 가능한 것은 아님(ex 프린터기)
  • 원형 대기 조건 없애기
    자원에 번호 매기기
    오름차순으로 자원 할당
    현실적으로 쉽지 않음, 자원의 활용률 저하


교착 상태 회피
교착 상태가 발생하는 이유를 자원의 무분별한 할당으로 간주
교착 상태가 발생하지 않을 정도로만 조금씩 자원을 할당하는 방법
교착상태가 발생할 수 있는지 없는지를 판단하는 알고리즘 (ex 은행원 알고리즘)

교착 상태 검출 후 회복
교착 상태가 발생하면 그때 회복하는 방식
선점을 통한 회복
프로세스 강제 종료를 통한 회복

교착상태 무시하는 방법도 있긴하다.
ex) 타조 알고리즘(교착 상태가 될 확률이 낮으면 무시)

 

가상 메모리 관리

스와핑(swapping)
프로세스를 보조기억장치의 일부 영역으로 쫓아내고 당장 필요한 프로세스를 적재하는 메모리 관리 기법


스왑 아웃(swap-out)
프로세스를 보조기억장치의 일부 영역으로 쫓아내는 것


스왑 인(swap-in)
스왑 아웃된 프로세스를 메모리에 적재하는 것


스왑 영역
스왑 아웃된 프로세스가 적재되는 보조기억장치 영역
top, free로 볼 수 있음

연속 메모리 할당

메모리에 연속적으로 배치하는 방식
부작용
외부 단편화: 프로세스들이 실행되고 종료되길 반복하며 빈 공간이 생기는 메모리 낭비 현상
해결책
페이징

 

페이징
물리 메모리를 프레임이라는 일정한 크기로 나누고
프로세스를 페이지라는 일정한 크기로 나눈 뒤
페이지를 프레임에 매핑하는 메모리 관리 방식
페이지 아웃, 페이지 인

부작용
내부 단편화: 프로세스 내부에서 일어나는 메모리 낭비 -> 프로세스 마지막 페이지의 크기가 페이지 단위에 딱 맞아떨어지 않을 수 있음

가상 메모리
프로세스의 일부만을 적재하여 실제 물리 메모리보다 큰 프로세스를 실행하는 기술
페이징은 현대 운영체제에서 가장 대중적으로 사용되는 가상 메모리 관리 기법

세그멘테이션
프로세스를 유의미한 단위로 나누는 것->일정한 크기로 자르지 않기 때문에 외부 단편화가 발생할 수도 있음

페이지 테이블
프레임과 페이지의 매핑 정보를 담고있는 표 형태의 데이터
프로세스마다 페이지 테이블을 가지고 있음

페이지 테이블 베이스 레지스터(PTBR)
각 프로세스의 페이지 테이블 위치를 가리키는 레지스터

페이지 테이블은 어디에 있는 것이 좋을까?
TLB(Translation Look-aside Buffer)
페이지 테이블의 캐시 메모리
페이지 테이블 내 정보

  • 유효 비트(valid bit)
    접근하려는 페이지가 보조기억장치에 있는가? 메모리에 있는가?
    접근하려는 페이지가 보조기억장치에 있을 경우: 페이지 폴트(page fault)
    1. 작업 내역 백업
    2. 페이지 폴트 루틴 실행 -> 접근하려는 페이지 적재
    3. 유효 비트 1로 변경
    4. 접근하려는 페이지 접근
  • 보호 비트(protection bit)
    접근하려는 페이지의 권한 (rwx)
  • 참조 비트(reference bit)
    접근한 적 있는 페이지인가?
  • 수정 비트(modify bit/ dirty bit)
    쓰기 작업을 한 적 있는 페이지인가?

계층적 페이징

페이지 테이블 크기 줄이기
페이지 테이블의 페이지 테이블

 

요구 페이징
처음부터 모든 페이지를 적재하지 않고
페이지 폴트가 발생하면 그 때 페이지를 적재한다.

순수 요구 페이징
아무 페이지를 적재하지 실행
첫 명령어 실행부터 페이지 폴트 발생
적당한 페이지가 적재된 이후부터 페이지 폴트 감소

페이지 폴트는 적게 발생하는 것이 좋다

스래싱
프로세스 실행 시간보다 페이징에 더 많은 시간이 소요되는 문제
지나친 페이지 폴트로 인해 페이지 교체에 너무 많은 시간을 소요하여 성능이 저하되는 문제
-> 동시 실행되는 프로세스 수를 늘린다고 해서 반드시 CPU 이용률이 비례하여 높아지는 것이 아님

페이지 폴트를 줄이려면?
보조기억장치로 내보낼 페이지 / 메모리에 적재할 페이지를 잘 선별하면 된다.
-> 페이지 교체 알고리즘

 

페이지를 관찰할 수 있는 명령어: cat/proc/meminfo, top, free, vmstat

 

페이지 교체 알고리즘

메모리에 적재된 페이지 중 페이지-아웃시킬 페이지를 선정하는 방법
좋은 페이지 교체 알고리즘은 페이지 폴트를 적게 일으키는 알고리즘

페이지 참조율

CPU가 참조하는 페이지 중 연속된 페이지를 생략한 페이지열
ex) 참조한 페이지 2223555337 -> 페이지 참조열 23537

 

FIFO 페이지 교체 알고리즘

가장 먼저 메모리에 적재된 페이지부터 페이지-아웃
문제점: 초기에 적재된 페이지 중 프로그램 실행 내내 유지할 데이터가 있을 수 있음

 

2차 기회 FIFO 페이지 교체 알고리즘

FIFO 페이지 교체 알고리즘의 변형
기본적으로 가장 오래 메모리에 머물렀던 페이지부터 페이지-아웃
다만 참조 비트가 1일 경우, 이를 0으로 변경 후 한번 더 기회 부여
참조 비트가 0일 경우 페이지-아웃

 

최적 페이지 교체 알고리즘

단순하게 생각했을 때, 메모리에서 페이지-아웃되어야 할 페이지는 앞으로 쓸 일이 잘 없는 페이지
앞으로의 사용 빈도가 가장 낮은 페이지부터 교체하는 알고리즘
가장 낮은 페이지 폴트 빈도율을 보장하는 알고리즘
문제점: 앞으로 CPU가 어떤 페이지를 얼마나 참조할지 예측하기란 매우 어려움


이론적으로 페이지 교체 알고리즘의 성능을 평가할 때 주로 사용되는 알고리즘

 

LRU 페이지 교체 알고리즘

가장 적게 참조할 페이지는 예측하기 어려워도
가장 적게 참조한 페이지는 계산하기 쉽다
최근에 사용되지 않은 페이지를 페이지-아웃

 

쓰기 시 복사(copy-on-write)

복제 프로세스를 생성할 경우 이를 중복 저장하지 않고
동시에 프로세스 간의 자원을 공유하지 않게끔 하는 방법
자식이나 부모 프로세스가 쓰기를 할 때만 복사 -> 해당 페이지만 복사


쓰기 시 복사를 사용하지 않을 때
프로세스를 fork하면 동일한 프로세스 두 개가 메모리에 복제된다
그 이유는 프로세스끼리는 기본적으로 자원을 공유하지 않기 때문이다
-> 메모리 공간 낭비, 프로세스 생성 시간 낭비

 

파일 시스템

파일과 디렉터리를 관리하는 커널의 한 부분
다양한 파일 시스템이 있고, 여러 파일 시스템을 동시에 사용할 수 있음

파일
보조기억장치의 의미있는 정보의 집합

  • 이름
  • 실행하기 위한 정보
  • 메타 데이터/ 속성 -> stat으로 확인 가능

속성

  • 유형(확장자)
  • 크기
  • 생성 날짜
  • 마지막 접근 날짜
  • 마지막 수정 날짜
  • 생성자
  • 소유자
  • 위치

파일(+ 디렉터리) 접근 단위: 블록(block)
섹터 단위로 접근하지 않음 -> 보조 기억 장치

디렉터리는 계층적 구조
루트 디렉터리 / 최상위 폴더
절대 경로와 상대 경로

많은 운영체제는 디렉터리를 파일과 동일하게 간주한다
디렉터리 구성 정보 -> 디렉터리 테이블

  • 파일 이름
  • 위치를 유추할 수 있는 정보
  • (파일 속성) -> 파일 시스템에 따라 명시하는 것도 있음

 

파일 시스템을 이용하기 위한 준비

파일 시스템

파일과 디렉터리를 관리하는 커널의 한 부분
다양한 파일 시스템이 있고, 여러 파일 시스템을 동시에 사용할 수 있음
blkid -o list로 확인할 수 있음

보조기억장치 하나에 단일한 파일 시스템이 사용되는 것이 아니다
파티셔닝(aprtitioning): 보조기억장치의 영역을 구획하는 작업
파티션(partition): 보조기억장치에서 구획된 영역

포매팅파일 시스템을 만드는 작업
mkfs -t [파일시스템] [디바이스]

마운트(mount)
파일 시스템에 접근할 경로 결정
파일 시스템을 다른 파일 시스템에 편입

 

파일 시스템 만들고 연결하기

fdisk
파티션 표 조작

parted
파티션마다 어떤 파일 시스템으로 되어있는지 확인
리눅스에선 ext2 파일 시스템이 주로 쓰임

mkfs -t [파일시스템]
파일시스템 만듦
journal: 파일 시스템의 무결성을 보장하기 위한 것

mount [디바이스] [마운트할 경로]
umount [디바이스]

/etc/fstab
마운트 정보를 넣어두면 리부팅해서 마운트가 유지

 

파일 시스템 종류와 특성

FAT 기반 파일 시스템
FAT(File Allocation Table)를 활용하는 파일 시스템

※ FAT

  • 파일이 어디에 할당되어 있는지 저장하는 표
  • 메모리 캐시에 저장됨

저용량 보조기억장치용 파일 시스템으로 이용
ex) USB 메모리, SD 카드
디렉터리 엔트리에 파일 속성 표현

아이노드 기반 파일 시스템(unix기반 파일 시스템)
아이노드라는 색인 블록을 활용한 파일 시스템
※ 색인 블록

  • 파일에 접근하기 위한 블록들에 대한 정보가 있는 특별한 블록

아이노드는 사실상 파일 이름 빼고 파일의 모든 것을 담고있음

아이노드의 사용량이 100%로 찼을 경우 데이터 영역에 용량이 남아 있어도 파일 생성 불가

ls -i, stat

아이노드 조회 가능
df -ih

아이노드 사용량 확인 가능

NTFS
윈도우 운영체제에서 주로 사용되는 파일 시스템

APFS
macOS, IOS, watchOS, tvOS에서 주로 사용되는 파일 시스템

ext2, ext3, ext4, xfs
리눅스 운영체제에서 주로 사용되는 파일 시스템
ext2빼고 나머지가 주로 사용됨

파일 시스템 특성을 판단하는 기준은 얼마나 큰 파일을 저장할 수 있는지 저널링 기능을 지원하는지임

저널링 파일 시스템(journaling file system)
파일 시스템에 크래쉬가 발생했을 때 빠르게 복구하기 위한 방법
1. 작업 직전 파티션의 로그 영역에 로그를 남긴다.
2. 로그를 남긴 후 작업을 수행한다.
3. 작업이 끝났다면 로그를 삭제한다.