안녕하세요~!! 양햄찌 주인장입니다.
운영체제 관련 글을 이어서 가져왔어요 ㅎㅎ
나름 많은 포스팅을 꾸준히 작성하면서 달려왔다 생각했는데 가는 길을 멀고도 멀군요...
생각보다 이거 하나 써내려가는게 시간을 넘 많이 잡아먹어서리 ㅠㅠ
[운영체제 포스팅 링크 모음]
아무튼 저번시간에 주소할당을 다루면서 살짝 언급하고 넘어갔던 MMU에 대해 작성해보려고 합니다.
저번 시간 포스팅이 궁금하신 분은 아래 링크를 참조해주세요 :)
[운영체제 OS]Address binding 로드타임 바인딩(load time binding), 실행타임(execution time) 바인딩 (run time binding) 주소할당
안녕하세요 여러분 오랜만에 들고 온 운영체제 관련 글입니다. ㅎㅎ [운영체제 OS 완전정복 목차] 저번 시간에는, 1. 물리적 주소란 (physical address) 2. 주소 바인딩이란 (Address binding) 3. 절대 코드란 (ab..
jhnyang.tistory.com
메모리 분할 방법의 필요성
먼저 시작하기전, 메모리에 구성과 분할방법에 대한 개요를 살짝 엿보고 갑시다.
The main memory must accomodate both the operating system and the various user process.
우리가 사용하는 메인 메모리에는, 다양한 프로그램도 올라가서 돌아가야 하지만, 컴퓨터 운영체제 또한 저장되어 있어야겠죠. 개인 데탑이 아니라 많은 사람들이 접속해 사용하는 서버나 이런 경우에는 다양한 유저들의 프로세스도 다 하나의 메모리에 저장해야 할 거예요.
We therefore need to allocate main memory in the most efficient way possible.
따라서 우리가 컴퓨터를 잘 사용하려면, 가능한 가장 효율적인 방법으로 메인 메모리를 분할하고 할당해야 합니다.
This section explains one early method, contiguous memory allocation.
오늘 포스팅에서는 오래된 하나의 방법인 연속메모리 할당에 대해 주로 살펴볼거예요. (오래된 방식이라는건 현재 지금 방식이랑은 다르다는거~~ )
메모리는 크게 두 파티션으로 이뤄져있는데, 알다시피 하나는 운영체제를 위한 저장공간이고 또 다른 하나는 사용자 프로세스들을 위한 공간입니다.
We can place the operating system in either low memory or high memory. The major factor affecting this decision is the location of the interrupt vector.
지금까지 제 포스팅을 꾸준히 봐온 사람들은 알겠지만, 운영체제는 인터럽트와 큰 상관관계가 있습니다. 그래서 사실 운영체제 데이터를 0번지 등의 메모리 하단에 위치시켜도 되고, 윗단에 위치시켜도 되는데, 보통 대게 밑단에 있어요. 왜냐면 인터럽트 벡터가 주로 낮은 메모리에 위치되어있거든요. 그래서 앞으로의 예시도 운영체제는 메모리 주소 하단에 위저장되어 있다 가정하고 진행할게요.
MMU란? Contiguous allocation이란?
execution time에 진행되는 run time address binding에는 MMU가 도움을 준다고 언급했어요.
다시, 요약하자면 MMU란 CPU코어 안에 탑재되어 가상 주소를 실제 메모리 주소로 변환해주는 장치입니다.
저번 시간엔 제가 그린 위 그림으로 설명을 드렸었죠.
이렇게 기준점의 위치가 다르더라도, 사이간격? offset? 상대 주소? 는 같기 때문에, 더하기를 통해서 물리적 주소도 논리적 주소처럼 연속적으로 배치되게 됩니다. 이게 바로 연속적 메모리 할당이라고 하는 contiguous allocation이예요.
즉, Contiguous allocation 연속메모리 할당이란 "logical address가 연속적이면 physical address도 연속적으로 배치된다"라는 겁니다.
MMU의 memory protection
자 근데 위 그림을 보니까 뭔가 좀 추가가 되었어요.
너~~~무 초반에 포스팅을 해서 까먹은 분들이 좀 계실 것 같은데 운영체제의 기능이 크게 뭐였죠?
CPU관리, 메모리 관리, I/O관리 이렇게 세 가지였죠. CPU관리를 위해선 CPU protection이, 메모리 관리를 위해선 memory protection이, IO를 위해선 I/O protection이 있죠.
위 그림은 기본적인 기능에 memory protection이 추가된 모습이예요.
만약 memory protection이 없다면? (가정) 실제 램 memory는 주소 1000까지이고 base memory가 400번지라 합시다. 근데 하필 오프셋이 700이예요. 그럼 400+700해서 1100으로 우리가 갖고 있는 실제 메모리 주소 크기보다 벗어나죠??? 프로그램이 엄청 크다보면 이럴 수 있죠. 이렇게 잘못된 메모리 번지를 참조하지 않도록 막아주는 게 memory protection입니다.
그래서 내가 참조할 수 있는 범위인지 아닌지를 체크를 어떻게 할 수 있을까?를 고민하게 된거죠
지금 logical address는 0번지부터 시작한다고, 그 다음에 이 프로그램의 크기까지 만큼 메모리를 access할수 있는거잖아요. 그거보다 더 큰 영역을 access하게 되면 안돼요.
그걸 위해서 limit register(상한 레지스터)가 추가됐어요. 상한 레지스터보다 가상 주소 값이 크면 memory protection fault를 발생시킵니다.
상한 값은 RAM 메모리 크기가 될 수도 있지만, 현잰 그렇게 안쓰입니다. 대표적으로 멀티프로그래밍 시스템일 경우 각 프로세스들이 서로 메모리를 침범하면 안되겠죠? 기본적으로 필요한데 각 메모리 보호를 해줘요.
memory protection fault란?
암튼 넘어서면 memory protection fault를 발생시킨다고 했는데 이게 무슨말일까요?
CPU가 명령어를 수행하는데 이게 가상 주소가 110000이였고 얘가 참조할 수 있는 address는 100만이었다합시다. 근대 얘가 110만번을 참조하려 그래, 그러면 CPU는 이거를 실행하면 안되죠.
근데 CPU가 할 수 있는 일이라곤 CPU명령어를 수행하는거잖아. 얘네가 판단을 하진 않으니까요.
그래서 실행을 하려 하는데 사실 이게 참조하려는 메모리 크기보다 크니까 이 명령어는 올바른 명령어가 아닌 거죠. (메모리가 100만까지밖에 없는데 어떻게 존재하지도 않는 영역을 참조하겠어요! 길가다가 길이 있는줄 알았는데 없어서 절벽에 떨어지는 것과 같죠)
이 경우엔 운영체제한테 도움을 요청 합니다.
그림에 보면 trap이라고 나와있는데, CPU가 자기 자신한테 인터럽트를 거는 것을 우리가 exception이라고도 부르고 trap이라고도 부릅니다. 사실은 두 개 사용 할 때가 조금씩 다르긴한데 exception, trap, fault라고도 부르고.. (그래서 메모리 프로텍션 폴트인거)
fault는 조금 더 일반적인 명사를 의미하면서 CPU가 자기 자신한테 interrupt를 걸어서 이거는 내가 처리할 수 있는 명령어가 아니니까 운영체제 니가 처리해 줘라고 요청 하는거예요.
그런데 요 그림(메모리프로텍션MMU그림)이 조금 잘못됐다고 생각하는 건 지금 현재 CPU에서 logical address가 나와서 이런 일을 수행하는 것처럼 그려져 있는데, 이 MMU도 사실 CPU에 있는겁니다. 그래서 그림이 조금 잘못됐다고 하는거,
contiguous allocation의 장점
일단 MMU가 매우 간단해집니다. 더하기 하나만 하면 되니까요!
그리고 memory protection fault 체크할 때 '이 값이 어떤 값보다 더 넘어섰냐 아니냐'만 비교해주면 되거든요~
즉 하드웨어 만들기가 매우 쉽다 라는장점이 있습니다.
그런데 지금 현재 우리 시스템에서는 안쓰인다고 했죠. 안쓰이고 개선되는 데에는 다 이유가 있습니다.
이 단점은 fragmemtation에 관한건데 paging이 나오게 된 계기이기도 합니다. 이에 대해서는 다음 포스팅에서 다루도록 할게요.
도움이 되셨다면, 가기 전에 공감/댓글/광고보답으로 마음을 살포시 표현해주는 건 어떤가요? 정보 공유에 활력이 됩니다. 감사합니다 :)
최신 댓글