[OS]운영체제_10
Updated:
메인 메모리 관리
OS에서 제일 중요한 기능
- 프로세스 관리 : CPU자원을 나눠줌
-
메인메모리 관리
- 메모리 역사
- Core memory : 반지모양의 철심에 자석모양을 나둬서 전기를 흘러보내는 방식
- 진공관 메모리
- 트랜지스터 메모리
- 집적회로 메모리: SRAM, DRAM
- 메모리 용량
- 1970년대: 8-bit PC 64KB
- 1980년: 16-bit IBM-PC 640KB > 1MB > 4MB
- 1990년: 수MB > 수십 MB
- 2000년~: 수백 MB > 수 GB
언제나 부족한 메모리
- 프로그램 변천
- 기계어/어셈블리어 작성
- C언어 작성
- 자바, 객체지향형 언어 작성
- 숫자 처리 > 문자 처리 > 멀티미디어 처리 > Big Data
- 메모리 용량 증가 vs 프로그램 크기 증가
- 언제나 부족한 메모리
- 어떻게 메모리를 효과적으로 사용할까?
- 메모리 낭비 없애기
- 가상 메모리 사용하기(virtual memory)
프로그램을 메모리에 올리기
- 메모리구조
- 주소(Address) + 데이터(Data)
- 프로그램 개발
- 원천파일(Source file) : 고수준언어 또는 어셈블리언어
- 목적파일(Object file) : 컴파일 또는 어셈블 결과
- 실행파일 (Executable file): 링크 결과
- 컴파일러 : 고수준언어를 오브젝트코드로 변환해주는 프로그램
- 링커 : 목적파일과 라이브러리를 연결해주는 프로그램
- 로드 : 실행파일을 메인메모리로 적재해주는 프로그램
- 어셈블러 : 어셈블리언어를 기계어로 만들어주는 프로그램
- 프로그램 실행
- code + data + stack
- 실행파일을 메모리에 올리기
- MMU(memory management unit)재배치 레지스터 사용 하여 재배치(CPU가 봤을때는 0번지이지만 OS가 relocation 레지스터값을 바꿔줌으로서 실제주소값으로 변경한다)
- cpu가 보내는 주소(논리주소) !== MMU를 통과해서 메인메모리를 들어간(물리주소)
- MMU : base + limit + relocation레지스터
메모리 낭비 방지
- 동적 적재(Dynamic Loading) : 프로그램 실행에 반드시 필요한 루틴/데이터만 적재
- 모든 루틴(함수 , 프로세스 등..)이 다 사용되는 것은 아니다(예 : 오류처리)
- 모든 데이터가 다 사용되는 것은 아니다(예 : 배열)
- 자바 : 모든 클래스가 다 사용되는 것은 아니다.
- 실행 시 필요하면 그때 해당 부분을 메모리에 올린다.
- 동적 연결(Dynamic Linking) : 여러 프로그램에 공통적으로 사용되는 라이브러리
- 공통 라이브러리 루틴(library routine)을 메모리에 중복으로 올리는것은 낭비
- 라이브러리 루틴 연결을 실행 시까지 미룬다.
- 오직 하나의 라이브러리 루틴만 메모리에 적재
- 다른 애플리케이션 실행시 이 루틴과 연결
- 공유 라이브러리(shared library) - Linux
- 동적 연결 라이브러리 (Dynamic Linking Library) - Windows
- Swapping : 메모리에 적재되어 있으나 현재 사용되지 않는 프로세스를 몰아냄
- 메모리 활용도 높이기 위해 Backing Store (=Swap device)로 몰아내기
- swap-out vs swap-in
- Relocation register 사용으로 적재위치는 무관
- 프로세스 크기가 크면 backing store 입출력에 따른 부담 크다
연속 메모리 할당
- 다중프로그래밍 환경
- 부팅 직후 메모리 상태: O/S + big single hole(비어져있는 상태)
- 프로세스 생성 & 종료 반복 ☞ scattered holes
- 메모리 단편화 (Memory fragmentation)
- Hole 들이 불연속하게 흩어져 있기 때문에 프로세스 적재 불가
- 외부 단편화 발생(external fragmentation) : hole들이 떨어져 있기때문에 프로그램이 못들어가는 상태발생
외부 단편화 최소화 방법
- 연속 메모리 할당 방식
- First-fit (최초 적합) : 메모리를 순차적으로 찾아 처음의 위치
- Best-fit (최적 적합) : 크기가 제일 비슷한곳
- Worst-fit (최악 적합) : 크기가 제일 안맞는곳에 넣음
- 할당 방식 성능 비교 : 속도
- 속도 : first-fit
- 이용률 : first-fit , best-fit
- 외부 단편화로 인한 메모리 낭비: 1/3 수준 (사용 불가)
- Compaction : 최적 알고리즘 없음, 고부담 (흩어져있는 hole들을 한곳으로 모음)
- 페이징 (Paging)
- 프로세스를 일정 크기(=페이지)로 잘라서 메모리에!
- 프로세스를 자른것을 페이지(page) > 프로세스는 페이지의 집합
- 메모리를 자른것을 프레임(frame) > 메모리는 프레임의 집합
- 페이지를 프레임에 할당
- MMU 내의 재배치 레지스터 값을 바꿈으로서
- CPU 는 프로세스가 연속된 메모리 공간에 위치한다고 착각
- MMU 는 페이지 테이블 (page table) 이 된다.
- 프로세스를 일정 크기(=페이지)로 잘라서 메모리에!
주소 변환 (Address Translation)
- 논리주소 (Logical address)
- CPU 가 내는 주소는 2진수로 표현 (전체 m 비트)
- 하위 n 비트는 오프셋(offset) 또는 변위(displacement)
- 상위 m-n 비트는 페이지 번호
- 주소변환: 논리주소 → 물리주소 (Physical address)
- 페이지 번호(p)는 페이지 테이블 인덱스 값
- p 에 해당되는 테이블 내용이 프레임 번호(f) – 변위(d)는 변하지 않음
-
페이지테이블을 기준으로 cpu는 논리주소로 연속하게 보이고 메인메모리로 들어갈때는 쪼개져서 들어감
- 보호와 공유
- 보호 (Protection): 해킹 등 방지
- 모든 주소는 페이지 테이블을 경유한다.
- 페이지 테이블 엔트리마다 r, w, x 비트 두어(read , write , execute)
- 해당 페이지에 대한 접근 제어 가능
- 공유 (Sharing): 메모리 낭비 방지
- 같은 프로그램을 쓰는 복수 개의 프로세스가 있다면,
- Code + data + stack 에서 code 는 공유 가능 (단, non-self-modifying code = reentrant code = pure code 인 경우 = 재 진입가능코드)
- 프로세스의 페이지 테이블 코드 영역이 같은 곳을 가리키게
- 보호 (Protection): 해킹 등 방지
- 세그멘테이션(Segmentation)
- 프로세스를 논리적 내용(=세그멘트)(code - data - stack)으로 잘라서 메모리에 배치!
- 페이징은 일정크기로 자름 , 세그먼테이션은 크기가 다르다.
- 프로세스는 세그멘트(segment)의 집합
- 세그멘트를 메모리에 할당
- MMU 내의 재배치 레지스터 값을 바꿈으로서
- CPU 는 프로세스가 연속된 메모리 공간에 위치한다고 착각
- MMU 는 세그멘트 테이블 (segment table) 이 된다.
- 주소 변환 (Address Translation)
- 논리주소 (Logical address)
- CPU 가 내는 주소는 segment 번호(s) + 변위(d)
- 논리주소 (Logical address)
- 주소변환: 논리주소 → 물리주소 (Physical address)
- 세그멘트 테이블 내용: base + limit
- 세그멘트 번호(s)는 세그멘트 테이블 인덱스 값
- s 에 해당되는 테이블 내용으로 시작 위치 및 한계값 파악
- 한계(limit)를 넘어서면 segment violation 예외 상황 처리
- 물리주소 = base[s] + d
- 보호와 공유
- 보호 (Protection): 해킹 등 방지
- 모든 주소는 세그멘트 테이블을 경유하므로,
- 세그멘트 테이블 엔트리마다 r, w, x 비트 두어
- 해당 세그멘트에 대한 접근 제어 가능
- 페이징보다 우월!(페이징은 일정크기로 자르기때문에 어떤부분은 코드만있고 어떤 부분은 코드와 데이터가 있고 예를들어 부위가 섞임, 반면에 세그먼테이션은 논리적인 부분으로 잘라서 더 우월하다)
- 공유 (Sharing): 메모리 낭비 방지
- 같은 프로그램을 쓰는 복수 개의 프로세스가 있다면,
- Code + data + stack 에서 code 는 공유 가능 (단, non-self-modifying code = reentrant code = pure code 인 경우)
- 프로세스의 세그멘트 테이블 코드 영역이 같은 곳을 가리키게
- 페이징보다 우월!
- 보호 (Protection): 해킹 등 방지
Leave a comment