운영체제 - 07
Updated:
강의
http://www.kocw.net/home/search/kemView.do?kemId=1226304
운영체제 - 메모리
1. Logical vs Physical Address
1.1 Logical
- 프로세스마다 독립적으로 가지는 주소
- 각 프로세스마다 0번지부터 시작
- CPU가 보는 주소는 logical address임
1.2 Physical
- 실제 메모리에 올라가는 주소
1.3 주소 바인딩
- 주소를 결정하는 것
- Symbolic Address -> Logical -> Physical
- Symbolic은 개발자가 바라보는 줏
- Logical은 심볼릭에서 컴파일되어 나온 주소
- 그렇다면 logical에서 physical로 변경되는 시점은 언제인가?
1.3.1 Compile time 바인딩
- 심볼릭에서 로지컬로 컴파일되는 시점에 물리적 주소도 함께 바인딩
- 시작 위치 변경시 재컴파일
- 컴파일러는 절대 코드 생성
1.3.2 Load time 바인딩
- 프로그램이 실행될 때
- 컴파일러가 재배치가능 코드를 생성한 경우 가능
1.3.3 Execution time (=Run time) 바인딩
- 프로그램이 실행될 때
- load랑 뭐가 다른가? load time 바인딩은 프로그램이 실행되면 physical 주소가 변경되지 않음. 하지만 run time은 프로그램 실행 도중에 변경이 가능
- 물리적 주소가 바뀌므로 CPU가 주소를 참조할 때마다 바인딩 점검
- 하드웨어적 자원이 필요 (ex: MMU)
2. Memory -Management Unit(MMU)
- 로지컬 주소를 피지컬 주소로 매핑해 주는 하드웨어 장치
-
사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소값에 대해 base register(=relocation register)의 값을 더 한다.
- limit register : 악성 프로그램이 다른 프로그램의 주소를 접근하는 것을 막기 위해 접근 가능한 최대치를 둠
3. Some 기술
3.1 Dynamic Loading
- 프로세스 전체를 메모리에 미리 올리는 것이 아닌 해당 루틴이 불려질 때 메모리에 load하는 것
- 메모리 이용률 향상
- 운영체제 지원 없이 프로그램 자체에 구현 가능
3.2 Overlays
- 다이다믹 로딩과 같음
- 다른 것인 overlays의 단어가 생긴 이유는 옛날 메모리가 프로그램보다 작았음. 그래서 다이나믹 하게 로딩하기 위해 개발자가 수작업해야함.
3.3 Swapping
- 프로세스 전체를 일시적으로 메모리에서 backing store로 쫒아내는 것
- Backing store(=swap area) : 많은 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 저장 공간
- 우선순위가 낮은 프로세스를 swapped out
- 다시 원래 주소로 올리는 것은 swapped in
- compile time, load time binding은 원래 위치로 swap in해야 함. 비어 있지 않다면 swap in이 되질 않음
-
그래서 execution time binding 은 물리적 주소가 바뀌므로 아무 곳에나 올릴 수 있어 좋음
- swap time은 transfer time임
3.4 Dynamic Linking
- 링킹을 실행 시간까지 미루는 기법
3.4.1 static linking
- 라이브러리가 내 코드에 포함되어 있음
- 파일 크기가 커짐
- 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
3.4.2 Dynamic linking
-
라이브러리가 내 코드에 포함되어 없음
- 라이브러리를 호출하기 위해 위치를 찾기 위한 stub이라는 작은 코드가 있음
- 라이브러리가 메모리에 있으면 루틴의 주소로 가고 없으면 디스크에서 읽어옴.
- 운영체제의 도움이 필요
4. 물리적 메모리 할당
- 메모리는 일반적으로 두 가지로 나뉨
- OS 상주 영역
- 사용자 프로세스 영역
4.1 연속 할당 (Contiguous allocation)
- 프로세스가 연속적인 공간에 적재되어 메모리에 올라감
4.1.1 고정 분할 방식
- 메모리를 영국적으로 분할하여 나눔
-
분할당 하나의 프로그램 적재
- 비효율 (내부조각: 프로그램이 메모리에서 실행되는데 다 필요가 없어서 남겨지는 메모리를 말함, 외부조각 발생)
4.1.2 가변 분할 방식
- 프로그램의 크기를 고려해서 할당
- 분할 크기, 개수가 동적으로 변함
- 외부조각이 발생(근데 여기서 외부조각은 고정 분할 방식과 다름). 고정분할 방식에서는 메모리 크기에 맞는 프로그램이 없어서 발생. 그러나 여기서는 프로그램이 동적으로 할당되어 수행되다가 종료가 되어 남아버린 조각을 의미함
4.1.3 Hole
- 가용 메모리 공간
- 프로세스가 종료되어 생기는 남은 메모리들
- 프로세스가 도착하면 수용가능한 hole을 할당
- 운영체제는 할당공간, 가용공간(hole) 의 정보를 유지해야함
- Dynamic storage allocation problem : 가변 분할 방식에서 size 요청에 맞는 가장 적절한 hole을 찾는 문제
- first fit : size 요청한 hole 가장 먼저 찾는 것
- best fit : 가장 이상적인 size를 가진 hole을 가져야 함. 리스트 탐색의 단점.
- worst fit : 가장 큰 hole에 넣는 것. 역시 list 탐색해야 하고. 의미 없는 공간 낭비
4.1.4 compaction
- 사용중인 메모리 영역을 한군데로 몰고 hole을 몰아 큰 block을 만드는 것
- 매우 비용이 많이 듬
- 최소한으로 해야함.
- 물리적 주소가 동적으로 이동 가능할때만 (run time에서만) 가능.
4.2 불연속 할당 (Noncontiguous allocation)
- 하나의 프로세스가 메모리 여러 영역에 분산되어 올라감
4.2.1 Paging
-
프로세스의 가상 메모리를 동일한 사이즈의 페이지를 나눔
-
가상메모리의 내용이 페이지 단위로 불연속하게 저장됨
-
일부는 backing store에 일부는 물리적 메모리에 저장
4.2.1.1 Basic method
-
물리적 메모리와 동일한 크기로 frame을 나눔
-
로지컬 메모리를 동일 크기로 page로 나눔(frame과 같은 크기)
-
page table을 사용하여 로지컬 주소를 피지컬 주소로 변환
-
외부 조각 발생 안함
-
내부 조각은 발생 가능 있음(frame으로 전체 나누다 보면 맨 마지막에 frame 크기에 안맞는 조각 생김)
4.2.1.2 Page table
-
메인 메모리에 상주
-
page -table base register (PTBR)가 page table 가리킴
-
page -table length register(PTLR)가 테이블 크기를 보관
-
메모리 접근 연산에 2번의 메모리 접근이 필요
-
1번은 page table 접근, data 접근에 1번
-
속도 향상을 위해 associative register or translation look-aside buffer(TLB)라 불리는 lookup hardware cashe 사용
4.2.1.3 2단계 & 다단계 페이징
-
페이지 테이블안의 엔티티 수가 많아서 공간이 낭비. 페이징 테이블을 더 두어서 공간 효율성 높임
4.2.1.4 inverted page
- 물리적 주소를 논리적 주소로 역으로 바꿈
4.2.1.5 shared page
4.2.2 Segmentation
- 페이징이랑 구조는 같음
- 세그먼트 테이블 - base(세그먼트 물리적 주소 시작), limit(세그먼트 제한)
-
STBR ( ==PTBR), STLR(==PTLR)
- 프로세스 안의 데이터 영역의 의미에 따라서 자름
- data, stack, code 영역에 따라 자른다는 의미.
- 세그먼트는 의미 단위 이기 때문에 공유와 의미에 있어서 페이징보다 효과적
- 하지만 외부조각 문제가 발생
4.2.3 Paged Segmentation
- 기존 차이점 : 세그먼트 테이블 엔트리가 세그먼트의 기본 주소를 가지고 있는 것이 아니라 세그먼트를 구성하는 페이지 테이블의 기본 주소를 가지고 있음