Malloc-lab 프로젝트를 진행하기 위해서 컴퓨터시스템 9장 가상메모리의 처음 부분부터 정독했다. (책 정보)
기본적으로 가상메모리가 무엇인지, 왜 필요한지 알아야 해당 프로젝트를 하는데 의미가 있다고 생각했다.
하지만 생각보다 해당 책을 읽고 이해하는 시간이 오래걸렸다. 함축된 설명들도 많고, 번역된 내용이 이해하기 좀 어려웠다.
그래도 책을 기반으로 개념을 이해하려고 노력했다. 워낙 좋은 책이라고 이야기를 듣기도 많이 들었고, 책을 기반으로 보는게 전반적으로 공부해야하는 범위 가이드를 만들기 좋았다. 더불어 구글링만 의존해서 공부하다보면 정확하지 않은 정보들 때문에 헷갈릴 수 있는 경우가 많을 거라 생각해서 책을 꼼꼼히 읽는게 좋겠다 생각했다.
하지만 역시나! 9장을 펴서 공부를 시작하는 순간 막히는 단어와 문장들이 많았다. 특히 cpu가 명령어를 처리하는 프로세스를 이해해야 가상메모리에 대한 이해를 더 쉽게 할 수 있을 것이라 생각했다.
그래서 프로세서와 프로세스 차이 부터 천천히 시작했다.
프로세서는 하드웨어 측면에서 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛 -> 컴퓨터에서는 CPU를 뜻하는 말로 사용한다.
말 그대로 Process '과정', 메모리에 적재되어 프로세서에 의해 실행 중 또는 대기중 상태를 말한다. 여기서 중요한 포인트는 "메모리에 적재되어!"
인스트럭션들은 일련의 *프로그램 카운터(PC) 값들에 대응
이러한 PC값들의 배열을 논리적 제어흐름 or 논리 흐름 이라 부름
*프로그램 카운터(PC)
레지스터의 한 종류, 다음에 인출할 명령어의 주소를 가지고 있는 레지스터
명령어는 시작-> 명령어 인출-> 명령어 실행 -> 중단의 순서로 이루어진다.
명령어 인출하는 과정을 인출사이클
(CPU가 기억장치로부터 명령어를 읽어오는 단계)
명령어를 실행하는 과정을 실행사이클 이라 한다.
(명령어를 실행하는 단계)
더 세부적으로 명령어 인출 과정이 있지만,
간단하게 설명하면 PC에 저장되어 있는 주소로 Main Memory에 접근하면 Main Memory 안에는 명령어가 적재되어있고,
해당 명령어를 다시 CPU로 가져오는 과정을 명령어 인출 과정이라고 한다.
예시)
위에 그림에서 보면, PC에 100 주소가 있어서, Main Memory의 100주소로 가고, 100 주소에는 1250이라는 명령어가 들어있다. 해당 명령어를 다시 CPU에 가져오는 과정을 말한다.
여기서 위의 그림을 보게되면 두 가지 의문점이 들 수 있다.
첫번째, 1250은 왜 명령어지? 에 대한 답을 하자면 다음과 같다.
명령어는 연산코드와 오퍼랜드(addr)로 나눠진다.
만약 위의 어셈블리 프로그램 실행과정의 예를 보면,
1을 LOAD 연산코드라고 가정을 하고, 어셈블리어의 LOAD 250의 명령어는 1250이 될 것이다.
여기서 1은 연산코드, 250은 오퍼랜드이다.
그러면 cpu는 다음과 같은 값을 보고 LOAD 명령어를 250에 있는 데이터를 가지고 실행할 것이다. (실제로는 더 세부적인 명령어 실행과정이 존재함)
두번째, IR은 무엇이지?
IR은 최근에 인출된 명령어 코드가 저장되어 있는 레지스터이다.
이 외에도 CPU에는 여러가지 레지스터들이 존재한다.
프로세서는 각 프로그램에 자신이 시스템의 주소공간을 혼자서 사용한다는 착각을 불러일으킨다. 프로세스는 각 프로그램에 자신만의 사적주소공간을 제공한다.
이 말을 들었을 때, 확 와닿진 않을 수 있다.
내 생각에는 프로세서들은 프로세스를 실행할 때 혼자서 메모리를 다 쓰는 것 처럼 착각한다고 생각하면 될 것 같다.
그러면 여기까지 아주~~ 간단히 프로세서와 프로세스의 의미, 프로세스 추상화, 명령어 인출 과정을 살펴보았다. 이것도 각각 더 자세하게 들어가면 엄청나게 많은 내용이 기다리고 있다!
여기까지 가상메모리를 공부하기 위해 밑거름 공부를 마쳤다.
다음 게시물을 통해 가상메모리에 대해서 공부해보겠다.