1️⃣논리 메모리와 물리 메모리
- 논리 메모리 영역(=가상 메모리 영역): 프로세스가 보는 메모리 영역
- 논리 주소(=가상 주소): CPU가 프로세스를 실행하며 보는 주소 값
- 물리 메모리 영역(RAM): 실제로 사용되는 메모리 영역
- 물리 주소: 실제 메모리에서 사용되는 주소 값
-> 메모리 관리 장치(MMU): CPU에 위치해 논리 주소를 물리 주소로 변환시켜주는 역할을 함. CPU에서 메모리에 접근하기 전에 MMU를 거쳐 논리 주소에 해당하는 물리 주소를 얻음 -> 메모리 보호!
2️⃣ 연속 메모리 할당
: 멀티 프로세스 환경에서 여러 프로세스를 메모리에 연속적으로 로드하는 방법
(1) 고정 분할 방식: 메모리 영역을 분할한 뒤 각 영역에 프로세스 할당. 분할된 영역의 크기는 서로 다르며, 고정됨.
-> 문제점: 외부 단편화(더 큰 메모리가 들어가지 못하는 경우) -> 메모리 압축(= 메모리 집약. 메모리 공간을 재배치해서 가용 메모리 공간을 하나로 합치는 것)으로 해결 가능!, 내부 단편화(메모리 공간이 남는 경우)
(2) 가변 분할 방식: 할당할 프로세스의 크기에 따라 메모리 공간을 분할. 메모리 할당 알고리즘 이용
a. 최초 적합: 프로세스 크기만큼 비어 있는 메모리 공간을 찾아 차례대로 프로세스 로드(완전 탐색 x)
b. 최적 적합: 가용 메모리 공간 중 가장 작은 공간에 프로세스 할당(완전 탐색)
c. 최악 적합: 가용 메모리 공간 중 가장 큰 공간에 프로세스 할당(완전 탐색)
3️⃣ 비연속 메모리 할당
: 프로세스의 메모리 영역을 나눠서 메모리 공간에 저장하는 방법
(1) 페이징: 프로세스의 논리 메모리 영역과 물리 메모리 영역을 각각 일정한 크기의 페이지와 프레임으로 나눔. (둘의 크기는 동일). 페이지와 프레임에 각각 번호를 할당해 프로세스의 페이지와 메모리의 프레임을 매핑. 이 때, 페이지 테이블 사용.
+ 페이지 테이블: 각 프로세스의 PCB에 프로세스의 페이지 정보와 페이지에 매핑하는 프레임의 주소 값 저장.
👍장점: 페이지를 물리 메모리에 연속으로 할당할 필요가 없어서 외부 단편화 문제 해결 가능
👎단점: 프로세스 크기가 페이지 수로 나누어 떨어지는 것을 보장X -> 내부 단편화 문제 발생 가능 + 정보를 저장할 메모리공간 추가로 필요
(2) 세그먼테이션: 프로세스의 메모리 영역을 논리적 단위인 세그먼트로 분할해 메모리를 할당. 세그먼테이션 테이블을 사용해 세그먼트의 논리 주소를 물리 주소로 매핑함. 테이블엔 세그먼트별 시작 주소인 base와 세그먼트의 길이인 limit을 저장
👍장점: 단위별로 데이터를 보호하기 쉬움.
👎단점: 세그먼트의 크기가 불균등 -> 프로세스 할당/해제를 반복하는 과정에서 외부 단편화 문제 발생 가능성. 오버플로 발생시 다른 프로세스와 메모리 영역이 겹칠 수 있음 -> 그러면 둘 중 하나는 디스크로 스왑 아웃해야 함.
4️⃣ 가상 메모리
: 프로세스의 일부만 메모리에 로드하고, 나머지는 디스크에 둔 상태로 프로세스를 실행하는 방식. -> 더 많은 프로세스를 메모리에 로드할 수 있음!
👍장점
(1) 프로그램이 메모리 크기에 대한 제약을 덜 받을 수 있음
(2) 동시에 많은 프로그램을 실행하므로 CPU 이용률과 처리율을 높일 수 있음
(3) 필요한 영역만 메모리에 로드해 스와핑 횟수를 줄여 프로그램 실행 속도를 높일 수 있음
5️⃣ 요구 페이징
: 프로세스에서 필요한 페이지만 메모리에 로드하는 방식. 초기에 필요한 영역만 로드한 후 다른 영역은 디스크에 저장해놓았다가 요청이 올 때 로드
- 페이지 폴트: 프로그램을 실행하다가 물리 메모리에 필요한 페이지가 없을 때
+ 페이지 폴트 발생 시 처리 과정
(1) 페이지 테이블에서 필요한 페이지가 물리 메모리에 있는지 확인. 없으면 i(invlid) 반환
(2) 참조하려는 페이지의 주소 값이 유효하지 않은지 or 메모리에 로드되지 않은 영역인지 판단
(3) 메모리에 로드되지 않은 영역이라면 디스크에서 해당 영역을 찾음
(4) 디스크에서 해당 페이지 영역을 스왑 인. 이때 물리 메모리에 비어 있는 프레임이 있으면 바로 로드. 없으면 페이지 교체 알고리즘으로 기존 페이지를 디스크로 스왑 아웃.
(5) 페이지테이블에서 새로 로드한 페이지의 값을 v(valid)로 변경
(6) 프로세스를 다시 실행
6️⃣스레싱
: 동시에 일정 수 이상의 프로그램을 실행했을 때 오히려 CPU 이용률이 떨어지는 상황
- 가상 메모리를 구현해 다중 프로그래밍을 하면 CPU 이용률이 높아지지만, 일정 수준 이상이면 페이지 폴트가 자주 일어남 -> 페이징이 자주 일어나 CPU 이용률이 떨어지는 스레싱 발생!
- 예방법: 워킹 세트(지역성을 기반으로 자주 사용하는 페이지를 저장해 두는 것)설정 -> 자주 사용하는 페이지를 물리 메모리의 프레임에 고정하면 페이지 폴트가 빈번하게 발생하는 현상 방지 가능!
7️⃣ 캐시 메모리
: CPU와 메인 메모리 간에 데이터 접근 시 속도 차이를 줄이기 위해 사용. 저장은 지역성을 바탕으로 결정.
-> 메인 메모리 데이터 중 자주 사용하는 데이터는 캐시 메모리에 따로 저장 -> 이후 캐시 메모리 접근 -> 속도 향상!
- 지역성: CPU가 자주 참조하는 데이터가 고르게 분포되지 않고 특정 부분에 몰려 있는 것.
(1) 시간 지역성: 최근 참조한 내용을 다시 참조할 가능성이 높다.
(2) 공간 지역성: 실제 참조한 주소 근처의 내용을 참조할 가능성이 높다.
'Cs' 카테고리의 다른 글
3. 데이터베이스 (0) | 2024.10.29 |
---|---|
2. 컴퓨터 네트워크 (0) | 2024.10.26 |
1. 운영체제(2) (0) | 2024.10.23 |
1. 운영체제(1) (0) | 2024.10.23 |
GET과 POST의 차이 (0) | 2024.10.15 |