CPU와 메모리
기본 구성
명령어를 실행하는 장치로 CPU는 산술 논리 연산장치, 제어장치, 레지스터로 구성, 협업으로 작업 처리
산술논리 연산장치
CPU에서 데이터를 연산하는 장치가 산술 논리 연산장치(ALU), 데이터의 덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산, AND, OR 같은 논리 연산 수행
제어장치
CPU에서 작업을 지시하는 부분
레지스터
데이터를 임시로 보관하는 곳
CPU의 명령어 처리 과정
CPU는 0과 1의 2진수로 이루어진 기계어만 인식
컴파일러를 이용하여 기계어로 바꾸어야 한다.
CPU가 연산을 하려면 필요한 데이터를 CPU로 가져와 임시로 보관해야 하는데, 이대 사용되는 장소가 레지스터
모든 데이터가 준비되면 산술 논리 연산장치에서 두 값을 더하여 그 결괏값을 레지스터 5에 저장,
레이스터 5에 저장된 결과값을 최종적으로 결과 메모리로 옮긴다.
제어장치는 명령어를 해석하여 제어 신호를 보내고 CPU 내의 데이터 흐름을 조절하는 역할
제어장치는 '메모리에서 데이터를 가져와라', '덧셈을 실행하라', '덧셈한 결괏값을 메모리로 옮겨놓아라'라고 신호를 보낸다.
레지스터의 종류
CPU는 필요한 데이터를 메모리에서 가져와 레지스터에 저장하고 산술논리 연산장치를 이용하여 연산을 한 후, 그 결과를 다시 레지스터에 저장했다가 메모리로 옮긴다. 이때 사용되는 레지스터는 데이터 레지스터와 주소 레지스터
데이터 레지스터와 주소 레지스터는 사용자 프로그램에 의해 변경되기 때문에 사용자 가시 레지스터라고 부른다.
- 데이터 레지스터(DR) : 메모리에서 가져온 데이터를 임시로 보관할 때 사용한다. CPU에 있는 대부분의 레지스터가 데이터 레지스터이기 때문에 일반 레시스터 또는 범용 레지스터라고 부른다.
- 주소 레지스터(AR) : 데이터 또는 명령어가 저장된 메모리의 주소는 주소 레지스터에 저장
이 외에 특별한 용도로 사용되는 레지스터는 특수 레지스터라고 불린다. 특수 레지스터는 사용자가 임의로 변경할 수 없기 때문에 사용자 불가 레지스터라고 부른다.
- 프로그램 카운터(PC) : CPU는 다음에 어떤 명령어를 처리해야 할지 알아야 한다. 프로그램 카운터는 다음에 실행할 명령어의 주소를 기억하고 있다가 제어장치에 알려준다. 다음에 실행할 명령어의 주소를 가리키기 때문에 프로그램 카운터를 명령어 포인터라고도 한다.
- 명령어 레지스터(IR) : 현재 실행 중인 명령어를 저장. 제어장치는 명령어 레지스터에 있는 명령을 해석한 후 외부 장치에 적절한 제어 신호를 보낸다.
- 메모리 주소 레지스터(MAR) : 메모리에서 데이터를 가져오거나 반대로 메모리에 데이터를 보낼 때 주소를 지정하기 위해 사용한다. 명령어를 처리하는 과정에서 필요한 메모리 주소를 이 레지스터에 넣으면 메모리 관리자가 이를 인식하여 해당 메모리 위치의 데이터를 가져오거나 해당 메모리 위치에 데이터를 저장한다.
- 메모리 버퍼 레지스터(MBR) : 메모리에서 가져온 데이터나 메모리로 옮겨 갈 데이터를 임시로 저장, 항상 메모리 주소 레지스터와 함께 동작
1. 프로그램 카운터에는 현재 실행 중인 코드의 행 번호가 저장되고 이 번호는 제어장치에 전송
2. 제어장치가 명령어 레지스터에 있는 명령을 해석, 메모리에 있는 데이터를 가져오라는 제어 신호를 보낸다.
3. 메모리 주소 레지스터에 저장되고, 메모리 관리자는 메모리의 저장된 값을 메모리 버퍼 레지스터로 가져온다.
4. 제어 장치는 메모리 버퍼 레지스터에 저장된 값을 레지스터로 옮긴다.
지금까지 설명한 레지스터 말고도 CPU가 사용하는 레지스터는 아주 많다. 그중 프로그램 상태 레지스터는 산술 논리 연산장치와 연결되어 있으며 연산 결과가 양수인지, 음수인지, 0이 아닌지 또는 자리 올림의 유무 등을 저장한다.
프로그램 상태 레지스터는 플래스 레지스터, 상태 레지스터, 컨디션 레지스터라고도 부른다.
버스의 종류
CPU와 메모리, 주변장치 간에 데이터를 주고받을 때 사용
다음 작업을 지시하는 제어 신호, 메모리의 위치 정보를 알려주는 주소, 처리할 데이터가 오고 가며 각각 제어 버스, 주소 버스, 데이터 버스에 실린다.
제어 버스
다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다.
메모리에서 데이터를 가져올지, 처리한 데이터를 옮겨놓을지에 대한 지시 정보가 오고가는데 메모리에서 데이터를 가져올 때는 읽기 신호를 보내고, 처리한 데이터를 메모리로 옮겨놓을 때는 쓰기 신호를 보낸다.
주변 장치의 경우도 마찬가지로 하드디스크에 저장 명령을 내리거나 사운드카드에 소리를 내라는 명령을 내릴 때 제어 버스를 통해 전달, 제어 버스는 CPU의 제어장치와 연결, 메모리에서 오류가 발생, 네트워크 카드에 데이터가 모두 도착했다는 신호는 모두 제어 버스를 통해 CPU로 전달, 제어 버스의 신호는 CPU, 메모리, 주변장치와 양방향으로 오고 간다.
주소 버스
메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지를 알려주는 위치 정보(주소)가 오고 간다.
주변장치의 경우도 마찬가지로 하드디스크의 어느 위치에서 데이터를 읽어올지, 어느 위치에 저장할지에 대한 위치 정보가 주소 버스를 통해 전달, 주소 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향, CPU에서 메모리나 주변장치로 나가는 주소 정보는 있지만 주소 버스를 통해 CPU로 전달되는 정보는 없다.
데이터 버스
제어 버스가 다음에 어떤 작업을 할지 신호를 보내고 주소 버스가 위치 정보를 전달하면 데이터가 데이터 버스에 실려 목적지까지 이동한다. 메모리 버퍼 레지스터와 연결되어 있으며 양방향이다.
버스의 대역폭은 한 번에 전달할 수 있는 데이터의 최대 크기를 말한다.
버스의 대역폭은 CPU가 한 번에 처리할 수 있는 데이터의 크기와 같다. 흔히 32bit CPU, 64bit CPU라고 하는데 여기서 32bit, 64bit는 CPU가 한 번에 처리할 수 있는 데이터의 최대 크기
32bit CPU는 메모리에서 데이터를 읽거나 쓸 때 한 번에 최대 32bit를 처리할 수 있으며, 이 경우 레지스터의 크기도 32bit, 버스의 대역폭도 32bit이다. 버스의 대역폭, 레지스터의 크기, 메모리에 한 번에 저장할 수 있는 데이터의 크기는 항상 같다. 참고로 CPU가 한 번에 처리할 수 있는 데이터의 최대 크기를 워드, 버스의 대역폭과 메모리에 한 번에 저장되는 단위도 워드, 32bit CPU에서 1 워드는 32bit이다.
메모리의 종류와 부팅
메모리에는 실행에 필요한 프로그램과 데이터가 존재, CPU와 협업하여 작업이 이루어진다.
메모리를 이루는 소자 하나의 크기는 1bit로 0 또는 1이 저장된다. 그러나 소자 하나만으로 데이터를 표현할 수 없어 메모리 주소는 바이트 단위로 지정, 메모리에서 데이터를 읽거나 쓸 때는 워드 단위로 움직인다.
버스의 대역폭이 32bit인데 굳이 1bit 단위로 데이터를 옮길 필요가 없기 때문
메모리의 종류
메모리는 읽거나 쓸 수 있는 램과 읽기만 가능한 롬으로 구분
램은 무작위로 데이터를 읽어도 저장된 위치와 상관없이 같은 속도로 데이터를 읽을 수 있다는 의미에서 붙은 이름
램은 전력이 끊기면 데이터가 사라지는 휘발성 메모리와 전력이 끊겨도 데이터를 보관할 수 있는 비휘발성 메모리로 나뉜다.
휘발성 메모리
DRAM(동적 램)과 SRAM(정적 램)이 있다.
DRAM은 저장된 0과 1의 데이터가 일정 시간이 지나면 사라지므로 일정 시간마다 다시 재생시켜야한다.
DRAM의 'Dynamic'은 시간이 지나면 데이터가 사라지기 때문에 재생이 필요하다는 의미이다.
SRAM은 전력이 공급되는 동안에는 데이터를 보관할 수 있어 재생할 필요가 없다.
따라서 속도는 빠르지만 가격이 비싸다.
일반적으로 메인 메모리에는 DRAM을 사용하고, 캐시 같은 고속 메모리에는 SRAM을 사용한다.
SDRAM은 DRAM이 발전된 형태로 SRAM과는 완전히 다른 종류의 램이다.
SDRAM은 클록 틱(펄스)이 발생할 때마다 데이터를 저장하는 동기 DRAM이다.
메인 메모리를 비휘발성 메모리로 만들면 전력이 끊겨도 내용이 남기 때문에 편리할 수도 있다. 하지만 비휘발성 메모리는 전력이 끊겨도 데이터를 보관해야 하므로 메모리 내부가 복잡하고 속도가 느리며 가격이 비싸다.
그래서 아직도 메인 메모리는 휘발성 메모리를 사용하고 있다.
비휘발성 메모리
플래시 메모리, FRAM, PRAM 등이 있다. 이 중 플래시 메모리는 디지털카메라, MP3 플레이어, USB 드라이버같이 전력이 없어도 데이터를 보관하는 저장장치로 많이 사용된다. 그런데 플래시 메모리의 각 소자는 최대 사용 횟수가 제한되어 보통 소자 하나당 몇 천 번에서 만 번 정도 사용하면 제 기능을 잃는다. 따라서 SD 카드나 USB 드라이버를 오래 사용하면 성능이 저하되거나 데이터를 잃어버릴 수 있으니 주의해야 한다.
이 외에도 많이 사용되는 비휘발성 메모리는 하드디스크를 대신하도록 만든 SSD이다.
SSD는 가격이 비싸지만 빠른 데이터 접근 속도, 저전력, 내구성 때문에 개인용 컴퓨터는 물론 노트북, 스마트폰 등 많은 기기에 사용
램과 달리 롬은 전력이 끊겨도 데이터를 보관하는 것이 장점이지만 데이터를 한 번 저장하면 바꿀 수 없다. 예를 들어 CD-ROM은 데이터를 한 번만 저장할 수 있다. 이러한 특성 때문에 바이오스(Basic Input/Ouput System)를 롬에 저장한다. 롬의 종류에는 데이터를 지우거나 쓸 수 없는 마스크 롬, 전용 기계를 이용하여 데이터를 한 번만 저장할 수 있는 PROM, 데이터를 여러 번 쓰고 지울 수 있는 EPROM이 있다. EPROM은 플래시 메모리처럼 사용할 수 있지만 가격이 비싸서 잘 사용하지 않는다.
메모리 보호
일괄 처리 시스템에서는 메모리가 운영체제 영역과 사용자 영역으로 구분, 일괄 작업 시스템에서 메모리 보호는 사용자 영역의 작업이 운영체제 영역으로 침범하지 못하도록 막는 것, 현대의 운영체제는 시분할 기법을 사용하여 여러 프로그램을 동시에 실행하므로 사용자 영역이 여러 개의 작업 공간으로 나뉘어 있다. 이러한 상황에서 메모리 보호는 매우 중요한 문제, 메모리가 보호되지 않으면 어떤 작업이 다른 작업의 영역을 침범하여 프로그램을 파괴하거나 데이터를 지울 수도 있으며, 최악의 경우 운영체제 영역을 침범하면 시스템이 멈출 수도 있다. 이처럼 운영체제 영역이나 다른 프로그램 영역으로 침범하려는 악성 소프트웨어를 바이러스라고 한다.
운영체제도 소프트웨어 중 하나, 운영체제도 CPU를 사용하는 작업 중 하나이기 때문에 사용자의 작업이 진행되는 동안에는 운영체제의 작업이 잠시 중단, 운영체제의 작업이 중단된 상태에서 사용자의 작업으로부터 메모리를 보호하려면 하드웨어의 도움이 필요
메모리를 보호하기 위해 CPU는 현재 진행 중인 작업의 메모리 시작 주소를 경계 레지스터에 저장한 후 작업을 한다.
또한 현재 진행 중인 작업이 차지하고 있는 메모리의 크기, 즉 마지막 주소까지의 차이를 한계 레지스터에 저장.
사용자의 작업이 진행되는 동안 이 두 레지스터의 주소 범위를 벗어나는지 하드웨어적으로 점검함으로써 메모리를 보호
만약 두 레지스터의 값을 벗어난다면 메모리 오류와 관련된 인터럽트가 발생, 인터럽트가 발생하면 모든 작업이 중단되고 CPU는 운영체제를 깨워서 인터럽트를 처리하도록 시킨다. 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료, 모든 메모리 영역은 하드웨어와 운영체제의 협업에 의해 보호
부팅
컴퓨터를 켰을 때 운영체제를 메모리에 올리는 과정을 부팅
사용자가 전원을 켜면 롬에 저장된 바이오스가 실행, 바이오스는 CPU, 메모리, 하드디스크, 키보드, 마우스와 같은 주요 하드웨어가 제대로 작동하는지 확인, 만약 이상이 있으면 오류 메시지 출력, 없으면 하드디스크의 마스터 부트 레코드에 저장된 작은 프로그램을 메모리에 가져와 실행
마스터 부트 레코드는 하드디스크의 첫 번째 섹터를 가리키며, 운영체제를 실행하기 위한 코드인 부트스트랩이 이곳에 저장되어 있다. 부트스트랩 코드는 운영체제를 메모리로 가져와 실행하는 역할을 하는 작은 프로그램.
요즘은 USB 드라이버에도 마스터 부트 레코드를 탑재할 수 있다.
마스터 부트 레코드에 있는 부트스트랩이 메모리에 올라오면 하드디스크에 저장된 운영체제를 메모리에 불러온다. 따라서 부트 레코드가 손상되면 운영체제를 실행할 수 없다. 이는 컴퓨터 바이러스의 좋은 공격 대상, 일부 바이오스는 사용자 옵션 부분에 운영체제 보호 항목을 만들어 마스터 부트 레코드를 수정할 수 없게 한다. 만약 새로운 운영체제를 다시 설치한다면 이 운영체제 보호 옵션을 해제해야 한다.
한 컴퓨터에 운영체제 2개를 설치해보면 부트스트랩을 확인할 수 있다. 컴퓨터에 윈도우 7과 윈도우 10을 같이 설치하거나 리눅스와 윈도우 운영체제를 같이 설치하는 것이다. 이 경우 바이오스가 하드웨어 점검을 마치고 마스터 부트 레코드에 부트스트랩을 가져와 실행하면, 어떤 운영체제로 사용할 것인지 물어보는 화면이 나타난다. 이 화면이 부트스트랩 코드가 실행된 화면, 하나의 운영체제가 설치된 컴퓨터의 부트스트랩이라면 이러한 과정 없이 바로 운영체제를 메모리에 올린다.