logical vs physical address
- 디스크에서 파일을 실행하면 프로세스별로 가상메모리(logical address)가 잡히고, 주소변환을 통해서 물리적메모리로 올라간다
- 가상주소와 물리주소(physical address)간의 변환이 필요하다
- 주소 바인딩 : 주소를 결정하는 것
주소 바인딩
(논리적 )
- compile time binding
- 물리적 메모리 주소가 컴파일 시 알려짐
- 컴파일시 논리적 -> 물리적 주소가 결정이 되는 것이다.
- load time binding
- loader의 책임하에 물리적 메모리 주소 부여
- 메모리 주소가 재배치가 가능하다
- excution time binding(= run time binding)
- 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
- cpu가 주소를 참조할때마다 binding을 점검 (address mapping table)
- cpu가 바라보는 주소는 logical address이다
- 왜 cpu는 물리적 주소를 보는 것이 아니라 논리적주소를 보는 것인가?
- 컴파일시에 논리적주소가 실행파일에 있다 그리고 물리적주소로 올라가도 안의 내용은 논리적주소로 적혀있다
- cpu가 바라보는 주소가 논리적 주소라서 매순간 주소르 논리적 주소에서 물리적 주소로 변경하는 것이 필요하다.
- load time vs run time
- 로드 타임은 실행시점에 물리적 주소가 결정된다
- 런타임바인딩은 실행중에 물리적주소가 변환이 될 수 있다 (시작된 이후에도 메모리상 위치를 변경할 수 있다)
Dynamic Relocation
- cpu가 바라보는 것은 논리적주소이다. 밑의 그림에서 논리적 주소소 346을 요청한다 이후 relocation register를 + 346을 해서 실제 물리적 주소 공간 14346(물리적메모리)을 보면된다.
- cpu가 346을 달라고 했는데, 시작 위치가 14000이다, 거기서 떨어진 거리 346을 더하면 물리적 공간이 나온다..
- relocation register는 물리적 메모리의 시작위치를 담고있다
- limit register는 논리적 주소의 범위이다. (프로그램의 크기를 담고있는 것이다),
- cpu에서 logical address를 요청했을때 요청된 크기를 보고 limigt register를 초과했을 때는 악의적인 것으로 파악한 후 트랩을 발생시켜서 에러로처리한다.
Dynamic Loading
- 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질대만 메모리에 load하는 것
- memory utilization의 향상
- 왜?
- 좋은 프로그램은 방어적프로그램이다. 여기서 방어적프로그램에서는 예외처리가 중요한데 그러한 코드들이 미리 다 올라갈 필요가 없다 그래서 필요한 부분들 만 올려 놓기에 메모리 이용률이 좋아진다..
overlays
- 필요한 부분을 메모리에 올린다..
swapping
만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생한다. (왜냐하면 실제 RAM은 크기가 작다, 원본은 디스크에 저장이 되어있다)
메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고, 하드디스크의 일부분을 마치 메모리처럼 불러와 쓰는 스와핑을 통해 마치 페이지폴트가 발생하지 않는 것처럼 만든다.
- 스와핑은 프로세스를 일시적으로 메모리에서 backing store로 쫓아낸는 것이다.
- backing store
- 디스크, 저장 공간이라고 생각하면된다.
- swap in/ swap out
- 우선순위에 따라서 cpu scheduling algorithm, 우선순위가 낮은 것을 스왑 아웃하고, 우선순위가 높은 것을 메모리에 올려놓는다.
- compile time, load time binding에서는 컴파일 후 메모리 위치가 결정되기에 swap in할때도 원래 위치로 해야한다.
- excution time binding에서는 빈 메모리 영역 아무곳에나 올릴 수 있다 (물리적 메모리 주소가 변경되기때문에)
Dynamic Linking
- cf : 프로그램은 컴파일 -> 링킹 -> 실행파일로 된다.
- linking을 실행 시간까지 미루는 기법
- static linking
- 라이브러리가 프로그램의 실행 파일 코드에 포함됨
- 동일한 라이브러리를 각각의 프로세스가 메모리에 올려서 메모리 낭비
- cout을 할때 각각 프로세스에 cout 코드가 올라간다.
- dynamic linking .. ex) ,dll
- 라이브러리가 실행시 연결된다
- 라이브러리가 실팽 파일에 포함되는 것이 아니라 실행시 해당 라이브러리가 불려진다.
- 라이브러리 호출 부분엥 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 뒀다..
- cout이 불리는 순간 올라가있는 shared_library를 공유해서 사용한다
물리적 메모리 관리 기법
- 사용자 프로세스 영역의 할당 방법
- Contiguous allocation(연속할당)
- 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록하는 것
- 불연속할당(Noncontiguous allocation)
- 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있음 (paging, segmentation, paged segmentation)
- Contiguous allocation(연속할당)
- 연속할당 방식
- 고정 분할 방식과, 가변 분할 방식이 있는데 고정 분할은 미리 partition을 나눠서 프로그램을 올려 놓는 것이다.
- 가변 분할은 프로세스가 그냥 메모리에 순차적으로 올라가는 것이다 (올라가기전에 메모리에 파티션을 두지 않고)
- 이러한 메모리가 할당 되어있다가 사라지고 하면 hole(가용 메모리 공간)이 생긴다, 다양한 크기의 hole들이 메모리 여러 곳에 흩어져있다, 메모리 여분은 많은 작게 나눠져있어서 연속할당방식으로는 프로세스를 할당할 수 없게된다
- 연속할당에서 비어있는 공간을 할당하는 방법
- first-fit (사이즈가 n이상인 것중에서 최초로 찾아지는 hole에 할당)
- best -fit (사이즈가 n이상인 가장 작은 hole을 작아서 할당)
- worst - fit(가장 큰 빈 hole에 할당)
가상 메모리
사용하는 부분만 메모리에 올리고, 나머지는 디스크에 보관
- 하드디스크까지 메모리의 영역을 확장해서 사용하는 것이 가상메모리이다..
롤을 실행 시키고 싶을때 cpu는 하드디스크에서 롤을 가지고 와서 메모리에 올려야지 실행가능하다 , 그런데 롤을 한번에 메모리에 다 올리는 것이 아니라 사용하는 부분만 메모리에 올리기에 더 효율적일 수 있다..
즉 결국 가상메모리를 사용하는 이유는 모든 프로세스에게 메모리를 할당 해서 사용하기에는 메모리의 크기가 한계가 있어서 사용하는 방법이 가상 메모리이다.
ram을 물리주소, 가상메모리로 확장한 하드디스크 주소가 가상주소...
cpu가 가상메모리로 요구하면 mmu는 그것을 물리메모리에 접근해서 cpu로 던져준다.
하드디스크는 파일형태로 저장을한다. 가상메모리영역으로 선택 된 곳의 파일들을 스왑파일이라고한다...
둘이상의 프로세스와 가상메모리가 공존할 수 있는 이유는 각각의 프로세스가 스왑파일을 가지고 있기 때문이다. Ram이 프로세스 a를 올리다가 b를 올릴려면 a를 swap out하고 b를 swap in한다...
가상 메모리는 프로세스의 주소 정보가 들어 있는 '페이지 테이블'로 관리된다. 속도향상을 위해 TLB를 사용한다.
cf :
TLB : 메모리와 CPU사이에 있는 주소 변환을 위한 메시이다. 페이지 테이블에 있는 리스트를 보관하며,
CPU가 페이지 테이블까지 가지 않도록 해 속도를 향상시킨다.
출처 : kocw 반효경 교수님 os강의
'운영체제' 카테고리의 다른 글
자네 thread safe 한가? (0) | 2021.12.02 |
---|---|
paging (0) | 2021.10.24 |
세마포어, 뮤텍스 (0) | 2021.10.21 |
프로세스 synchronize (0) | 2021.10.21 |
프로세스, 스레드, cpu스케쥴러, contextswitch (0) | 2021.10.19 |