https://m.blog.naver.com/ds4ouj/222565520844?referrerCode=1
위 글을 보고 공부한 내용입니다. 자세한 내용은 위 블로그를 참고해주세요.
컴퓨터 시스템이란
하드웨어(Hardware) + 시스템 소프트웨어(System software)로 구성됩니다.
이러한 시스템에 각종 응용 소프트웨어(application software)들이 탑재되어 사용자와 상호작용합니다.
하드웨어
컴퓨터의 각종 정보가 처리되는 물리적 실체입니다.
소프트 웨어
정보들이 이동하는 방향과 정보 처리의 종류, 수행될 시간을 지정하는 명령들의 집합입니다.
소프트웨어는 하드웨어에 성능에 의존적입니다.
컴퓨터의 기본 구조
컴퓨터 하드웨어의 구성요소를 간단하게 나타낸 그림입니다.
중앙처리장치(CPU)
- 중앙처리장치(CPU)는 마이크로 프로세서라고 불리기도 합니다.
- 흔히 8비트, 32비트 64비트 컴퓨터라는 용어는 CPU가 한번에 처리하는 데이터 길이를 의미합니다.
- 컴퓨터의 이론적인 처리 속도는 CPU의 성능에 의해 결정됩니다.
CPU가 처리할 프로그램 코드와 데이터는 기억장치에 저장됩니다. 기억장치는 주기억장치와 보조기억장치로 나뉩니다.
주기억장치(main memory)
- 고속의 읽기와 쓰기가 가능합니다.
- 휘발성 기억 장치 입니다.
보조기억장치
- 주기억장치에 비해 쓰기 속도가 느립니다.
- 영구 저장이 가능합니다.
- CPU가 직접 액세스(읽기 및 쓰기)를 하지 못하고, 별도의 제어기를 통해서 접근합니다.
입출력 장치(I/O device)
- CPU 와 직접 데이터를 교환할 수 없습니다.
- 별도의 제어기가 CPU로 부터 명령을 받아 장치의 동작을 제어하고 데이터를 이동시킵니다.
정보의 표현과 저장
컴퓨터가 받아들이고 처리하는 정보의 종류로는 프로그램 코드 와 데이터가 있습니다.
컴퓨터 프로그램을 작성할 때 JavaScript, Python, Java 와 같은 고급언어를 사용하여 코드를 작성합니다. 하지만 이러한 언어들을 컴퓨터 하드웨어가 이해 할 수 있도록 기계어로 번역해주어야합니다.
이러한 기계어는 CPU의 내부구조에 따라 달라짐을 유의해야합니다.
하지만 컴파일러는 고급언어를 바로 기계어로 바꾸는 것이 아닌 어셈블리 언어 라는 중간언어를 거쳐 기계어로 변환합니다.
중간언어를 사용하는 이유는 컴파일러가 고급언어를 바로 기계어로 변환하는데 한계가 있고, 때로는 속도나 메모리 사용등의 측면에서 효율적인 코드를 작성하기위해 개발자가 직접 어세블리어로 코드를 작성해야할 수 있기때문입니다.
어셈블리어는 어셈블러를 통해 기계어로 변환됩니다.
변환된 기계어 프로그램은 다음과 같습니다.
이 예시는 기계어가 두개의 필드들로 구성된다고 가정하였습니다.
연산 코드(operation code field)에 저장된 001은 '레지스터 A로 적재하라'는 연산을 지정해주는 비트들이고, 오퍼랜드(operand field)의 00101은 적재될 데이터가 저장되어 있는 기억장치 주소를 가리킵니다. 위의 기계어에서는 오퍼랜드 필드가 5번지를 가리키는 것을 알 수있습니다.
따라서 두개의 필드에 따라 해석하면 '기억장치 5번지의 내용을 읽어서 레지스터 A에 저장하라'는 명령어를 해석할 수있게 됩니다.
위와 같이 명령어에 들어갈 필드의 종류와 각 필드의 비트수에 대한 구성을 명령어 형식 이라고 합니다.
번역된 기계어들은 위 그림과 같이 순서대로 기억장치에 저장됩니다. 기억장치에 데이터들과 기계어들이 함께 저장되어있는 모습을 보여주고 있습니다.
여기서 각 기억장소에 저장되는 데이터 단위를 8비트 예시를 들었는데, 이는 CPU에 의해 한번에 처리될 수 있는 비트 그룹 수치를 나타냅니다. 이를 단어(word) 라고 부르기도 합니다.
시스템의 구성
컴퓨터 주요 구성 요소들인 CPU와 기억장치 및 I/O 장치들이 어떻게 서로 접속되고 상호작용하는지 살펴보겠습니다.
위의 그림은 CPU와 시스템 내의 다른 요소들 사이에 정보를 교환하는 통로인 시스템 버스를 보여주고 있습니다.
시스템 버스는 세가지의 하부버스들로 이루어집니다.
주소버스
주소 버스는 데이터의 근원지나 목적지의 일정한 메모리 주소를 전달하는 버스입니다.
주소 버스의 폭은 최대 기억장치의 용량을 결정지어 주며 32개의 주소 버스를 지닌 컴퓨터 시스템은 2^32개의 메모리 위치를 할당할 수 있습니다.
데이터 버스
데이터 버스는 CPU가 기억장치 혹은 I/O 장치 사이에 데이터를 전송하기 위한 신호선들의 집합입니다.
데이터 버스의 폭은 한번에 전송될 수 있는 데이터의 비트 수를 결정하며, 만약 데이터 버스가 32비트인 시스템이라면 CPU가 기억장치로 부터 한번에 32비트씩 읽어올 수 있습니다.
제어 버스
CPU가 시스템 내의 각종 요소들의 동작을 제어하는데 필요한 신호선들의 집합입니다.
가장 기본적인 제어 신호로는 기억장치 읽기,쓰기 와 I/O 읽기,쓰기 신호가 있습니다.
주소 버스의 정보는 CPU에 의해 발생되어 기억장치와 I/O 장치로 보내지는 정보이기 때문에 주소 버스는 단방향성을 가지며 데이터 버스는 기억장치에서 데이터를 읽어오고 쓰는 동작을 모두 지원해야하기 때문에 양방향성 전송이 가능해야합니다.
CPU 의 액세스
CPU가 데이터를 기억장치의 특정 장소에 저장하거나 이미 저장되어 있는 내용을 읽는 동작을 액세스 한다 라고 합니다.
CPU가 기억장치의 특정 기억 장소로부터 데이터를 읽고자 할때 기억장치로 보내주어야 하는 정보는 주소와 읽기 신호입니다. 그리고 데이터를 저장하려는 경우에는 해당 기억 장소의 주소와 데이터 및 쓰기 신호를 보내주어야 합니다. 따라서 CPU와 기억장치들 사이에는 이러한 정보들의 전송 통로인 주소버스, 데이터 버스 및 제어 신호선들이 접속되어야 합니다.
CPU는 데이터를 저장할 기억장소의 주소와 저장할 데이터를 각각 주소 버스와 데이터 버스를 통하여 보내면서 동시에 쓰기 신호를 활성화 시킵니다. 이 신호들은 모두 기억장치 쓰기 동작이 완료될 때까지 그대로 유지되어야 하며 CPU가 주소와 데이터를 보낸 순간부터 저장이 완료될 때까지의 시간을 기억장치 쓰기 시간이라고 부릅니다.
CPU가 기억장치로부터 데이터를 읽는 동작의 시간 흐름도는 (b)와 같이 나타낼 수있습니다. 이 동작을 위해 CPU는 데이터가 저장되어 있는 기억 장소의 주소를 주소버스를 통하여 기억장치로 보내면서 동시에 읽기 신호를 활성화시킵니다. 그러면 일정 지연시간이 경과한 후에 기억장치로부터 읽혀진 데이터가 데이터 버스상에 실리며, CPU는 이 데이터를 버스 인터페이스 회로를 통해 읽어들이게 됩니다
여기서 지연시간이라는 용어가 등장하는데 지연시간이란?
주소를 해독(decode)하는데 걸리는 시간과 기억장치 내부에서 데이터를 인출하는데 걸리는 시간을 합한 시간입니다.
그리고 CPU가 주소를 발생한 시간부터 읽기 동작이 완료될때까지의 시간을 기억장치 읽기 시간(memory read time)이라고 합니다.
CPU와 I/O 장치의 접속
I/O 장치에는 외부와의 데이터 입력 및 출력을 위한 각종 주변장치들이 모두 포함됩니다.
그리고 보조저장장치들도 CPU가 직접 제어하거나 액세스 할 수없으며 I/O 장치들과 마찬가지로 별도의 인터페이스 회로 혹은 제어기를 통하기 때문에 I/O 장치들과 같은 방법으로 CPU에 접속되어야 합니다.
CPU가 키보드로부터 데이터를 읽어 들이는 과정은 다음과 같습니다. 키보드의 어느 한키가 눌러지면 그에 대응되는 8-비트 데이터가 키보드 제어기로 전송되어 데이터 레지스터(data register)에 저장되며 동시에 상대 레지스터(status register)의 지정된 비트가 설정됩니다.
상태 레지스터에 설정된 비트는 입력 데이터가 준비되었다는 것을 의미하기에 입력 준비 비트(In_RDY bit)라고 부르기도 합니다.
CPU는 데이터 입력을 원하는 시점에서 먼저 상태 레지스터를 읽어들여 In_RDY 비트가 1로 설정되어있는지 검사합니다. 만약 설정되어있다면 즉시 데이터 레지스터의 내용을 CPU로 읽어들임으로써 데이터 입력 과정이 완료됩니다. 만약 In_RDY 비트가 1로 설정되지 않았다면 CPU는 상태 레지스터의 내용을 읽고 검사하는 동작을 반복하면서 기다립니다. 이는 In_RDY 비트가 1로 설정될때까지 즉, 키가 눌러져서 데이터가 들어올때까지 계속됩니다.
CPU가 데이터를 프린트로 출력하는 과정도 키보드를 입력받는 것과 유사합니다. CPU는 데이터를 프린터로 보내기전에 먼저 프린터 제어기내의 상태 레지스터를 읽어서 데이터 출력 준비 비트 Out_RDY bit를 검사합니다. 이것은 프린터가 이전에 받은 데이터에 대한 프린트 동작을 완료하고 다음 프린트 동작을 시작할 준비가 되었는지를 검사하는 절차입니다. 만약 Out_RDY bit가 1로 설정되었다면 CPU는 프린트할 데이터를 프린터 제어기의 데이터 레지스터로 쓰고, 프린트 시작 신호를 보냅니다. 그러면 제어기는 트린터의 하드웨어를 적절히 구동하여 내용을 프린트하게 됩니다. 만약 Out_RDY 비트가 1로 설정되지 않았다면 CPU는 키보드의 입력을 기다리는 것과 마찬가지로 비트 검사를 반복하면서 기다립니다.
위에서 언급한 데이터 레지스터는 CPU와 I/O 장치 사이에서 임시 저장장소 역할을 하기 때문에 데이터 버퍼(data buffer)라고 부르기도 합니다.
하드디스크, SSD, CD-ROM과 같은 보조저장장치들도 각 장치를 위한 제어기를 통하여 위와 유사한 방법으로 접속합니다. 그러나 키보드의 경우에는 데이터가 바이트 단위로 전송되지만, 보조저장 장치의 경우에는 블록 단위로 전송이 이루어지기 때문에 제어기 내에 적어도 한 블록 이상을 임시 저장할 수있는 데이터 버퍼가 저장되어야합니다. 여기서 블록은 512바이트, 1024 바이트, 4096 바이트 단위로 키보드에 비해 굉장히 큰값을 가집니다.
이제 CPU가 시스템에 접속되어 있는 I/O 장치나 보조 저장장치를 직접 제어하지 않고 각 장치의 제어기를 이용한다는 것을 알았습니다. 따라서 CPU는 각 장치의 제어기가 수행할 수있는 동작을 지정하는 명령을 보내거나 상태 정보와 데이터를 주고받을 수있어야 하고, 이를위해 CPU는 각 I/O 장치의 제어기를 구분하고 정보를 주고받을 수있어야 합니다.
이를위해 각 제어기내에 있는 상태 레지스터와 데이터 레지스터를 각각 기억장치로 간주하고 주소를 한개씩 배정함으로써 CPU는 해당 레지스터들에 대하여 기억 장치와 같은 방법으로 읽기 및 쓰기 동작을 수행할 수있습니다.
'CS > 컴퓨터구조' 카테고리의 다른 글
패리티 비트 & 해밍 코드 (0) | 2023.04.04 |
---|---|
CPU의 구조와 기능 (0) | 2023.04.04 |
캐시 메모리의 쓰기 정책 / 버퍼와 캐시의 차이 (0) | 2023.04.02 |
캐시 메모리 (2) | 2023.04.01 |
부동소수점에 대한 이해 (0) | 2023.03.31 |