티스토리 뷰

* 컴퓨터의 자료 표현 방식

- 내부적 표현 (수치)

> 정수 표현 (고정소수점): 10진 방식 (Unpack/Pack), 2진 방식 (절대치, 1의 보수, 2의 보수)

> 소수 표현 (부동소수점)

 

- 외부적 표현 (문자): BCD 코드, ASCII 코드, EBCDIC 코드

 

* 고정소수점 표현 방식

- 10진 연산: Pack 방식은 연산에 사용하고 Unpack 방식은 입출력에 사용함

- 2진 연산: 10진수 전체를 2진수로 바꿔서 저장

> 그냥 쓰기: 부호 비트만 1로 바꿔주면 음수를 뜻함

> 1의 보수: 음수인 경우 숫자를 다 뒤집음. 음수도 덧셈만으로 처리할 수 있게 된다

> 2의 보수: 음수인 경우 숫자를 다 뒤집고 거기에 +1. 1의 보수보다 표현가능한 수의 개수가 1개 더 많다

 

* 부동소수점 표현 방식

- 이 포스팅 참고

- 부호 비트, 지수부, 가수부로 나누어져 있으며 32bit 단정도의 경우 지수 8비트 가수 23비트. 64비트 배정도의 경우 지수 11비트 가수 52비트.

- 부동소수점 방식에서 연산 순서: 0인지 여부를 먼저 보고, 지수 -> 가수 순서로 보고 연산, 결과 정규화를 제일 마지막에 한다.

 

* BCD 코드와 응용

10진수 한자리를 2진수 4비트로 표현하는 방식

ex) 234 = 0010 0011 0100

- Digit 비트 4비트, Zone 비트 2비트, 패리티 비트 1비트 해서 총 7비트로 쓰는 경우가 많다

 

- Excess-3 Code: BCD 코드에 3을 더한 것. 보수를 간단히 얻을 수 있다 (?)

- Gray Code: BCD 코드에서 인접하는 비트를 XOR 연산해서 결과를 낸 것.

ex) 1011을 Gray Code로 변환하면 -> 1110

(맨 앞자리는 일단 1, 그 다음자리는 1-0이라 서로 다르므로 1, ... 마지막엔 1이 연속 두개라 같으므로 0)

 

* 오류 검출용 코드

- Parity Check Code: 오류 검사용으로 1비트짜리 패리티 비트란걸 넣는다.

홀수 패리티: 전체 데이터에 1의 개수가 홀수가 되도록 패리티 비트를 삽입.

짝수 패리티: 짝수가 되도록 삽입.

ex) 전송할 데이터가 1111110 이고 홀수 패리티를 쓴다면 패리티 비트는 1

 

- Hamming Code: 1, 2, 4, 8, ... 번째 자리에 Check Bit를 삽입하는 방식.

2비트의 에러 검출, 1비트의 에러 교정 가능

예를 들어서 데이터 비트가 8비트라면 Check Bit 4비트가 들어가서 총 12비트가 됨. 계산 방식은 예로 설명

 

 

ex) 데이터 비트가 11000010일 때. C는 Check Bit, D는 Data Bit를 의미함.

?? 자리에 들어갈 숫자는 나머지 비트들의 값에 따라 결정되는데 어떤 식이냐면,

- 각 Data Bit의 pos를 1, 2, 4, 8의 덧셈으로 계산함

- 덧셈할때 1을 썼다는 것은 C1의 계산에 해당 Data Bit가 관여함을 의미함

- 그런 식으로 관여하게 되는 Data Bit들을 모두 XOR 연산 (=1이 홀수개면 1, 짝수개면 0)

 

3=2+1, 5=4+1, 6=4+2, 7=4+2+1, 9=8+1, 10=8+2, 11=8+2+1, 12=8+4

이 중에 1이 들어가 있는 것만 파란색으로 칠했다.

즉 pos가 3, 5, 7, 9, 11에 해당하는 D1, D2, D4, D5, D7을 XOR하면 그것이 C1이 됨.

01001 -> 짝수개이므로 C1 = 0

 

이런 식으로 나머지 C2, C4, C8도 계산해보면 각각 1, 0, 0임. 따라서 Check Bit = 0010

(C8부터 읽음)

 

이게 어떻게 에러를 검출하느냐? 만약에 D3이 0에서 1로 잘못 전송되었다고 치면, D3이 계산에 관여하는 C2랑 C4가 뒤집힐 것. 2+4=6이므로 6번째 pos에 있는 D3에서 오류가 발생했다는 것을 알 수 있다.

 

* 중앙 처리 장치 (CPU)

- 분류

> CISC: 명령어 개수가 많고 길이가 다양. 회로가 복잡해진다.

> RISC: 명령어 개수가 적고 길이가 고정. 회로가 단순해진다. 대신 프로그램 코드 길이는 길어지곤 한다.

x86이 대표적으로 CISC 기반이지만 최근에 나온 아키텍처, 특히 모바일쪽에 들어가는건 다 RISC이며 인텔도 CISC 기반일 뿐 RISC 방식을 도입한 상태.

 

- 구성요소: 제어장치 (Control Unit), 연산장치 (ALU), 레지스터, 버스

 

* 레지스터

[제어 장치 레지스터]

- 프로그램 카운터 (PC): 다음에 실행할 명령의 주소를 기억

- 명령 레지스터 (IR): 현재 실행중인 명령을 기억

- 디코더: IR에 있는 명령어를 해석

- 인코더: 디코더에서 받아온 명령을 실행 신호로 변환

- 기억 번지 레지스터 (MAR): 기억장소의 번지를 기억

- 기억 버퍼 레지스터 (MBR): 기억장치에 출입하는 자료를 기억

- 베이스 레지스터: 명령이 시작되는 번지 기억

- 인덱스 레지스터: 주소 변경, 서브루틴 연결, 반복 연산 수행

- 시프트 레지스터: 데이터를 좌/우로 1비트씩 이동

- 메이저 스테이트 레지스터: CPU의 메이저 스테이트 기억

[연산 장치 레지스터]

- 누산기 (ACC): 누적된 연산 결과를 기억

- 가산기

- 보수기: 입력 데이터의 보수를 출력

- 데이터 레지스터: 연산에 필요한 자료 보관

- 프로그램 상태 레지스터 (PSWR)

 

* 버스

CPU나 메모리, I/O 장치간 정보교환의 통로. 공동으로 쓴다 (버스의 주목적: 선을 줄임).

분류 (1)

- 내부 버스: CPU 내부에서 연산장치와 레지스터를 연결

- 외부 버스: CPU와 메모리, I/O를 연결

분류 (2)

- 주소 버스: CPU가 메모리나 I/O 장치의 주소를 지정할 때 사용. 단방향

- 데이터 버스: 장치에 데이터를 전달. 양방향

- 제어 버스: CPU의 현 상태나 상태 변경을 알리거나 제어 신호를 전송

 

* 명령어 (Instruction)

명령어는 연산자부 (Op-Code) 와 자료부 (Operand) 로 구성.

연산자부는 실행할 명령어가 들어있는 곳이고 자료부에는 데이터나 주소가 들어간다.

여기서 명령어란 논리연산/관계연산/산술연산 등. (MOV, ADD, MUL, XOR, Bit Shift, ...)

 

- 명령어 형식: Operand 파트의 개수에 따라 0-주소 명령어, 1, 2, 3-주소 명령어로 구분

> 0-주소 명령어: Operand부가 없이 Op-Code만 있음. 연산은 '스택 머신' 을 이용한다. 원래의 자료가 남지 않음.

> 1-주소 명령어: Operand1에 연산 결과가 저장. 누산기 속에 Operand가 포함?

> 2-주소 명령어: Operand1에 연산 결과가 저장. 계산 결과가 CPU에도 남아있어 결과를 직접 테스트 가능

> 3-주소 명령어: Operand3에 연산 결과가 저장. 연산후에 입력자료가 변치 않고 보존됨.

 

* 주소 지정 방식

- 접근 방식에 따른 분류:

1) 묵시적 주소지정

2) 즉시 주소지정

3) 직접 주소지정

4) 간접 주소지정

 

- 계산 방식에 따른 분류:

1) 절대 주소지정

2) 상대 주소지정

3) 베이스 레지스터 주소지정

4) 인덱스 레지스터 주소지정

 

* 마이크로오퍼레이션

명령을 수행하기 위해 CPU 내의 레지스터와 플래그의 상태 변환을 일으키는 작업

컴퓨터의 모든 명령을 구성하는 몇 가지의 기본 동작이다.

마이크로오퍼레이션을 순차적으로 일어나게 하는 신호를 Control Signal이라 함.

 

- 마이크로 사이클 타임: 한개의 마이크로오퍼레이션 수행에 필요한 시간

> 동기 고정식: 수행시간이 가장 긴 MO를 기준으로 사이클타임을 정한다.

> 동기 가변식: 수행시간이 비슷한 몇 개의 MO를 묶어서 사이클타임을 정한다 (각 집합간 사이클타임은 정수배로).

> 비동기식: 모든 MO에 대하여 서로 사이클타임을 다르게 정한다.

위 -> 아래로 갈수록 CPU 타임을 효율적으로 쓸 수 있지만 제어가 복잡해짐.

 

* 제어 장치

- 제어 데이터: 제어 장치가 제어 신호를 발생시키기 위해 필요한 데이터

> 메이저스테이트 사이의 변화를 제어하는 데이터

> CPU의 제어점을 제어하는데 필요한 데이터

> 인스트럭션의 수행순서 결정에 필요한 데이터

 

- 제어 장치 구현

> 고정 배선 제어장치: 하드웨어적으로 구현. 빠르지만 비싸고 회로가 복잡하며 유연하지 않다.

> 마이크로프로그램 제어장치: 흔히 펌웨어라고 부르는 소프트웨어+하드웨어 방식. 느린 대신 저렴하고 유연함.

 

- 마이크로 명령 형식

마이크로프로그램이 사용하는 명령어. CPU 내의 제어장치 기능을 직접 실행할 수 있다.

> 수평 마이크로 명령: 제어신호 1개당 1비트 할당. 빠르지만 비싸다

> 수직 마이크로 명령: 외부 디코딩 회로를 통해 제어신호 변환. 느리지만 경제적

> 나노 명령: 나노 메모리를 사용하는 방식

 

* 메이저 스테이트 (Major State)

현재 CPU가 무엇을 하는지를 나타내는 상태로 4단계로 구성.

- Fetch: 메모리로부터 명령을 읽어서 CPU로 갖고오는 단계.

- Indirect: 위의 Fetch 단계에서 해석된 명령의 주소부가 간접 주소인 경우, 오퍼랜드의 주소를 인출하는 단계

- Execute: 명령을 실행하는 단계

- Interrupt: 인터럽트 발생시 복귀 주소 (PC) 를 저장시키고 제어 순서를 첫번째 명령으로 옮기는 단계

 

* 기억 장치

주기억 장치, 보조기억 장치, 특수기억 장치로 분류

- Access Time = Seek Time + Latency Time + Transmission Time

- Cycle Time >= Access Time

- Bandwidth: 기억장치를 연속적으로 액세스할 때 초당 처리가능한 비트수

 

* 주기억 장치

CPU가 직접 접근하여 처리.

반도체를 이용한 ROM, RAM과 자기를 이용한 장치 (자기 코어, 자기 박막 필름 등) 로 구분 

 

- ROM: 읽기만 가능한 비휘발성 메모리

> Mask ROM: 제조 과정에서 프로그래밍되어 나오기 때문에 한번 수록된 데이터는 수정 불가

> PROM (Programmable-): 사용자가 한번 내용을 기입 가능 (삭제는 불가)

> EPROM (Erasable PROM): 기억된 내용을 삭제 가능

> EAROM: 기록된 정보의 일부를 변경 가능

> EEPROM: 기록된 정보를 여러번 지웠다가 다시 사용 가능

 

- RAM: 읽기, 쓰기가 가능한 휘발성 메모리

> DRAM (Dynamic): 콘덴서로 구성, 주기적인 재충전 필요. 느리지만 싸다. 일반적인 메모리로 사용

> SRAM (Static): FF로 구성, 전원 공급되는 동안 내용 유지. 빠르지만 비싸다. 캐시 메모리 용도

 

- 기억장치의 용량 계산하기

> 용량 = 2^(입력 번지선 수) * 출력 데이터선 수

> 입력 번지선 수 = MAR 크기 = PC의 크기 = bit

> 출력 데이터선 수 = 워드의 크기 = MBR의 크기 = DR의 크기

ex) 입력 번지선 8개, 출력 데이터선 8개인 ROM의 용량 = 2^8 * 1 = 256byte? (앞은 bit 뒤는 byte로 계산?)

기억장치의 용량이 4096bit고 각 워드 수가 16bit일 때 PC, DR의 크기 -> 4096 = 2^12 * 1byte (워드의 크기는 기본적으로 1byte로 잡는다 함) 이므로 DR은 12bit, PC는 16bit (??)

컴퓨터의 기억용량이 1MB일때 필요한 주소선의 수: 2^20 * 1byte = 1MB이므로 20개

 

* 보조기억 장치

- 자기 테이프: 순차 접근만 가능하며 대량의 자료를 장시간 보관할 때 이용

- 자기 디스크: 순차 접근과 직접 접근 (랜덤 액세스) 이 모두 가능하며 접근 속도가 빠름

> 트랙: 데이터를 기록할 수 있는 동심원

> 섹터: 트랙을 분할한 구역

> 실린더: 각 디스크표면의 같은 트랙들끼리의 집합

> R/W 헤드: 디스크에 데이터를 R/W하기 위한 장치

> 액세스 암: 데이터에 접근하기 위한 장치

 

* 특수기억 장치

- 연관 기억 장치

주소가 아닌 기억된 내용의 일부를 이용해 접근. CAM이라고도 하며 Mapping Table에 사용

접근 속도가 빠르지만 HW 비용 증가

 

- 복수 모듈 기억 장치

다수의 기억장치 모듈을 가진 기억장치.

> 메모리 인터리빙 (Interleaving): CPU가 각 기억장치 모듈에게 동시에 주소를 전달하기 위해 연속된 데이터나 명령어를 기억장치 모듈에 순차적으로 번갈아가며 처리하는 방식.

 

- 캐시 메모리

주기억장치와 CPU 사이에 위치하여 메모리와 CPU의 속도차이를 줄이기 위한 메모리.

 

- 캐시 메모리 매핑 프로세스: 3가지 방법

1) Direct Mapping: 주소 기준 검색. 같은 인덱스를 가졌지만 태그가 다른 워드가 반복해서 접근하면 히트율이 떨어짐

2) Associative Mapping: 내용 기준 검색. 가장 무난

3) Set-Associative Mapping: 주소+내용 검색. 같은 인덱스를 가지면서 태그가 다른 워드를 캐시에 저장해서 세트 크기가 클수록 히트율이 높아짐

 

- 캐시 메모리 적중 (Hit)

CPU에서 찾고자 하는 내용이 캐시에 있는 경우 Hit했다고 함. Hit Ratio = (적중횟수) / (총 메모리 접근횟수)

> Hit 실패했을 경우 캐시 내용 교체하는 알고리즘: LRU, FIFO, LFU 등

 

- 캐시 쓰기 정책

1) Write-through: 캐시 기억 장치와 동일한 내용을 기록한 자기 디스크 부분을 동시에 갱신. 쓰기가 오래 걸린다

2) Write-back Cache (Write-behind): 수정된 데이터를 일정 시간을 기다린 후 저장하는 방식

3) Write Once: 단일 기록.

 

- 가상 기억 장치

소프트웨어적인 기법으로 메모리 크기를 늘리는 것. 프로그램을 작게 나눠서 보조기억장치에 보관하고 실행할 때 필요한 부분 일부만 메인 메모리로 갖고온다.

 

* 입출력 장치

- 입출력 장치의 구성

> 입출력 제어장치: I/O장치와 컴퓨터간의 자료전송 제어

> 입출력 인터페이스: 상이한 장치간의 원활한 정보전송방법을 제공

> 입출력 버스: 인터페이스에 공통으로 연결된 버스

 

- 입출력장치와 기억장치를 비교하면 I/O 장치는 속도가 느리고 에러 발생률이 높다. 

입출력장치: Byte 단위, 기억장치: Word 단위

 

- 버퍼링과 스풀링

버퍼링은 하드웨어적으로 구현되며 단일 작업, 단일 사용자 방식으로 운영, 주기억 장치에 저장

스풀링은 소프트웨어적으로 구현되며 다중 작업, 다중 사용자 방식으로 운영, 보조기억장치에 저장

 

- I/O 제어 방식: Programmed I/O vs. Interrupt I/O

> Programmed I/O: I/O 완료 여부 검사를 위해 CPU가 플래그를 계속 검사. I/O작업 중에는 CPU가 다른일 못함

> Interrupt I/O: 계속 플래그를 검사하는게 아니라 인터페이스가 인터럽트를 발생시켜서 CPU한테 알려줌. CPU가 I/O가 있을때만 I/O 제어를 하고 그 외엔 다른 작업 처리가 가능하므로 더 효율적이다. 대신 인터럽트 처리시간이 좀 걸림.

 

- DMA (Direct Memory Access)

CPU를 통하지 않고 I/O장치와 주기억장치가 서로 통신하는 방식. CPU에 부하가 걸리지 않는다.

데이터 전송이 시작되면 CPU가 메모리를 제어할 수 없어서 Idle Time이 발생함.

> Cycle Steal: DMA가 CPU의 사이클을 훔쳐 CPU의 메모리 액세스를 잠시 정지시킴. 이동안 CPU는 다른 작업을 못한다.

CPU랑 DMA가 동시에 버스를 요청했을 경우 DMA가 우선권을 가짐.

> 사이클 스틸은 인터럽트랑 다르게 CPU가 해당 사이클동안 완전히 쉬기 때문에 그동안 상태 케어가 필요 없음.

 

* IOP와 채널

- IOP (Input/Output Processor): CPU랑 I/O는 속도차이가 커서 CPU가 직접 I/O 장치를 관리하는건 비효율적이므로 따로 만든 것. CPU의 명령을 받아 독립적으로 작동하며 고유의 명령어가 존재.

- 채널: I/O와 메모리 사이에 위치해 두 장치를 연결. I/O 장치의 명령 실행 지시 및 실행 상황 점검. 여러 개의 DMA 채널을 가지고 있다.

> 셀렉터 채널: 한번에 하나씩 선택하여 제어. 실제 I/O가 일어나고 있을 때 채널 제어기가 마치 한 I/O 제어 장치 전용인 것처럼 보임.

> 바이트 멀티플렉서 채널: 동시에 여러개의 I/O를 제어 (저속 I/O장치를 제어)

> 블록 멀티플렉서 채널: 동시에 여러개의 I/O를 제어 (고속 I/O장치를 제어)

 

- DMA 제어기의 한계를 극복하기 위해 쓰는게 IOP?

 

* 인터럽트

어떤 특수한 상태가 발생하면 실행중인 프로그램이 일시 중단되고, 특수한 상태를 처리하기 위한 프로그램으로 분기하여 처리한 후 다시 원래 프로그램으로 돌아가는 것

- 외부 인터럽트: 전원 이상, 기계 검사 인터럽트 (하드웨어 고장시), 외부 신호 인터럽트 (시간 초과), I/O 인터럽트 (I/O 종료 또는 오류 발생시)

- 내부 인터럽트: 잘못된 명령이나 데이터를 사용할 때. 트랩 (Trap) 이라고도 함. 오버플로우 발생, 0 나누기, 보호영역 내의 메모리에 접근하는 경우 등

- 소프트웨어 인터럽트: 명령어 수행에 의해 발생하는 인터럽트.

> SVC 인터럽트

(지금까지 써놓은 것은 위 -> 아래로 인터럽트 우선순위임)

 

- 인터럽트 체제 요소

> 인터럽트 요청 신호: 말 그대로 장치에서 인터럽트 발생이라고 신호를 보내는 것

> 인터럽트 처리 루틴: 인터럽트 후 인터럽트 루틴 주소로 분기할 때까지 처리 프로그램 루틴

> 인터럽트 서비스 루틴: 인터럽트 요청에 의해 실행되는 루틴

 

- 인터럽트 동작 과정

1) 인터럽트 요청 신호 발생

2) 현재 수행중인 명령을 완료하고 상태를 저장

3) 어느 장치가 인터럽트를 요청했는지 찾는다

4) 인터럽트 취급 루틴을 수행

5) 저장해뒀던 프로그램 상태로 복귀

 

- 인터럽트 발생시 CPU가 확인해야할 사항

1) PC의 내용: 다음 실행할 명령어의 주소를 알아야 복귀가 가능

2) 상태 조건 내용 (PSW의 상태)

3) 사용한 모든 레지스터의 내용: CPU에서 어떤 레지스터를 사용했는지

 

- 인터럽트 우선순위 판별법

> SW적 방법: Polling 방식. 상위 우선순위부터 차례대로 검사한다. 반응속도가 느리지만 유연하고 경제적

> HW적 방법: 반응속도가 빠르지만 유연성이 없고 비용이 많이 든다.

>> 직렬 방식: 인터럽트가 발생할 모든 장치를 우선순위에 따라 1개의 회선에 직렬로 연결. '데이지 체인' 방식

>> 병렬 방식: 각 장치를 개별 회선에 연결. '마스크 레지스터' 의 비트 위치에 따라 우선순위 결정.

 

* 병렬 처리

- 병렬 컴퓨터의 분류

> SISD (Single Inst. / Single Data): 하나의 명령이 하나의 데이터 처리

> SIMD (Single Inst. / Multi Data): 하나의 명령이 다수의 데이터 처리 (벡터 컴퓨터, 배열 처리기에 사용)

> MISD: 다수의 명령이 하나의 데이터 처리 (안 씀)

> MIMD: 다수의 명령이 다수의 데이터 처리 (멀티프로세서에 사용)

 

- 병렬 처리 기법: 파이프라인 프로세서, 벡터 프로세서, 어레이 프로세서, 멀티프로세서

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함