📖 가상 메모리 개념 이해
✅ 가상 메모리가 필요한 이유
하나의 프로세스만 실행 가능한 시스템 예를 들어 배치 처리 시스템 같은 경우에는 가상 메모리가 필요가 없다. 하지만 여러 프로세스를 동시 실행하는 시스템 같은 경우에는 메모리 용량 부족 이슈나 프로세스 메모리 영역 간에 침범 이슈가 있을 수 있기 때문에 가상메모리가 필요하다.
✅ 가상 메모리란?
메모리가 실제 메모리보다 많아 보이게 하는 기술
실제 사용하는 메모리는 작다는 점에 착안해서 고안된 기술
프로세스 간 공간 분리로, 프로세스 이슈가 전체 시스템에 영향을 주지 않을 수 있음
가상 메모리 콘셉트
프로세스는 가상 주소를 사용하고, 실제 해당 주소에서 데이터를 읽고 쓸 때만 물리 주소로 바꿔주면 된다.
- virtual address (가상 주소) : 프로세스가 참조하는 주소
- physical address (물리 주소) : 실제 메모리 주소
📌 MMU(Memory Management Unit)
주소를 두 개를 나누어 가상 주소와 물리 주소를 가지게 되는데 이 두 개를 중간에 맵핑하는 로직이 있다. 그 로직을 담당하는 게 MMU라 한다.
CPU에 코드 실행 시, 가상 주소 메모리 접근이 필요할 때, 해당 주소를 물리 주소값으로 변환해 주는 하드웨어 장치이다.
📌가상메모리와 MMU
프로그램을 실행시켜서 프로세스화 된다고 해도 프로세스의 모든 데이터가 메모리에 들어가는 것은 아니며, 그중에서 지금 CPU가 필요로 하는 데이터 조각만 메모리에 넣고 그 주소를 찾아주는 것은 MMU 하드웨어 장치를 통해 물리 메모리에 접근해 찾는다.
💡 MMU 하드웨어 장치를 이용하는 이유
하드웨어 장치를 이용해야 주소 변환이 빠르기 때문에 별도 장치를 둔다.
📖 페이징 시스템 개념 이해
✅ 페이징 시스템(paging system)
크기가 동일한 페이지로 메모리에 올렸다 내렸다 하면서 가상메모리와 물리주소를 매핑하는 알고리즘
페이징(paging) 개념
크기가 동일한 페이지로 가상 주소 공간과 이에 매칭하는 물리 주소 공간을 관리
하드웨어 지원이 필요
- Intel x86 시스템(32bit)에서는 4KB, 2MB, 1GB 지원
- 리눅스에서는 4KB로 paging
- 페이지 번호를 기반으로 가상 주소/물리 주소 매핑 정보를 기록/사용
✅ 페이지 시스템(paging system) 구조와 동작
가상 주소 v = (p, d) 라면
p : 가상 메모리 페이지 (페이지 번호)
d : p안에서 참조하는 위치 (변위)
해당 프로세스에서 특정 가상 주소 액세스를 하려면 해당 프로세스의 page table에 해당 가상 주소가 포함된 page 번호(p)가 있는지 확인하고 page 번호가 있으면 이 page가 매핑된 첫 물리 주소(p')를 알아내고 변위(d)를 더하면 실제 물리 주소(p' + d)가 된다.
페이지 테이블(page table)
물리 주소에 있는 페이지 번호와 해당 페이지의 첫 물리 주소 정보를 매핑한 표
가상 주소 v = (p, d) 라면
p : 페이지 번호
d : 페이지 처음부터 얼마 떨어진 위치인지
- 페이지 크기가 4KB 예
- 가상 주소의 0비트에서 11비트가 변위 (d)를 나타내고, 12비트 이상이 페이지 번호가 될 수 있다.
💡 프로세스가 4GB를 사용했던 이유
32bit 시스템에서 2의 32승이 주소로 표현한다면 4GB까지 표현할 수 있기 때문이다.
페이징 시스템과 MMU
CPU는 가상 주소 접근 시 MMU 하드웨어 장치를 통해 물리 메모리에 접근한다.
- 프로세스 생성 시, 페이지 테이블 정보 생성
- PCB등에서 해당 페이지 테이블 접근 가능하고, 관련 정보는 물리 메모리에 적재
- 프로세스 구동 시, 해당 페이지 테이블 base 주소가 CR3라는 레지스터에 저장
- CPU가 가상 주소 접근 시, MMU가 페이지 테이블 base 주소를 접근해서, 물리 주소를 가져옴
📖 가상 메모리를 위한 TLB 이해
✅ TLB란?
MMU가 물리 주소를 확인하기 위해 메모리를 갔다 와야 하는데 메모리 계층 구조상 MMU에서 메모리 접근에 CPU 측면에서는 상당한 시간이 걸린다. 그래서 시간을 줄이기 위해서 나온 게 TLB이다.
TLB(Translation Lokkaside Buffer) 페이지 정보 캐시라고 하며 TLB는 최근에 CPU가 요청한 가상 주소에 대한 물리주소 정보를 저장하고 있어 요청한 주소가 있는 경우 메모리에 접근하는 것보다 훨씬 빠르게 data 전달이 가능하다.
페이징 시스템과 공유 메모리 (IPC)
프로세스 간 동일한 물리 주소를 가리킬 수 있다 (공간 절약, 메모리 할당 시간 절약)
좀 더 상세히 말하자면, 모든 프로세스는 부모 프로세스가 있으나 최초의 프로세스를 실행시키는 건 운영체제이다.
프로그램을 실행하게 되면 프로그램의 구조를 똑같이 복사해서 해당 프로세스를 덮어씌우는 영역만 덮어씌워서 여러 개의 프로세스가 만들어지게 된다. 이렇게 복사하는 과정을 fork라고 표현한다.
fork를 통해 복사하게 되면 프로세스에서 커널과 관련된 영역은 동일하게 커널을 공유하기 때문에
공유하는 공간에 별도의 공간을 만들어서 서로 통신할 수 있게 하는 방식 IPC라고 한다.
📖 요구 페이징 개념 이해
✅ 요구 페이징(Demand Paging 또는 Demanded Paging)
프로세스 모든 데이터를 메모리로 적재하지 않고, 실행 중 필요한 시점에서만 메모리로 적재한다.
- 선행 페이징(anticipatory paging 또는 prepaging)의 반대 개념 : 미리 프로세스 관련 모든 데이터를 메모리에 올려놓고 실행하는 개념
더 이상 필요하지 않은 페이지 프레임은 다시 저장매체에 저장 (페이지 교체 알고리즘 필요)
페이지 폴트(page fault)
어떤 페이지가 실제 물리 메모리에 없을 때 일어나는걸 인터럽트라 한다.
운영체제가 page fault가 일어나면, 해당 페이지를 물리 메모리에 올린다.
인터럽트와 IDT
인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있음
- 어디에? IDT(Interrupt Descriptor Table)에 기록
- 언제? 컴퓨터 부팅 시 운영체제가 기록
- 어떤 코드? 운영체제 내부 코드
예를 들면,
- 항상 인터럽트 발생 시, IDT를 확인
- 시스템콜 인터럽트 명령은 0x80 번호가 미리 정의
- 인터럽트 0x80에 해당하는 운영체제 코드는 system_call()이라는 함수
즉, IDT에는 0x80 => system_call()와 같은 정보가 기록돼 있다.
💡 페이지 폴트가 자주 일어나면?
실행되기 전에 해당 페이지를 물리 메모리에 올려야 함 👉 시간이 오래 걸림
💡 페이지 폴트가 안 일어나게 하려면?
향후 실행/참조될 코드/데이터를 미리 물리 메모리에 올리면 됨 👉 앞으로 있을 일을 예측해야 함(신의 영역)
✅ 페이지 교체 정책 정리
페이지 교체 정책 (page replacement policy)
최대한 페이지 폴트가 적게 일어나기 위해 방법을 모색했다.
💡 운영체제가 특정 페이지를 물리 메모리에 올리려 하는데, 물리 메모리가 다 차있다면?
기존 페이지 중 하나를 물리 메모리에서 저장 매체로 내리고(저장) 새로운 페이지를 해당 물리 메모리 공간에 올린다.
✅ 페이지 교체 알고리즘
- FIFO
- 가장 먼저 들어온 페이지를 내린다
- OPT
- 최적 페이지 교체 알고리즘 (OPTimal Replacement Algorithm)
- 앞으로 가장 오랫동안 사용하지 않을 페이지를 내린다
- 일반 OS에서는 구현 불가
- LRU
- Least Recently Used
- 가장 오래전에 사용된 페이지를 교체
- OPT 교체 알고리즘이 구현이 불가하므로, 과거 기록을 기반으로 시도
- 페이지 스왑 알고리즘
- LFU
- Least Frequently Used
- 가장 적게 사용된 페이지를 내린다
- NUR
- LRU와 마찬가지로 최근에 사용하지 않은 페이지부터 교체하는 기법
- 각 페이지마다 참조 비트(R: 읽는 것), 수정 비트(M: 수정한 것)를 둠 (R, M)
- (0, 0), (0, 1), (1, 0), (1, 1) 순으로 페이지 교체
- LFU
📖 파일 시스템 개념 이해
✅ 파일 시스템
운영체제가 저장매체에 파일을 쓰기 위한 자료구조 또는 알고리즘
✅ 파일 시스템이 만들어진 이유
파일
0과 1의 데이터를 어떻게 저장매체에 저장할까?
- 비트로 관리하기는 오버헤드가 너무 큼
- 블록 단위로 관리하기로 함 (보통 4KB)
- 블록마다 유효 번호를 부여해서, 관리
- 사용자가 각 블록 고유 번호를 관리하기 어려움
- 추상적 객체 필요 : 파일
- 사용자는 파일단위로 관리
- 각 파일에는 블록 단위로 관리
저장 방법
- 저장매체에 효율적으로 파일을 저장하는 방법
- 가능한 연속적인 공간에 파일을 저장하는 것이 좋음
- 외부 단편화, 파일 사이즈 변경 문제로 불연속 공간에 파일 저장 기능 지원 필요
- 블록체인 : 블록을 링크드 리스트로 연결(우리가 요새 자주 듣는 블록체인 사업 아님)
- 끝에 있는 블록을 찾으려면, 맨 처음 블록부터 주소를 따라가야 함
- 인덱스 블록 기법 : 각 블록에 대한 위치 정보를 기록해서, 한 번에 끝 블록을 찾아갈 수 있도록 한다.
Windows : FAT, FAT32, NTFS
- 블록 위치를 FAT라는 자료구조에 기록
리눅스(UNIX 계열) : ext2, ext3, ext4
- 일종의 인덱스 블록 기법인 inode 방식 사용
가장 기본이 되는 파일 시스템 방식은 inode 방식이다.
파일 시스템과 파일 관련 함수 및 시스템 콜
- 동일한 시스템콜을 사용해서 다양한 파일 시스템 지원 가능토록 구현
- read/write 시스템 콜 호출 시, 각 기기 및 파일 시스템에 따라 실질적인 처리를 담당하는 함수를 호출하는 방식으로 내부 구현됨
- 운영체제가 제공하는 시스템 콜을 기반으로, 각 언어에서 해당 시스템콜을 호출하도록 라이브러리등을 제공함
'CS(Computer Science)' 카테고리의 다른 글
[CS] 가상머신과 운영체제 이해 (0) | 2023.03.01 |
---|---|
[CS] inode 파일 시스템 구조 이해 (0) | 2023.03.01 |
[CS] 스레드(thread) 간략 정리 (0) | 2023.02.22 |
[CS] 프로세스 구조 이해 (0) | 2023.02.19 |
[CS] 운영체제 스케줄링 기본 및 알고리즘 이해 (0) | 2023.02.19 |
댓글