Operating System Ch 9 : Main Memory

이정빈·2024년 1월 13일
0

OS

목록 보기
9/15

9.1 Background

메인 메모리는 컴퓨터 시스템의 운영에 중심적인 역할
메모리는 각각 주소가 할당된 일련의 바이트들로 구성
CPU는 PC가 지시하는 대로 메모리로부터 다음 수행할 명령어를 가져오고, 그 명령어는 필요한 경우 추가적인 데이터를 더 가져올 수 있다.
반대로 데이터를 메모리로 보낼 수도 있음

9.1.1 Basic Hardware

메인 메모링와 프로세서에 내장되어 있는 레지스터들은 cpu가 직접 접근할 수 있는 저장장치임.
메모리 주소만 인수로 취급하고, 디스크의 주소는 인수로 취급하지 않음
따라서, 모든 실행되는 명령어와 데이터들은 cpu가 직접적으로 접근할 수 있는 메인 메모리와 레지스터에 있어야 한다.

각 cpu코어에 내장된 레지스터들은 1사이클내에 접근이 가능하고, 1사이클 내에 처리를 마쳐야 한다.
메인 메모리의 경우에는 많은 cpu 클록 사이클이 소요되고, cpu가 필요한 데이터가 없어서 명령어를 수행하지 못하고 지연될 수 있음.
이 문제를 해결하기 위해, cpu와 메인 메모리 사이에 cache를 둔다.
cache는 cpu 안에 있으며, memory 접근 속도를 향상시킨다.


운영체제가 cpu, 메모리 간의 접근 중 개입하면 성능이 떨어지므로, 각각의 프로세스가 독립된 메모리 공간을 가지도록 보장해야함
각 프로세스마다 메모리 공간을 가지고, 기준과 상한 사이의 주소 값만 접근 가능하다.

9.1.2 Address Binding

프로그램은 binary 실행 파일 형태로 디스크에 저장되어 있음.
실행하려면 프로그램을 메모리로 가져와서 프로세스 문맥 내에 배치해야한다.
cpu에서 실행이 가능하고, 프로세스가 실행되면 메모리에서 명령 및 데이터에 접근한 후, 프로세스가 종료되면 다른 프로세스에서 사용하기 위해 메모리가 회수된다.


메모리 주소 공간에서 명령어와 데이터의 바인딩은 그 바인딩이 이루어지는 시점에 따라 구분된다.

  1. 컴파일 시간 : 만일 프로세스가 메모리 내에 들어갈 위치를 컴파일 시간에 미리 알 수 있으면 컴파일러는 절대 코드를 생성 가능

  2. 적재 시간 : 프로세스가 메모리 내 어디로 올라올지 모르면, 컴파일러는 이진 코드를 재배치 가능 코드로 만든다. 심볼과 진짜 번지수와의 바인딩은 메인 메모리로 실제로 적재되는 시간에 이루어짐

  3. 실행 시간 : 프로세스가 실행하는 중간에 메모리 내의 다른 세그먼트로 옮겨질 수 있다면, 바인딩이 실행 시간까지 허용되었다고 말함

9.1.3 Logical Vs Physical Address Space

cpu가 생성하는 주소를 일반적으로 logical address라고 하며, 메모리가 취급하게 되는 주소를 physical address라고 한다.

컴파일, load time에 주소를 바인딩하면 logical, physical 주소가 같게된다.
그러나 실행시간에 바인딩하면 logical 주소는 virtual 주소라고 하고, physical과는 다르다.
프로그램은 실행 중에 가상주소를 물리주소로 바꿔줘야 하는데,이것은 매핑 작업이라고 하고, 메모리 관리 장치인 MMU에 의해 실행된다.



기준 레지스터를 재배치 레지스터라고 부름.
재배치 레지스터 속에 들어있는 값은 주소가 메모리로 보내질때마다 더해짐

하지만 실제 물리 주소를 알 수 없지만, 기존의 346번지에 대한 저장 연산 비교등의 작업을 할 수 있다.

9.1.4 Dynamic Loading

프로세스가 실행되기 위해선 그 프로세스 전체가 미리 메모리에 올라와 있어야 했다. 이 경우에 프로세스의 크기는 메모리의 크기보다 커서는 안됨.

다이나믹 로딩에서는 실제 호출되기 전까지는 재배치 가능한 상태로 디스크에 대기하고 있다. 적재되어 있는지 조사를 하고, 적재되어 있지 않다면 재배치 가능 연결 적재기가 불려 요구된 루틴을 메모리로 가져온다.

다이나믹 로딩의 장점은 필요한 경우에만 적재된다는 것임.

9.1.5 Dynamic Linking & Shared Libraries

DLL은 사용자 프로그램이 실행될 떄, 사용자 프로그램에 연결되는 시스템 라이브러리이다.
동적 연결에서는 연결이 실행 시기까지 미루어지는 것, 실행이 될때 이제 연결된다고 생각하면 됨

9.2 Contiguous Memory Allocation

메모리는 2개로 나뉘는데, 운영체제를 위한 것, 사용자 프로세스를 위한 것
여러 사용자 프로세스가 동시에 메모리에 상주하기를 원하고, 메모리에 적재되기를 기다리는 프로세스에 사용 가능한 메모리를 할당하는 방법을 고려해야함
연속적인 메모리 할당에서 각 프로세스는 다음 프로세스가 적재된 영역과 인접한 하나의 메모리 영역에 적재된다.

9.2.1 Memory Protection


먼저 상한 레지스터를 체크를 하고, 재배치 레지스터에서의 값을 더한 것이 물리주소가 되는 것

9.2.2 Memory Alloation

프로세스를 메모리의 가변 크기 부분에 할당하는 것
각 파티션에는 정확히 하나의 프로세스만 적재될 수 있다.
가변 파티션 기법에는 사용 가능한 메모리 부분과 사용 중인 부분을 나타내는 테이블을 가지고, 점점 사용할 수록 메모리 블록인 hole이 생기는 것

프로세스가 공간을 할당받으면, 이젠 cpu를 할당받기 위해 경쟁을 하고, 끝나면 메모리를 반납함

동적 메모리 할당 문제, n 바이트 블록을 요구하는 것을 어떻게 만족시켜줄것

  1. first fit : 첫 번째 사용 가능한 가용 공간을 할당
  2. best fit : 가장 작은 공간을 택함
  3. worst fit : 가장 큰 가용 공간을 택

일반적으로 first fit이 가장 괜찮다고 함

9.2.3 Fragmentation

프로세스들이 메모리에 적재되고, 제거되면 단편화 문제가 생김
외부 단편화 문제가 프로세스 쪽

할당된 공간이 요구된 공간보다 더 크면, 남는 부분을 내부 단편화라고 함

외부 단편화를 해결하기 위해 압축 방법이 있음.
메모리 모든 내용을 한군데로 몰고 모든 가용 공간을 다른 한군데로 모는 것
재배치가 어셈블, loadting 시간에 정적으로 행해진다면, 압축 불간으

9.3 Paging

9.3.1 Basic Method

물리 메모리는 프레임이라고 불리는 블록으로 나눠지고 논리 메모리는 페이지라고 불리는 블록으로 나누어진다.

메모리의 크기가 엄청 적게 장착된 시스템에서도 큰 비트로 이루어진 논리주소 공간을 사용 가능

외부 단편화 문제를 해결가능

9.4 Structure of the Page Table

9.4.1 Hierarchical Paging


2단계 페이징 기법으로 페이지 테이블 자체가 다시 페이징되게 하는 것

9.4.2 Hashed Page Tables

주소 공간이 32비트보다 커지면 가상 주소를 해시로 사용함
충돌이 되면 연결리스트로 해결
O(1)이지만 구현이 어렵

9.4.3 Inverted Page Table

메모리 프레임마다 한 항목씩 할당

9.8 Summary

메모리는 최신 컴퓨터 시스템 작동의 중심이며, 각각 고유한 주소를 가진 큰 바이트 배열로 구성

각 프로세스에는 주소 공간을 할당하는 한 가지 방법은 기준 및 상한 레지스터를 사용하는 것. 기준 레지스터는 가장 작은 유효한 물리 메모리 주소를 저장하며 상한은 메모리 범위의 크기를 지정한다.

심볼릭 주소 참조를 실제 물리 주소에 바인딩하는 작업은 컴파일, loading, 실행 시간이다.

cpu가 생성한 주소를 논리 주소라고 하며, 메모리 관리 장치가 메모리의 물리 주소로 변환한다.

메모리를 할당하는 한 가지 방법은 다양한 크기의 연속 메모리 파티션을 할당하는 것, first, best worst fit

페이징을 사용하여 메모리를 관리

계층적 페이징은 논리 주소를 여러 부분으로 나누고 각 단계는 서로 다른 페이지 테이블 수준을 나타냄. 주소가 커져서 계층 레벨이 계속 커질 수 있으므로, 해시 페이지 테이블, 역 페이지 테이블을 사용

0개의 댓글