학사 나부랭이

Operating System - Memory 본문

Dot-Gabi/Operating System

Operating System - Memory

태양왕 해킹 (14세) 2021. 4. 2. 22:37

//다른 곳에서는 메인 메모리를 편의상 메모리라고 했지만 여기서는 혼동을 방지하기위해 메인 메모리라고 풀 네임으로 썼어요.

 

 컴퓨터는 다양한 저장장치가 사용되는데 속도(CPU가 접근하는데 걸리는 시간), 용량, 가격(비트당 단가)의 차이에 따른 분류를 할 수 있어요. 아래의 그림에서 아래에 있을수록 가격이 감소하고(용량이 증가하고) 속도가 느려져요. 그러니까 싸고(크고) 느린 저장장치가 비싸고(작고) 빠른 저장장치를 보완해줘요.

여기서 프로그램이 실행되기 위해서는 반드시 메인 메모리에 있어야 해요. 그 중 일부분이 캐시로, 또 그 중 실행할 명령어는 CPU 레지스터에 적재되어서 실행 과정을 거쳐요.

 

Register

 CPU는 여러 레지스터를 가지고 있는데 알다시피 메인 메모리보다 빠르지만 크기가 작아요. 시스템에 따라, 사용 목적에 따라 8, 16, 32비트 등의 크기를 가지죠.

User-visible registers

 레지스터 사용의 최적화를 통해 기계어나 어셈블리어 프로그래머가 메인 메모리 참조를 최소화할 수 있게 해 줘요.

1. 데이터 레지스터

 범용적으로 사용되는 레지스터로 연산을 수행하는 기계어 명령에 사용될 수 있어요. 그러나 제약이 있는 레지스터들이 있기도 한데 대표적으로 부동소수점 연산에만 사용되는 레지스터 등이 있어요.

2. 주소 레지스터

 메인 메모리 상의 데이터나 명령어의 주소를 저장하거나 주소 계산을 하기 위해 주소를 저장하고 있는 레지스터예요. 이런 레지스터는 범용적으로 사용될 수 있지만 특정 주소 지정 모드에서만 한정적으로 사용되기도 해요. 주소 레지스터는 또 아래와 같이 나뉘어요.

인덱스 레지스터: 인덱스를 이용한 주소 지정 방법을 사용하기 위해 기준값에 인덱스를 더해 실제 주소를 계산할 때 쓰이는 레지스터예요.

세그먼트 포인터: 세그먼트를 이용한 주소 지정 방법을 사용하기 위해, 세그먼트@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@가상 메모리? 뭐더라 추가추가추가@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@는 워드로 구성된 가변 길이의 블록이에요. 메모리는 세그먼트들로 나뉘며 메모리 참조는 특정 세그먼트에 대한 참조와 그 세그먼트 안에서의 오프셋을 통해 이루어져요. 그때 사용되는 세그먼트의 기준 주소를 저장하죠.

스택 포인터: 사용자가 볼 수 있는 스택 주소 지정이 있으면 스택의 상단을 가리키는 레지스터예요. 스택의 push나 pop같이 주소 필드가 없는 명령어를 사용할 수 있게 해요.

Control&status registers

 CPU가 자신의 동작을 제어하기 위해 사용되는 레지스터예요. 사용자에게 보이지 않지만 제어 모드나 운영체제 모드에서 수행한 기계 명령어를 통해 일부에 접근할 수 있어요.

1. MAR(Memory Address Register)

 다음에 읽거나 기록할 메모리의 주소를 명시해요.

2. MBR(Memory Buffer Register)

 메모리에 기록되거나 메모리에서 읽힐 데이터를 저장해요.

3. IO AR(InputOutput Address Register)

 다음에 사용할 입출력 장치의 주소를 명시해요.

4. IO BR(InputOutput Buffer Register)

 입출력 장치에서 기록되거나 읽힐 데이터를 저장해요.

5. PC(Program Counter)

 다음에 수행할 명령어 주소를 저장해요.

6. IR(Instruction Register)

 현재 수행 중인 명령어를 저장해요.

7. PSW(Program Status Word)

 모든 CPU는 현재 상태를 저장하기 위해 이 레지스터를 가져요. 여러 condition 코드와 인터럽트 가능/불가능을 표시하는 비트, 현재 실행 모드를 나타내는 비트 등이 있어요.

 

Cache

 캐시는 가장 빠른 메모리에 가까운 속도와 상대적으로 대용량인 메모리를 제공해요. 그러니까 메인 메모리와 CPU의 중간자 역할을 해서 CPU와 직접적인 소통을 해요. 이렇게 비교적 크고 느린 메인 메모리는 작지만 빠른 캐시와 함께 사용해서 병목 현상이 해결되었죠. 캐시는 메인 메모리 일부의 복사본을 가지고 있으며 CPU가 메인 메모리에서 한 워드를 읽으려 할 때 그 워드가 캐시에 있다면 CPU로 바로 전달되지만 그렇지 않으면 메인 메모리의 블록(워드들의 집합)을 캐시가 읽은 후 해당 워드가 CPU로 전달되어서 없는 것만 못 할 수도 있어요.

그냥 웃겨서 들고옴ㅋㅋㅋㅋㅋ The cock blockerㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 여기서 캐시에 CPU가 필요한 워드의 유무를 비율로 표현한 것이 hit ratio(적중률)이에요.

캐시는 1,000바이트로 구성되고 접근 시간이 0.1us, 메인 메모리는 100,000바이트로 구성되고 접근 시간이 1us 일 때 CPU의 저장장치에로의 접근 중 95%가 캐시 단계에서 적중하면(H = 0.95) 한 바이트를 접근하는데 걸리는 평균 시간은 0.95*0.1 + 0.05*(0.1+1) = T1 + T2 = 0.15us가 되어요.

 

 캐시가 메모리에서 데이터를 들고 오는 기준은 참조의 지역성에 의거하는데 이 참조의 지역성은

1. 공간 지역성, 참조된 메모리 근처의 메모리가 참조될 확률이 높아요.

2. 시간 지역성, 한 번 참조된 메모리는 곧 다시 참조될 확률이 높아요.

3. 순차 지역성, 공간 지역성과 비슷한데 데이터는 순차적으로 액세스 되는 경향이 있어요.

 

가상 메모리

 프로세스는 CPU와 메인 메모리를 공유하는데 CPU가 능력이 부족할 경우 스케줄링 될 순서가 느려질 뿐 심각한 오류는 나지 않아요. 그런데 메인 메모리에 여유가 없으면 ⓐ다른 프로세스의 영역을 침범하거나 ⓑ아예 실행이 되지않는 상황이 나와요. 이를 극복하기 위해 ⓐ상호 배제와 ⓑ가상 메모리예요.

프로세스의 모든 부분이 항상 필요하지 않으니 지금 필요한 부분만 메인 메모리에 적재시키면 전부 올리는 것보다 메인 메모리의 사용을 줄일 수 있고 이를 Demand-paging(요구 페이징)이고 이 때 메인 메모리에 올라가지 않은(HDD에 있는) 부분을 Paging file이라고 해요. 그리고 컴퓨터는 Paging file이 있는 HDD도 메인 메모리로서 생각해요. 그러니 겉으로 보기에는 메인 메모리가 늘어난 것처럼 보이죠. 이렇게 부분을 나눠 관리하는 방법이 두 가지가 있는데 한 번 알아볼까요?

Paging

가상 메모리를 같은 크기의 블록(페이지)으로 나누어 관리하는 방법이에요. 주소공간을 페이지 단위로 나누고 메인 메모리는 페이지 크기와 같은 프레임으로 나누어 사용하죠. 프로세스 사이의 메모리 보호는 페이지 단위로 이루어지며 메인 메모리에 접근하려고 할 때마다 페이지 테이블을 참고하고 계산해야하는 단점이 있어요. 그리고 내부 단편화가 생길 수 있어서 문제가 되죠.

Page table

 페이지 테이블은 프로세스의 페이지 정보를 저장하고 메인 메모리와 가상 메모리가 어떻게 mapping되는지를 나타내는 테이블이에요. CPU가 내는 주소는 논리 주소라고 이를  여기에는 가상 메모리의 페이지 번호가 인덱스로서, 메인 메모리의 페이지 프레임 번호를 내용으로 가지는데 이들을 이용해 HDD의 가상 메모리에 있던 데이터와 메인 메모리에 있는 데이터를 올바르게 스와핑시켜요.

프로세스마다 하나 씩 있고 MMU의 재배치 레지스터가 이를 이용하면 CPU가 프로세스가 전부 온전히 메인 메모리에 올라간 것처럼 인식하게 되어요.

Paging fault

 요구하는 페이지가 메모리에 존재하지 않을 때나 메모리 주소에 접근하려고 했는데 페이지 테이블 엔트리가 유효하지 않을 때 발생해요. 그럼 CPU가 잠시 하던 일을 멈추고 필요한 페이지를 찾아 적재해야해요.

Segmentation

 프로세스를 함수, 프로시저, 변수, 스택 등의 논리적 의미에 부합하게 나누어서(세그먼트) 메인 메모리에 적재해요. 블록의 크기가 제각각이라서 미리 분할해 둘 수 없고 메인 메모리에 적재 할 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법이에요. 세그먼트 하나씩 통제할 수 있지만 외부 단편화가 생길 수 있어서 문제가 되죠.

Segment table

 세그먼트 테이블은 사용자가 정의한 주소를 실제 주소로 매핑하는 정보를 저장하고 있고 각 세그먼트 항목별 Base(세그먼트 시작 주소)와 limit(세그먼트 길이)를 가지고 있어요. 할당하는 방법은 페이징과 같이 MMU 내의 재배치 레지스터를 이용해 논리 주소를 물리 주소로 바꾸는 방식을 사용해요.

Segmentation fault, 내/외부 단편화

blog.naver.com/PostView.nhn?blogId=jyh0841&logNo=220332303726

Main memory

내부 단편화, 보호

kkimsangheon.github.io/2019/02/26/operating-system21/

단편화

blog.daum.net/endlessole/166

페이징 보호

copycode.tistory.com/107?category=740133

다중 프로그래밍 페이징

copycode.tistory.com/102?category=740133

연속 할당, 불연속 할당

developyo.tistory.com/215?category=752792

developyo.tistory.com/211?category=752792

HDD//꼭 써야 하나?????

'Dot-Gabi > Operating System' 카테고리의 다른 글

Operating System - Memory management  (0) 2021.04.06
Operating System - Compile to execute  (0) 2021.04.06
Operating System - Kernel  (0) 2021.04.02
Operating System - Opening & Systems  (0) 2021.04.02
Operating System - Process & Thread  (0) 2021.04.01
Comments