CS

[운영체제]리눅스 파일시스템과 메모리관리

그레고리력 2021. 7. 5. 22:50

리눅스 파일시스템


파일이란?

  • 컴퓨터에서 의미 있는 정보를 담은 논리적인 단위, 실행파일과 데이터파일로 나뉨
  • 파일시스템 : 파일들을 관리하기 위한 시스템

파일의 할당

  • 블록 : 하드디스크와 데이터를 주고받을 때 사용되는 논리적인 단위보통 4kb)
  • 메타데이터(inod 블록으로 저장), 데이터
  • 파일의 접근, 파일의 경로, 파일의 이름
  • 디렉토리도 파일의 일종
  • 링크 : 다른 디렉토리에서 같은 파일에 접근, 심볼릭 링크(원본파일 경로 저장, 윈도우 바로가기), 하드링크(원본과 구분이 어려움)
  • 파일의 보호 : Access control List, 접근권한 비트(9비트로 관리)→소유자,그룹,기타, rwxr-xr—, 111101100, 754
  • 파일의 일관성
  • fsck, file system checker- 복구가 불가능한 경우가 있으며 모든 디렉토리 탐색으로 느림
  • 저널링 : inode나 비트맵 수정 시 로그로 남김, 로그를 기준으로 일관성을 유지

리눅스 메모리관리


메모리

  • 가상메모리 : 프로세스는 0번지 부터 시작하는 자기 자신만의 메모리 주소 공간을 가정함. 이를 가상메모리라 하고 일부는 물리적 메모리에, 일부는 디스크의 스왑 영역에 존재한다.
  • 운영체제, 프로세스 등 CPU를 점유하기 위해 대기중인, 주소로 인덱싱하는 커다란 배열
  • 주로 메인메모리(RAM)을 뜻함, 프로세스는 메모리에 적재되어야 CPU에 의해 작업할 수 있음, 유일한 작업공간
  • Symbolic address(int a 등 프로그래머가 작성한 변수) → 컴파일러 → logical address(00 .. 19): 각 프로그램마다 같은 논리주소를 가지고 있음
  • 가상주소(논리주소) → physical address(물리주소) : 하드웨어에 올라가는 위치
  • CPU가 논리주소만을 읽음
  • Memory management unit : 하드웨어, 프로그램의 시작주소를 가진 base register, 마지막 limit register, base register + 논리주소 → 물리주소를 알게 해줌, Limit register로 프로세스가 요청하는 논리주소가 물리주소 유효범위에 맞는지 확인함, 범위가 넘어가는 경우 운영체제에게 CPU를 넘김, 이후 운영체제에서 에러처리
  • Swapping: 메모리 관리를 위해 메모리에 적재된 프로세스를 하드디스크로 잠시 옮겨놓는 것

프로세스간 페이지 공유

  • 프로세스들이 메모리를 공유하는 것을 가능하게 하고(시스템 라이브러리 등), 프로세스들은 공유 메모리를 통해 통신할 수 있음
  • 각 프로세스들은 각자 자신의 주소 공간처럼 인식하지만, 실제 물리 메모리는 공유되고 있음
  • fork()를 통한 프로세스 생성 과정에서 페이지들이 공유되는 것을 가능하게 함

메모리 할당


단편화

  • 프로세스들이 메모리에 적재, 제거되는 일이 반복되면, 프로세스들이 차지하는 메모리 틈 사이에 사용 하지 못할 만큼의 작은 자유공간들이 늘어나게 되는것
  • 내부단편화 : 프로세스가 사용하는 메모리 공간 에 포함된 남는 부분. 빈 공간이 50MB인데 프로세스 메모리가 30MB일 때 남은 빈 공간
  • 외부단편화 : 물리 메모리(RAM)에서 사이사이 남는 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을때 발생, 메모리 공간 50 + 50MB이지만 필요 메모리(프로세스)가 70MB일 때

페이징

  • 외부단편화 문제는 해결하지만 페이징은 내부단편화문제는 해결하지 못 함
  • 물리적인 메모리 공간을 동일한 크기로 나눔(frame) → 프로그램(프로세스 논리메모리)을 frame과 동일한 크기로 자름(page) → 최소한의 페이지만 메모리에 옮기고 나머지는 swap공간에 저장해둠(페이징기법), 별도의 페이지테이블을 사용함, 페이지테이블을 메모리에 저장함(메모리 낭비)
  • shared page를 사용함
  • TLB(캐시메모리, 하드웨어) : 테이블페이지를 위해 메모리에 2번 접근하지 않기 위해 캐시메모리로 이용(paging with tlb)
  • 물리주소를 논리주소로 변환하기 위해 tlb, mmu 등의 지원을 받음
  • 운영체제의 역할 : 가상 메모리(물리메모리 + 하드디스크 스왑공간)로 사용자 프로세스 속이기, IO 장치 관리
  • page fault : cpu가 요청하는 페이지가 tlb와 메모리에 없는 경우 프로세스 일시 정지 후 운영체제가 cpu 점유, 이유를 체크하고 스왑공간에서 페이지를 메모리로 가져오고 tlb에 주소 등록, 페이지테이블에도 등록 → 스왑공간에서 페이지를 가져오는 시간이 길기 떄문에 다른 프로세스로 cpu가 넘어갈 수 있고 이럴 경우 기존 프로세스는 대기큐에 들어감.
  • page replacement : 운영체제는 lru를 활용하기 어려움(참조시점 정보를 다 알기 어려움) → clock 알고리즘(페이지마다 한개의 reference bit을 갖게 해 프로세스로부터 참조되면 비트가 1로 올라감, 운영체제는 1비트를 0으로 내리고 0을 만나면 그 페이지를 교체시킴), 이 비트는 페이지 테이블에 저장됨(하드웨어의 도움을 받음), 페이지테이블의 dirty bit을 참조해 변경된 점이 있는지 살피고 반영한다.
  • 페이지 교체 알고리즘 : FIFO 페이지 교체, 최적 페이지 교체(Optimal Page Replacement), LRU 페이지 교체(Least-Recently-Used Page Replacement), LFU 페이지 교체(Least Frequently Used Page Replacement), MFU 페이지 교체(Most Frequently Used Page Replacement)

Thrashing

  • (메모리 영역에 접근하게 될 때, 메모리에 페이지 부재(=페이지 폴트(Page fault)율이 높은 것을 의미하며, 심각한 성능 저하를 초래) →working set 알고리즘(프로세스마다 특정 시간동안 참조되는 페이지의 개수를 파악, 프레임이 확보되면 그 때 페이지를 메모리에 올림), page fault frequency 알고리즘 : Page-fault rate의 상한값과 하한값을 두고, Page fault rate 상한값을 넘으면 frame을 더 할당 Page fault rate 하한값 이하면 할당 frame 수를 줄인다
  • 메모리가 고갈되면 프로세스들의 swap 현상이 늘어나면서 CPU 가동률 감소→ 운영체제가 프로세스 추가, 쓰레싱 발생 → 스레싱이 해소되지 않을 경우 out of memory로 판단 중요도가 낮은 프로세스 강제 종료

참고


Segmentation(세그멘테이션)

  • 논리 메모리와 물리 메모리를 서로 다른 크기의 논리적 단위인 세그먼트(Segment)로 분할, 사용자가 두 개의 주소로 지정(세그먼트 번호 + 변위)
  • 세그먼트 테이블에는 각 세그먼트의 기준(세그먼트의 시작 물리 주소)과 한계(세그먼트의 길이)를 저장
  • 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면 외부 단편화문제가 생김

Demand Paging(요구 페이징)

  • 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략
  • 프로세스 내의 개별 페이지들은 페이저(pager)에 의해 관리