메인 메모리 관리
1. 운영체제에 중요한 2가지
- 프로세스 관리
- 메모리 관리
- 메모리를 효과적으로 사용하는 방법 : 1) 메모리 낭비 없애기 2) 가상 메모리
2. 메모리 구조
- cpu가 os에게 난 10번지의 메모리를 읽을거야 : 주소 address
- os는 10번지의 데이터를 보내준다 : 데이터 data
- cpu는 계산결과를 다시 10번지로 보내준다 : 데이터버스의 양방향성
- 메모리는 주소 + 데이터로 구성되어있다.
3. 프로그램 단계
- 원천파일 : 자바나 C 같은 고급언어로 만든 파일
- 컴파일러 / 어셈블러를 통해 원천파일을 목적파일로 변경
- 링커 : 데이터베이스에 있는 라이브러리를 가져오는 것이나, 다른 목적파일을 하나로 합치는 것
- 실행파일 : 링커를 통해 만들어진 결과물(.exe)
- 로더 : 실행파일(메인함수)를 메모리에 올리는 작업 (OS를 올리는것 부팅)
4. 프로그램 실행시 구조
- 구조 : code + data + stack
- code : 우리가 짠 코드 (A와 B중 누가 더 커)
- data : 값(A, B)
- stack : 함수 호출했을때 돌아오는 주소
5. 프로그램을 메모리에 올리기
- 항상 동일한 메모리 주소값에 같은 프로세스를 실행시킬 수 없다.
- MMU(memory management unit) 사용 : 재배치 레지스터를 사용(cpu는 0번지를 바라보고 있지만,OS에서 relocation 레지스터에 실제로 올라온 주소의 값으로 변경)
- mmu : base + limit + relocation 레지스터
- cpu가 바라보는 주소 : 논리주소
- mmu의 relocation레지스터를 통해 변경된 주소 : 물리주소(메모리의 실제 주소)
메모리 낭비 방지
1. 동적 적재
- 프로그램 실행에 반드시 필요한 루틴/데이터만 적재
- 실행시 필요하면 그때 해당 부분을 메모리에 올린다((함수(루틴) : 오류처리, 데이터 : 배열)
2. 동적 연결
- 링커를 실행파일 만들기전 실행하기 전 하는것이 아니라(정적 연결), 실행파일이 실행이 되고 링커(동적 연결)
- 여러 프로그램에서 공통 사용되는 라이브러리를 메모리를 중복으로 올리는것을 방지
- 공통으로 사용되는 라이브러리를 메모리를 별도로 올려 실행 중 필요하면 링킹
3. 스와핑
- 메모리에 적재되어 있으나, 현재 사용되지 않고 잇는 프로세스 이미지
- 하드디스크에 별도의 공간을 만들어 스와핑된 이미지를 저장함(backing store / swap device , 크기는 메모리의 크키 만큼(OS 제외))
- 하드디스크에 저장되고 있는 실행파일과 스와핑된 실행파일(데이터가 변경되어있을수도 있다.)은 다르다.
- swap-out된 실행파일이 swap-in이 되면 메모리주소가 바뀌므로 OS가 mmu relocation 레지스터의 주소값을 변경
연속 메모리 할당
1. 메모리의 상태
- 부팅 직후 : OS + big single hole(비워 있는 상태)
- 프로세스 생성 및 종료 반복 : 산발된 메모리의 상태(부분 부분 비워져 있는 상태)
- 메모리의 단편화
- hole들이 불연속하게 흩어져 있기 때문에 프로세스 적재 불가능
- 외부 단편화 발생(사용안되는 메모리 부분 발생)
2. 초기 메모리 단편화 해결 방법
- First-fit (최초 적합) : 낮은 주소부터 찾아서 빈곳을 찾아 실행
- Best-fit (최적 적합) : hole의 크기를 비교해서 가장 적합한 크기에서 실행
- Worst-fit (최악 적합) : 최적 적합이랑 반대 (hole의 크기와 가장 안 맞는 곳)
- Compaction : 흩어져 있는 hole들을 한곳으로 모은다
3. Paging - 페이징
- 프로세스를 일정한 크기로 자른다 => 페이지
- 메모리를 일정한 크기로 자른다(프로세스를 자른 크기와 동일) => 프레임
- 연속되게 보이기 위해 CPU를 속여야 한다! HOW mmu relocation 레지스터를 여러개를 달아주자 => 페이지 테이블
- mmu : base + limit + relocation + relocation + relocation+.... => base + limit + page table
- 페이징을 통해 외부단편화 해결 => 메모리 100% 사용
4. 페이징 주소변환
- 논리주소 : p : 메모리 주소 , d : 페이징/프레임 크기
- 페이지 테이블에서 메모지 주소를 변경해서 논리주소가 물리주소로 변경(단, d는 변하지 않는다.) -