혼자 공부하는 컴퓨터구조 + 운영체제 - 강민철 지음의 요약본이다.
1. 컴퓨터 구조의 개요
컴퓨터 부품의 종류와 구조
- 컴퓨터가 이해하는 정보는 데이터와 명령어
- 컴퓨터의 핵심 4가지 부품 : CPU, 메모리, 보조기억장치, 입출력장치
- 보조 기억 장치에 저장된 데이터와 명령어를 메모리로 불러온다. 전원이 꺼져도 데이터를 보관하기 위해 보조기억장치를 사용한다.
- 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다.
- CPU는 메모리에 저장된 명령어를 읽어들이고, 해석하고, 실행한다.
- ALU(Arithmetic Logic Unit)은 산술 연산을 한다. 레지스터는 프로그램을 실행하는 데 필요한 값들을 임시로 저장하는 CPU 내부의 저장 장치이다. 제어 장치는 제어 신호(control signal)를 전기 신호로 내보내고 명령어를 해석한다.
CPU와 메모리의 동작 흐름
- CPU가 메모리에 저장된 값을 읽고 싶을 때는 메모리 읽기, 저장하고 싶을 때는 메모리 쓰기 제어 신호를 메모리에 보낸다.
시스템 버스
시스템 버스는 주소 버스, 데이터 버스, 제어 버스로 구성된다. 위 예시에서 메모리 읽기, 쓰기 등 제어 신호가 필요할 때는 제어 버스를 통해 전기 신호가 전달되고 어떤 메모리 주소나 데이터를 전달하기 위해서는 각 버스를 사용한다.
2. 데이터
-아스키(ASCII, 128개) -> 확장형 아스키(Extended ASCII, 256개) 이후 다양한 인코딩 방식이 정해졌다.
-완성형 인코딩은 완성된 하나의 글자마다 고유한 코드를 부여하는 방식이다. 대표적인 코딩 방식으로 EUC-KR이 있다.
-조합형 인코딩은 초성, 중성, 종성에 고유한 코드를 부여하는 방식이다.
-CP949(Code Page 949)는 EUC-KR이 표현하는 2,350개 정도의 부족한 한글 단어 표현하고자 마이크로소프트에서 만들어진 인코딩 방식이다. 다만 CP949도 한글 전체를 표현하기에는 모자라다.
-전 세계 모든 글자를 표현하기 위해 규격화한 것이 유니코드(Unicode)이며, 이중 UTF-8은 1~4 바이트까지 사용하여 문자들을 표현한다.
3. 명령어
-명령어는 연산 코드(operation code, 연산자)와 오퍼랜드(operand, 피연산자)로 구성된다.
-어셈블리어로 보는 명령어 예시
연산코드 오퍼랜드
push rbp
mov rbp, rsp
mov eas, DWORD PTR [rbp-8]
add eax, edx
pop rbp
ret
-연산코드는 크게 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어의 종류가 있다.
ex) MOVE: 데이터를 옮겨라, JUMP: 특정 주소로 실행 순서를 옮겨라
-명령어 표현에 길이 제한이 있으므로, 보통 오퍼랜드 필드에는 메모리나 레지스터의 주소를 담는다.
4. CPU의 작동 방식
ALU 연산
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다. 따라서 레지스터에 값을 저장한다.
- 음수값, 올림수, 오버 플로우 등을 표시하기 위해 플래그 레지스터에 값을 담는다. 오버플로우는 연산 결과가 연산 결과를 담을 레지스터의 크기보다 큰 상황을 말한다.
- 다양한 상태 플래그 레지스터 종류(출처: 위키피디아 상태 레지스터)
제어장치
제어장치는 제어 신호를 내보내고 명령어를 해석한다. 전기 신호를 통해 컴퓨터 부품들을 관리하고 작동시키는 장치이기 때문에 CPU의 구성 요소 중 가장 정교하게 설계된 부품이다.
- 클럭(clock) : 컴퓨터의 모든 부품이 움직이는 시간의 최소 단위 주기. 컴퓨터의 명렁어는 여러 클럭에 걸쳐 실행될 수 있다.
- 해석할 명령어 : 명령어 레지스터에서 제어 장치로 전달된다.
레지스터
수많은 종류의 레지스터 중 반드시 알아야할 기본적인 레지스터는 다음과 같다.
1. 프로그램 카운터
2. 명령어 레지스터
3. 메모리 주소 레지스터
4. 메모리 버퍼 레지스터
5. 플래그 레지스터
6. 범용 레지스터
7. 스택 포인터
8. 베이스 레지스터
메모리에 저장된 프로그램을 실행하는 과정과 레지스터의 동작
- 순차적으로 프로그램을 읽어들이고 실행할 수 있는 것은 프로그램 카운터(Program Counter)가 계속해서 증가하기 때문이다.
- 메모리 주소 레지스터에 등록된 명령어에 의해 제어장치에서 메모리 읽기 명령이 실행된다.
- 1000번지에 있는 명령어 및 데이터값은 메모리 버퍼 레지스터에 전달되고, 이것이 명령어 레지스터에 전달되어 제어장치에서 다음 내용을 실행한다.
명령어 사이클과 인터럽트
- 명령어 사이클은 CPU가 정해진 명령어들을 처리하는 흐름이다. 인터럽트는 명령어 사이클 도중 흐름이 끊어지는 상황을 말한다.
- CPU의 사이클은 인출 사이클, 실행 사이클, 간접 사이클, 인터럽트 사이클로 구성된다.
- 인출 사이클과 실행 사이클은 위 메모리에 저장된 프로그램을 실행하는 과정과 레지스터의 동작 부분에 표현된 과정과 같다. 즉 메모리에서 명령어와 데이터를 인출하는 과정이 인출 사이클이고 이것을 실행하는 과정이 실행 사이클이다.
- 간접 사이클은 간접 주소 지정방식과 같이 실제 데이터가 있는 메모리 주소를 추가적으로 접근해야할 때 사용하는 사이클이다.
- 인터럽트에는 동기 인터럽트(synchronous interrupts), 비동기 인터럽트(asynchronous interrupts)가 있다. 동기 인터럽트는 CPU가 명령어들을 수행하다가 예기치 못한 상황에 발생하는 에러, 예외(exception)이다. 비동기 인터럽트는 주로 입출력장치에 의해 발생하는 인터럽트이다. 따라서 하드웨어 인터럽트라고 한다. 대체로 입출력 장치는 CPU에 비해 속도가 느리기 때문에, CPU에게 처리 요청을 받은 입출력 장치가 처리를 완료하고 나면 그때 CPU에게 처리 완료 알림을 주는 방식이라고 생각하면 된다.
- 인터럽트 플래그(interrupt flag)는 하드웨어 인터럽트를 받아들일지, 무시할지 결정한다. 가능, 불가능으로 표시되어 CPU의 인터럽트 가능 여부를 결정한다. 다만, 정전이나 하드웨어 고장으로 인한 불가피한 인터럽트는 인터럽트 플래그와 상관없이 동작한다.
- 인터럽트 서비스 루틴(ISR: Interrupt Service Routine, interrupt handler)는 어떤 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램이다.
- 인터럽트 벡터(interrupt vector)는 인터럽트 서비스 루틴을 식별하기 위한 시작 주소이다.
- 인터럽트 서비스 루틴을 실행할 때 기존 레지스터에 있는 값들은 모두 메모리의 스택 영역에 보관되었다가, 다시 정상적인 루틴으로 복귀했을 때 사용된다.
'Computer Science > Introduction' 카테고리의 다른 글
9혼자 공부하는 컴퓨터구조 + 운영체제: 3. 입출력 장치, 운영체제, 프로세스와 스레드 (0) | 2022.12.12 |
---|---|
혼자 공부하는 컴퓨터구조 + 운영체제: 2. CPU 처리, 메모리, 보조기억장치 (0) | 2022.12.05 |
12. 중앙 처리 장치, 레지스터 (0) | 2022.05.15 |
11. 시간표현과 상태기억: Gate S-R 래치, Gate D 래치, 플립플롭, 카운터 (0) | 2022.05.03 |
10. 시간표현과 상태기억: 발진자, 클럭, 래치 (0) | 2022.05.01 |