컴퓨터 하드웨어

프로세서(Processor)
전용 레지스터
범용 레지스터
사용자 가시 레지스터
사용자 불가시 레지스터
데이터 레지스터
주소 레지스터
상태 레지스터
CPU에서 데이터를 임시로 저장을 하는 장치입니다.
데이터를 처리하거나 연산을 수행할때 데이터를 바로 메미리에서 가져오는 대신에, 데이터를 레지스터에 임시로 저장하고 필요할 때 빠르게 접근해서 작업합니다.
주소나 유효 주소를 계산하는데 필요한 주소의 일부분을 저장한다.
주소 레지스터의 저장한 값을 사용하여 산술 연산한다.
주소 레지스터(AR)에 대해서 더 알아보자 !
기준 주소 레지스터는 "시작점"이 되는 주소를 저장하는 레지스터입니다. 이를 기준으로 다른 데이터가 저장된 위치를 계산할 수 있다.
프로그램이 사용하는 메모리 블록의 시작 주소를 기준 주소 레지스터에 저장하면 다른 데이터를 빠르게 찾을 수 있다.
인덱스 레지스터는 배열와 같은 데이터 구조를 처리할 때 좋다.
여기서 인덱스는 기준 주소에 더해지는 값이다.
이것을 사용하면 배열의 특정 요소에 빠르게 접근할 수 있다 즉 배열 내의 특정 위치로 접근이 가능하다.
스택 포인터 레지스터는 스택의 현재 위치를 가리키는 레지스터이다.포인터를 모르면 클릭해보자.
함수 호출이나 복잡한 연산을 할 때 임시 데이터를 저장할 때 스택을 사용한다. 스택의 구조는 LIFO(Last In, First Out)로 작동한다.
스택 포인터는 스택에서 데이터를 넣고 뺴는 위치를 관리한다.
하나씩 알아보도록 하자
다음에 실행할 명령어의 주소를 보관하는 레지스터다.
컴퓨터가 코드를 실행할 때 순서대로 명령을 수행하기 위해, CPU는 카운터를 보고 다음 명령이 저장된 위치로 이동한다.
쉽게 설명을 하면 책을 읽을 때 "다음 읽을 페이지" 기억해주는 북마크랑 비슷하다.
현재 실행하는 명령어를 보관하는 레지스터다.
이것도 "지금 읽고 있는 현재 페이지"라고 생각하면 된다.
연산 결과를 임시로 저정하는 저장소다.
CPU가 참조하려는 데이터의 메모리 주소를 저장하는 레지스터다.
메모리에서 가져오거나 메모리에 보낼 떄 실제 데이터를 임시로 저장하는 저장장치다.
즉 메모리 주소 레지스터(MAR)이 위치를 가르키면, 메모리 버퍼 레지스터(MBR)이 그 위치에서 읽어온 데이터를 담거나, 앞서 말한 위치로 데이터를 보낼 준비를 한다.
ALU(산술 논리 장치)가 위에서 말한 레지스터를 활용하여 CPU가 계산이나 논리 연산을 할 수 있다.
메모리(Memory)
메모리는 데이터를 저장하는 장치다
위 사진은 메모리의 종류를 나타낸 것이다.
프로세서가 수행할 프로그램과 데이터를 저장한다.
가격도 저렴하고, 용량도 크다
DRAM을 주로 사용한다
CPU는 상당히 빠르고 DISK는 느려서 여기서 오는 갭으로 인해 디스크 입출력 병목현상을 주기억장치을 도입함으로써 해소를 했다.
프로세서 내부에 있는 메모리다
속도도 매우 빠르고, 가격이 비싸다
아직도 CPU는 엄청나게 빠르고 메인 메모리는 느려서 이 과정에서 메인 메모리의 입출력 병목현상 캐시(Cache) 을 도입해서 해소했다.
캐시의 동작을 알아보자
일반적으로는 하드웨어적으로 관리된다
지역성(Locality)
참조한 주소와 인접한 주소를 참조하는 특성
쉽게 말하자면 어떤 데이터에 접근했다면, 그 주분에 있는 데이터도 접근할 가능성이 높다라는 개념이다.
코드로 확인해보자
public class SpatialLocalityExample {
public static void main(String[] args) {
int[] array = new int[100];
// 배열에 데이터 초기화
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
int sum = 0;
// 배열을 순서대로 접근
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
System.out.println("Sum : " + sum);
}
}
배열의 요소를 순차적으로 접근하기 때문에, 한 번 메모리에서 가져온 다음에는 다음 인덱스도 곧바로 접근할 수 있다. 이 과정에서 공간적 지역성이 발생하고 CPU는 배열 요소들을 캐시에 미리 로드해두고 빠르게 접근이 가능하다.
한번 참조한 주소를 곧 다시 참조하는 특성
public class TemporalLocalityExample {
public static void main(String[] args) {
int data = 42;
int result = 0;
// data 여러 번 사용
for (int i = 0; i < 100; i++) {
result += data;
}
System.out.println("Result : " + result);
}
}
data라는 변수를 반복해서 사용하고 있다. 위 변수는 캐시에 저장되고 매번 메모리에서 불러오지 않고도 빠르게 접근할 수 있다. 이처럼 반복해서 참조되는 변수에 대해서는 시간적 지역성이 발생한다고 한다.
시스템 버스(System Bus)
하드웨어들이 데이터 및 신호를 주고 받는 물리적인 통로이다.
이것도 무엇인지 확인해보자
CPU와 메모리 또는 I/O 장치 간에 실제 데이터를 전달하는 역할을 맡는다.
데이터를 송수신하는 경로고, 이동하는 방향은 양방향으로 사용한다.
한번에 처리할 수 있는 데이터의 양은 32비트 기준으로는 4Byte의 데이터를 전달할 수 있다.
CPU가 메모리나 I/O 장치의 특정 위치에 데이터를 읽거나 쓸 때, 그 위치(주소)를 전달하는 역할을 한다.
CPU가 액세스할 메모리 주소를 지정하는데 사용된다
주소 버스는 단방향으로만 작동한다.
CPU --> 메모리 or I/O Device
시스템 내에서 데이터 전송 및 처리 과정에서 어떤 동작을 수행할 지 결정하는 신호로 전달한다.
제어신호는 읽기/쓰기 명령, 인터럽트 요청 등이 있다.
제어 버스는 CPU와 다른 장치간의 동기화를 맞추고 각 동작이 언제 실행될지 조정해준다.
이 버스는 단방향 또는 양방향일 수 있다
참고자료 : HPC, ChatGPT을 활용해서 작성하였습니다.