[CS] 컴퓨터 구조

김상우·2023년 2월 10일
3

개발자 면접 준비

목록 보기
4/6

💁🏻‍♂️ 면접을 위한 컴퓨터공학 개념 정리 - [컴퓨터구조] 편

🧑🏻‍💻 공부 자료
1. 운영체제 공룡책
2. 혼공컴운(강민철)
3. 깃허브 + 구글링


컴퓨터 구조 개요

컴퓨터 구조 지식은 크게 두 가지로 나뉜다.

1. 컴퓨터가 이해하는 정보
데이터 / 명령어

2. 컴퓨터의 4가지 핵심 부품
CPU / 주기억장치 / 보조기억장치 / 입출력장치

컴퓨터 구조를 알아야 하는 이유 : 프로그래밍 문법만으로는 알기 어려운 성능/용량/비용을 고려하면서 개발할 수 있다. 문제 해결 능력이 향상된다.


데이터

문자 표현

컴퓨터는 결국 0, 1 밖에 인식하지 못한다. 그러면 한글과 영어, 특수문자는 어떻게 받아들일까.

'A' 라는 데이터를 0 과 1 을 사용한 데이터로 변환시켜서 이해한다. 그리고 문자를 어떤 숫자로 변환시키는가에 대한 약속은 이미 세상에 정해져있다.

예를 들어 'A' 는 65 (10000001) 로 변환된다. 이 변환을 인코딩이라고 한다.

여러가지 규약이 있지만 가장 널리 사용하는 건 유니코드다. 유니코드에서 인코딩하는 방법에는 UTF-8, UTF-16 등이 있다.


실수 표현

2진법으로 소수구하기

0.625 를 2진법으로 표현하기
소수부에 2를 곱하는데 그 결과가 1로 떨어질 때까지 혹은 똑같은 소수점이 나올 때까지 반복한다.

0.625 x 2 = 1.250 (정수부는 버린다)
0.250 x 2 = 0.500
0.500 x 2 = 1.000

위에서부터 차례대로 가져온다 -> 0.101


컴퓨터에서 실수를 표현하는 방식 2가지

1. 고정소수점

실수를 정수부와 소수부로 나눈다.
소수점의 자리가 움직이지 않음. 고정됨.

예를들어 7.625 라는 소수가 있다
부호 0
정수부 000 0000 0000 0111
소수부 0000 0000 00000 0101
이렇게 저장된다.

위와 같이 부분을 나눈다면 대략 -2^16 < x < 2^16 범위의 수를 표현할 수 있다.

장점 : 표현 방식이 간단하다.
단점 : 표현할 수 있는 범위가 상대적으로 적다.


2. 부동소수점

실수를 지수부와 가수부로 나눈다.
부동소수점의 부동은 不動 (움직이지 않음) 이 아니라 浮動 (유유히 떠다님, floating) 의 의미다.
고정소수점과 반대로 소수점이 움직인다.

예를들어 7.625 는 111.101 로 표현이 됐었는데, 1.11101 * 2^2 로 표현한다.
지수에는 그러면 2(10) 을 넣으면 되느냐. 그렇지 않다. IEEE 표준에서 정해준 'bias' 라는 값을 더해서 넣어야 한다. 32 비트일 때 bias 는 127 이다. 그래서 2 + 127 = 129 (1000 0001) 을 넣어야 한다. 이는 지수가 음수일 경우를 고려하기 위해서다.
0~127 구간은 음수, 128~255 구간은 양수를 의미한다.

따라서
부호 0
지수부 1000 0001
가수부 1110 1000 0000 0000 0000 000
이렇게 저장된다.

위와 같이 부분을 나눈다면 지수부의 크기가 2^8 개이기 때문에 고정 소수점보다 훨씬 넓은 범위의 수를 표현할 수 있다.

장점 : 표현할 수 있는 범위가 상대적으로 넓다.
단점 : 실수 연산이 부정확할 수 있다. 예를 들어 0.3을 2진수로 변환하면 0.0100110011.. 처럼 특성 수가 무한히 반복되는데 비트 수의 한계로 정확히 표현할 수 없다.


패리티 비트, 해밍 코드

데이터 오류 검출 방식

패리티 비트
짝수 패리티 : 데이터에서 1의 개수를 짝수로 맞춤.
홀수 패리티 : 데이터에서 1의 개수를 홀수로 맞춤.
예를들어 001 에 짝수 패리티를 붙인다면 0011이 된다.
특징 : 2개 비트가 손실되면 알아차릴 수 없다. 오류가 났는지 알아차릴 뿐, 수정할 순 없다.

해밍 코드
데이터를 전송할 때 패리티 비트를 적절히 섞어 1비트의 에러를 정정할 수 있게 만든 코드


명령어

컴퓨터는 "명령어를 처리하는 기계"

C++, Java, Python, Swift 와 같은 프로그래밍 언어로 만든 소스코드는 컴퓨터 내부에서 명령어로 변환된다.

고급언어 : 사람을 위한 언어. ex) C++, Python, Swift
저급언어 : 컴퓨터를 위한 언어. ex) 기계어 (0, 1), 어셈블리어


컴파일과 인터프리트

고급언어를 컴퓨터가 이해할 수 있는 저급언어로 변환하는 과정에는 크게 2가지가 있다.

1. 컴파일
고급언어 소스코드 전체 파일을 저급언어 전체 파일로 변환시킨다. ex) C, Swift

2. 인터프리트
고급언어 소스코드를 한 줄씩 읽어 내려가며 한 줄씩 저급언어로 번역한다. ex) Python

일반적으로 컴파일 언어가 인터프리트 언어보다 속도가 빠르다.


명령어의 구조

연산코드와 오퍼랜드

연산코드 : 어떤 연산을 할 것인지 (덧셈, 뺄셈, 데이터 전송, 저장 등)
오퍼랜드 : 피 연산자

주소 지정 방식

"10 을 더한다" 라는 명령어에서, 오퍼랜드에 직접적으로 10을 저장할 수 있겠지만, 10이라는 데이터가 메모리에 저장된 주소를 저장하는 방식이 선호된다.

주소를 어떤식으로 저장하냐에 따라 다양한 주소 지정 방식들이 있다.

즉시 주소 지정 방식 : 직접 10을 저장
직접 주소 지정 방식 : 메모리에서 10이 저장된 주소를 저장
간접 주소 지정 방식 : 메모리에서 10이 저장된 주소가 저장된 주소를 저장
레지스터 주소 지정 방식 : 레지스터에서 10을 저장
레지스터 간접 주소 지정 방식 : 레지스터에서 10이 메모리에 저장된 주소를 저장


컴퓨터의 4가지 핵심 부품

컴퓨터의 4 가지 핵심 부품

CPU / 주기억장치 / 보조기억장치 / 입출력장치

1) CPU

중앙처리장치 (Core Processing Unit)
컴퓨터의 두뇌와 같은 장치. 메모리에 저장된 명령어를 받아들이고, 명령어를 해석하고, 실행하는 부품.

[ CPU 내부 구성 요소 ]

  • ALU (산술 연산 장치) : 사칙연산, 논리연산 등 연산을 담당하는 장치
  • Control Unit (제어 장치) : 제어신호를 보내고 명령어 (메모리 읽기, 쓰기 등) 를 해석하는 장치
  • Register Set (레지스터들) : 메모리에서 온 정보를 임시 저장해서 속도 성능을 향상시키는 장치
  • 그 밖에 MMU, TLB, PTBR 등이 있다. 이에 대해서는 운영체제에서 다시 정리한다.

2) 주기억장치

현재 실행하는 프로그램의 데이터와 명령어를 저장하는 장치.
주기억장치는 컴퓨터구조에서 편하게 메모리라고 부른다.
일반적으로 RAM 을 의미. RAM 은 휘발성이라는 특징을 가진다.
ROM 이라는 메모리 종류도 있는데, 비휘발성이며 보통 BIOS 를 저장한다.

3) 보조기억장치
영구적으로 저장할 데이터와 명령어를 저장하는 장치.
하드디스크, USB 메모리 등이 보조기억장치다.

4) 입출력장치
마이크, 스피커, 키보드, 프린터 등 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 주고받는 장치
보조기억장치도 입출력장치로 볼 수 있다. 그래서 보조기억장치와 입출력 장치를 주변장치라고 통칭하기도 한다.

메인보드와 버스
앞서 정리한 4가지 핵심 부품은 메인보드에 장착된다. 그리고 핵심 부품들은 버스라는 데이터 통로로 데이터를 주고받는다.

컴퓨터 내부에는 다양한 버스들이 있지만 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스다.

시스템 버스 구성

  1. 주소 버스 : 메모리 주소를 주고받는 통로
  2. 데이터 버스 : 데이터를 주고받는 통로
  3. 제어 버스 : 제어신호를 주고받는 통로

CPU

CPU 내부에는 대표적으로 ALU, 제어장치, 레지스터 셋이 있다.
그 밖에 MMU, TLB, PTBR 등도 있지만, 이에 관해서는 운영체제 게시글에 정리한다.


ALU

받아들이는 정보
레지스터를 통해 피연산자를 받아들인다.
제어장치로부터 어떤 연산을 수행할지 제어신호를 받아들인다.

내보내는 정보
레지스터에 연산결과를 내보낸다.
플래그 레지스터에 플래그를 내보낸다.

부호 플래그 : 양수 / 음수
제로 플래그 : 0 / 0이 아님
캐리 플래그 : 캐리 발생 x / o
오버플로우 플래그 : 오버플로우 발생 x / o
인터럽트 플래그 : 인터럽트를 받아들임 불가능 / 가능
슈퍼바이저 플래그 : 현재 CPU 명령어 실행 모드 (유저모드) / (커널모드)


제어장치

받아들이는 정보
클럭 신호
명령어 레지스터로부터 해석할 명령어 받아들임
플래그 레지스터로부터 플래그 값 받아들임
시스템 버스 중 제어 버스로부터 제어 신호 받아들임

내보내는 정보
1. CPU 내부에 전달하는 정보
ALU에 수행할 연산 제어 신호
레지스터 간에 데이터를 이동시키기거나 해석하기 위한 제어신호
2. CPU 외부에 전달하는 정보
메모리에 저장된 값을 읽거나 쓰기 위한 제어신호
입출력장치의 값을 읽거나 쓰기 위한 제어신호


레지스터

알아야 할 웰노운 레지스터들

1. 프로그램 카운터
메모리에 담긴 프로그램 명령어의 주소를 저장하는 레지스터. 프로그램 카운터의 값을 읽고 프로그램의 어느 부분부터 명령어를 시작시키면 될지 판단할 수 있다.

2. 명령어 레지스터
해석할 명령어, 즉 메모리에서 가져온 명령어를 저장하는 레지스터. 제어장치는 명령어 레지스터의 명령어를 받아들여 해석하고 제어신호를 뿜는다.

3. 메모리 주소 레지스터
메모리의 주소를 저장하는 레지스터. CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 주고 받는다.

4. 메모리 버퍼 레지스터
메모리의 값을 저장하는 레지스터. 메모리와 주고받을 그 값을 저장하는 레지스터. 데이터 버스로 값을 주고 받는다.

5. 범용 레지스터
말그대로 다양한 상황에서 유연하게 사용할 수 있는 레지스터. 주소값 혹은 데이터 값 둘 다 저장 가능하다.

6. 플래그 레지스터
플래그를 담는 레지스터. ALU 가 보낸 플래그 값이 저장되는 곳이다.


명령어 사이클


컴퓨터에서 명령어를 처리하는 정형화된 사이클.
인출 사이클 : 메모리에서 CPU로 명령어를 가져오는 사이클
실행 사이클 : CPU에서 명령어를 실행하는 사이클
인터럽트 사이클 : 인터럽트 발생시 수행하는 인터럽트 서비스 루틴
간접 사이클 : 간접 주소 지정 방식으로 명령어를 저장했을 경우, 메모리에 한번 더 갔다와야 실제 피연산자 값을 알 수 있다. 이 단계를 간접 사이클이라고 한다.


인터럽트

CPU가 수행중인 작업을 방해하는 (interrupt) 신호를 인터럽트라고 한다.
CPU가 꼭 처리해야할 다른 작업이 (이벤트) 생겼을 때 인터럽트가 발생한다.

1) 동기 인터럽트
CPU에 의해 발생하는 인터럽트
ex) 예외 (0으로 나누기), 폴트 (페이지 폴트), 트랩, 소프트웨어 인터럽트 (시스템콜) 등

2) 비동기 인터럽트
는 CPU 외부의 원인에 인해 발생하는 인터럽트다.
ex) 하드웨어 인터럽트 - 마우스 클릭 이벤트, 키보드 입력 이벤트 등
ex) 막을 수 없는 인터럽트 - 정전, 하드웨어 고장


하드웨어 인터럽트 실행 순서

이때 4번의 과정에서 백업은 어디에다가 해둘까?
메모리의 스택 영역에 백업을 해둔다.
그래서 인터럽트 서비스 루틴이 끝났을 때 스택에 쌓인 백업 데이터를 pop 해와서 가져온다.


명령어 파이프라인

명령어 처리 과정을 클럭 단위로 나눠서 병렬처리 하는 기법

파이프라이닝이 일반적으로 높은 성능을 가져오긴 하지만, 성능 향상에 실패하는 경우도 있다.
이러한 상황을 파이프라인 위험이라고 부르고, 데이터 위험, 제어 위험, 구조적 위험 등의 이유가 있다.


슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 처리 기법

이론적으로는 파이프라인 개수에 비례해 처리 속도가 증가할테지만, 파이프라인의 위험도 증가 때문에 비례해서 처리 속도가 증가하지는 않는다.


CISC 와 RISC

ISA (Instruction Set Architecture)
CPU 는 명령어를 처리하는 장치다. 그런데 이 세상 모든 CPU 들이 똑같이 생긴 명령어를 처리하지는 않는다. 세상에는 수많은 CPU 제조사들이 있고, CPU 마다 규격과 기능, 만듦새가 다르기 때문.

CPU 가 이해할 수 있는 명령어들의 집합, 명령어 집합 구조를 ISA 라고 한다.
가령 인텔의 노트북 속 CPU는 x86 혹은 x86-64 ISA 를 이해한다.
애플의 아이폰 속 CPU 는 ARM ISA 를 이해한다.

이 둘은 서로의 명령어를 이해할 수 없다. ISA 가 다르기 때문.
ISA 는 한마디로 CPU의 언어라고 할 수 있다.

ISA가 다르다는 건 같은 명령어를 처리하더라도 어셈블리어도 다르다는 것이다.


x86-64 vs ARM

동일한 소스코드를 각각 x86-64, ARM 을 사용하는 컴퓨터로 컴파일 한 결과는 다음과 같다.

동일한 소스코드임에도 불구하고 어셈블리어가 달라진 것을 확인할 수 있다.


CISC

Complex Instruction Set Computer
ex) Intel 의 x86-64, 모토롤라

직역하면 복잡한 명령어 집합을 활용하는 컴퓨터.
명령어의 종류가 매우 다양하고 복잡하다.
위의 어셈블리어를 보면 알 수 있듯이 명령어의 길이가 짧아 메모리를 아낄 수 있다는 것이 장점이다.
하지만 명령어가 워낙 다양하기 때문에, 명령어마다 수행시간이 가지각색이다. 따라서 클럭 단위로 일정하게 딱딱 나눠서 병렬처리하기 힘들어진다. 이는 파이프라이닝을 어렵게 만들고 성능 저하를 유발한다.


RISC

Reduced Instruction Set Computer
ex) 애플의 iOS - ARM 아키텍처

CISC 에 비해 명령어의 종류가 적다. 그리고 CISC의 어셈블리어보다 명령어의 길이가 길다.
하지만 명령어의 수행 시간이 비교적일정하기 때문에 파이프라인을 설계하는데 유리하다.
그래서 좋은 성능을 기대할 수 있다.

ARM = Advanced RISC Machine. 진보된 형태의 RISC.
ARM 은 결국 RISC다.


CISC vs RISC


메모리

주기억장치에는 크게 RAM과 ROM 두 가지가 있다.


RAM

RAM 은 휘발성 저장 장치다. 전원을 끄면 저장된 내용이 모두 삭제된다. 자유롭게 읽고 쓸 수 있다. 현재 사용중인 프로그램(프로세스)의 데이터가 저장된다.

DRAM
Dynamic RAM. 동적램. 시간이 지나면 저장된 데이터가 점차 동적으로 사라진다. 그렇기 때문에 데이터의 소멸을 막기위해서 일정한 주기로 데이터를 재활성화 시켜줘야만 한다.
그럼에도 컴퓨터의 메인 메모리로 DRAM을 사용하는데, 그 이유는 집적도가 높고, 저렴하기 때문에 대용량 설계가 용이하기 때문이다.

(집적도가 높다 = 더 작고 빽빽하게 만들 수 있다)

SRAM
Static RAM. 정적램. 시간이 지나도 저장된 데이터가 변하지 않는다. 주기적으로 데이터를 재활성화 해줄 필요가 없고 속도가 빠르다.
하지만 집적도가 낮고 소비 전력이 크며 가격이 비싸기 때문에 메인 메모리로 사용하지는 않는다. 보통 캐시 메모리로 많이 사용한다.

SDRAM
이름만보면 SRAM 과 DRAM 을 합친것처럼 보이지만 전혀 관계없다.
Synchronous Dynamic RAM. 클럭 신호와 동기화된 발전된 형태의 DRAM.
'클럭 신호와 동기화 되었다'는 말은 클럭 타이밍에 맞춰 CPU와 정보를 주고 받을 수 있음을 의미.
한마디로 클럭 타이밍에 맞춰 CPU와 정보를 교환할 수 있는 DRAM.

DDR SDRAM
Double Data Rate SDRAM. 대역폭을 넓혀 속도를 빠르게 만든 SDRAM. 대역폭이란 데이터를 주고 받을 수 있는 통로의 너비. 최근 가장 흔히 사용되는 장치다.
DDR SDRAM 은 한 클럭에 두 번씩 CPU와 데이터를 주고 받을 수 있다.


ROM

ROM 은 비휘발성 저장장치다. 전원을 꺼도 저장된 내용이 삭제되지 않는다. 일반적으로는 Read-only 메모리이다. 그래서 변경할 일이 거의 없는 데이터를 저장한다. 예를들어 기본 입출력 시스템 프로그램, 자가 진단 프로그램, Bios 가 있다.

MASK ROM
일반적인 ROM. 제작사에서 ROM 생성 시 데이터를 박아두고, 변경을 할 수가 없다.

PROM
1회에 한정해서 데이터를 쓸 수 있다.

EPROM
Erasable PROM. 저장되어있는 데이터를 지우고 쓸 수있는 ROM. 데이터를 지우는 방법에 따라 EEPROM, UVEPROM 으로 분류한다.

EERPOM
Electronically Erasable PROM. 고전압으로 데이터를 지우고, 삭제된 공간에 다시 데이터를 쓸 수 있다. 하지만 자주 지우는 것을 권장하지 않는다.
ex) 아이폰은 EEPROM 을 사용해서 장치의 일련 번호 및 하드웨어 정보를 저장한다.

UVEPROM
Ultra Violet EPROM. 자외선으로 데이터를 삭제하는 ERPOM.


컴퓨터 부팅 과정

  1. 전원 공급
  2. ROM 에 저장되어있던 BIOS 실행
  3. BIOS 에서 POST 실행 (Power On Self Test) - 하드웨어 검사
  4. 운영체제가 메모리에 올라옴

물리 주소와 논리 주소

물리 주소 : 메모리에서 데이터가 실제로 존재하는 물리적인 주소
논리 주소 : 프로그램에서 사용하는 0번지 부터의 가상 주소

베이스 레지스터 : 프로그램이 연속적으로 적재되어있는 곳에서의 첫번째 주소
한계 레지스터 : 프로그램이 최대로 담길 수 있는 크기를 나타내는 값

MMU는 CPU가 발생시킨 논리주소에 베이스 레지스터 값을 더해서 논리주소 -> 물리주소로 변환한다.

예를들어, 베이스 레지스터값 1000, 한계 레지스터 값 500 일 때,
프로세스는 다음과 같은 주소 (x) 내에 적재되어야 한다.
1000 <= x <= 1500


캐시 메모리

레지스터 : CPU 내부의 고속 저장장치
메모리 : 주기억장치. CPU 와 데이터를 주고받는 속도가 레지스터보다 느림.
캐시 메모리 : 레지스터와 메모리 사이에 위치해서, 메모리에 갔다오는 시간을 절약 시켜주는 기억 장치.

CPU에서 데이터를 찾으러가다가 캐시 메모리에서 데이터를 발견했으면 캐시 히트, 반대의 경우 캐시 미스라고 한다.

참조 지역성 원리
캐시 메모리에는 CPU가 찾을 것 같은 데이터들을 저장하는 것이 좋다. 그럼 CPU가 찾을 법한 데이터는 어떻게 판단하는가. 이를 참조 지역성의 원리에 근거해서 판단한다.

공간 지역성 원리 : 최근에 접근했던 메모리 공간의 근처 공간을 또 참조할 가능성이 크다.
(ex : 배열 순회, 순차 코드 실행)
시간 지역성의 원리 : 최근에 사용했던 메모리는 다시 한번 더 사용할 가능성이 크다.
(ex : 스택, for 문의 변수 i)


저장 장치 계층 구조

피라미드 위로 갈 수록
빠르다 / 비싸다 / 저장 용량이 작다


보조 기억 장치

보조 기억 장치에는 크게 하드디스크와 플래시 메모리가 있다.


하드 디스크 (HDD)

물리적인 디스크를 고속으로 회전시켜 데이터를 저장하는 장치.
디스크에 물리적으로 저장하기 때문에 충격에 약하고, 소음이 다소 발생한다.
가장 대중적인 보조기억장치였으나 SDD 의 등장으로 사용률이 작아지고 있다.


플래시 메모리

(맥북의 SSD 모습)

플래시 메모리는 전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장장치다.
USB 메모리, SD 카드, SSD 가 모두 플래시 메모리 기반의 보조 기억 장치다.
다양한 곳에서 널리 사용하는 저장 장치로, ROM에도 사용된다.

가장 작은 데이터 단위로 셀을 사용하고, 메모리 읽기와 쓰기는 페이지 단위, 메모리 삭제는 블록 단위로 이루어진다.

셀 < 페이지 < 블록


RAID

여러개의 물리적 보조 기억 장치를 마치 하나의 논리적 보조 기억 장치처럼 사용하는 기술.
하드 디스크와 SSD 로 사용하는 기술.
1TB 하드 디스크 4개로 RAID를 구성하면 4TB 하드 디스크 1개의 성능과 안정성을 능가할 수 있다.


RAID 레벨 0

장점 : 입출력 속도가 향상된다. 그림에서 보면 하드 디스크 하나에서 왔다갔다 할 때보다 이론상 4배가 빨라진다.
단점 : 저장된 정보가 안전하지 않다. 디스크 한개에 문제가 생기면 큰일이다.


RAID 레벨 1

장점 : 데이터 복구가 매우 간단
단점 : 사용가능한 용량이 작아짐


RAID 레벨 4

컴퓨터 공학의 패리티 비트는 일반적으로 오류 검출만 가능하지만 RAID 의 패리티는 수정이 가능하다.
장점 : 오류 검출 수정 가능
단점 : 패리티 디스크 쪽으로 병목 현상이 발생한다.


RAID 레벨 5

장점 : RAID 4에서 병목현상을 완화시킴


RAID 레벨 6

장점 : RAID 5에서 조금 더 안전해짐
단점 : RAID 5보다 조금 더 느려짐

결론
RAID 레벨 별로 장단점이 있기 때문에 주어진 상황에 맞는 RAID 레벨을 맞춰 사용하는 것이 중요하다.
실제로 BIOS 에서 RAID 레벨을 설정할 수도 있다.


입출력장치

입출력장치는 그 종류가 다른 장치들에 비해 매우 다양하기 때문에 다루기가 까다롭다.
따라서 컴퓨터에서는 장치 컨트롤러와 장치 드라이버를 활용해서 입출력장치를 다룬다.

장치 컨트롤러는 CPU와 입출력장치의 하드웨어적 통로
장치 드라이버는 CPU와 입출력장치의 소프트웨어적 통로 라고 생각할 수 있다.


장치 컨트롤러

장치 컨트롤러는 다음과 같은 일들을 한다.
-CPU와 입출력장치 간의 통신 중개
-오류 검출
-데이터 버퍼링 : CPU와 입출력장치의 데이터 전송률의 차이를 완화
-하드웨어 인터럽트 방출


장치 컨트롤러의 구조

데이터 레지스터 : CPU와 주고받을 데이터 저장
상태 레지스터 : 입출력장치가 작업을 할 준비가 되었는지, 완료되었는지, 오류는 없는지 정보
제어 레지스터 : 입출력장치가 수행할 내용에 대한 정보와 명령


장치 드라이버

장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램.

컴퓨터가 어떠한 입출력장치의 장치 드라이버를 실행할 수 만 있다면 그 입출력장치를 사용할 수 있다. 장치 드라이버는 운영체제가 기본 제공하는 것도 있지만 제작사에서 따로 제공하는 경우도 있다.


프로그램 입출력

입출력장치가 CPU와 정보를 주고 받는 방법에는 여러가지 방법이 있다.
크게 프로그램 입출력, 인터럽트 입출력, DMA 입출력이 있다.

프로그램 입출력은 기본적인 방법으로, 명령어로 입출력 장치를 제어하는 방법이다.
데이터 레지스터, 상태 레지스터, 제어 레지스터를 적절히 활용해서 CPU와 소통한다.


인터럽트 기반 입출력

장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 작업을 백업한 뒤 잠시 멈추고 인터럽트 서비스 루틴을 실행한다. 이런 방식을 인터럽트 기반 입출력이라고 한다. 장치 컨트롤러가 인터럽트를 방출한다.

그런데 하드웨어 인터럽트가 동시 다발적으로 발생하는 경우에는 어떤 인터럽트를 우선적으로 실행해줘야 할지 판단해야 한다. 이를 위해서 PIC (Procrammable Interrupt Controller) 가 있다.

PIC 는 여러 입출력 장치 컨트롤러에 연결되어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에게 전달한다.


DMA 입출력

Direct Memory Access. 말 그대로 CPU의 개입없이 입출력 장치가 직접 메모리에 접근하는 방식.
보통 메모리의 접근은 CPU에 의해서만 발생한다. 하지만 모든 입출력 관련 메모리 접근을 CPU 를 통해서 하게 된다면 시간적 비효율이 생긴다. 가뜩이나 바쁜 CPU에게 자꾸 시간을 뺏는 셈이다.

그래서 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식인 DMA가 등장했다. DMA를 하기위해서는 DMA 컨트롤러라는 하드웨어가 필요하다.


DMA 입출력 과정
1) CPU는 DMA 컨트롤러에 입출력 장치의 주소, 수행할 연산, 메모리 주소 등의 정보로 입출력 작업을 명령한다.
2) DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 이때 DMA 컨트롤러가 직접 필요한 경우 메모리에 접근해서 정보를 사용한다.
3) 입출력작업이 끝나면 DMA 컨트롤러가 CPU에게 인터럽트를 걸어 작업이 끝났음을 알린다.


입출력 버스
DMA 컨트롤러에는 입출력 버스 라는 별도의 버스를 연결해서, 시스템 버스 대신에 사용할 수 있다. 바쁜 시스템 버스를 건들지 않고 입출력 버스라는 별도의 버스를 사용해서 CPU 사용률을 높이는 것이다.

profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글