이때의 불 함수는 위와 같이 표현한다.
N bit 전 가산기로 입력에 대한 결과가 나오는데 까지는 델타만큼 필요. 왜냐하면 캐리가 나와야 하기 때문이다.
그래서 fast adder structure가 필요하다.(computer arithmetic)
이때 나온 Carry out은 프로그래머가 프로그램으로 처리한다.
Software Simulation
진리표로 부터 sum과 carry에 대한 Boolean expression을 얻는다.
회로를 구현한면 아래와 같이 구현할 수 있다.
반대로 R이 1이 되면 Q가 0이 되고 ~Q가 1이 되어 0을 저장한 상태라고 부른다.
처음의 Q는 무슨 값인지 알 수 없다.
매 클럭 라이징마다 D 값에 따라서 Q 값이 바뀌게 된다.
하지만 EN이 0이면 D값이 아무리 바뀌더라도 Q 값을 바뀌지 않는다.
이때 여러개의 레지스터를 또 묶으면 레지스터 파일이 된다.
플립플롭 < 레지스터 < 레지스터 파일
추가로 control addr address가 입력된다. 이때의 address도 read addr과 write addr이 존재한다.
Memory
레지스터로도 부족한 공간은 메모리라는 특별한 구조의 저장공간을 제작하게 된다. cost/bit가 아주 낮게 제작된 기억장치이다.
EN 역시 Write EN과 READ EN이 존재한다.
RD/WR도 0 또는 1로 write와 read를 구분한다.
이때의 메모리는 8bit이다.
bride : 이기종 프로토콜을 갖는 bus들을 서로 연결해주는 장치
ALU는 덧셈연산만
VLSI (Very Large Scale Integration) -> ULSI(Ultra Large Scale Integration) -> SoC(System On Chip)
으로 점차 CPU가 연산하는 크기가 커지며 다른 기능들도 부가적으로 추가중)
결국 CPU가 하는 것은 오른쪽의 5가지를 계속 반복한다.
http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch05s06.html
위에서 instruction execution cycle에 대해 자세하게 나와있다. Intel CiSC(Complex instruction set computer)
실제 CPU는 보다 복잡한 단계를 가질 수 있다.
Generic RISC 컴퓨터의 경우 다음과 같은 Instruction Execution Cycle을 가진다.
PC와 같은 기능으로 현재 수행해야할 instruction 주소를 저장하고 있다.
Contro; instruction을 통하여 원하는 ㅑㅜㄴㅅ겿샤ㅐㅜwnthfh qusrud rksmd
Data Movements(가장 자주 이용)
레지스터.매모리 -> 레지스터/메모리
Arithmetic
+, - 등등
Logical Operation
NOT, AND, OR
Program Control
if, for, while
Input/Output (usually use IO library)
- Memory mapped : IO operations은 같은 memory operations의 주소를 사용한다.
CPU를 동작하는 원동력으로 instruction 한개를 수행하는 기간 = Machine cycle은 1개 또는 그 이상의 clock cycle로 구성
실제로 위와 같이 구성된다. 현재는 알아보기 힘들지만 나중에 assembly instruction 하나로 대응된다.
Program : A sequence of machine instructions 이다. 하지만 그냥 짜기가 힘들기 때문에 assembly instruction directive로 작성한다.
C program 또는 higher level program으로 작성한다면 compiler/interpreter가 직접 machine instruction으로 바꾸어 준다.
Symbolization of Machine Instructions
위와 같이 machine instruction은 Mnemonic(네모닉)으로 변경되고 operand 부분도 변경된다. 이떄 al은 op code에 내재되어 있다.
T를 5명의 일꾼들이 분담하여 처리하는 경우
pipelining은 instruction의 실행을 병렬로 하기 때문에 보다 효율적으로 작동한다.
Latency는 여전히 6이지만
Throughput은 1이다.
총 k + (n - 1)의 사이클이 필요하게 된다.
반면 non-pipelined processor은 많은 cycle을 낭비한다.
총 kn 시간이 걸리게 된다.
Task를 작은 Stage로 나누어 수행할 때, 각각의 완료에 필요한 시간이 가능한 균등하게 배분되도록 나누어야 한다.
중간에 S4가 2가 걸리어 버리면 7, 1/2가 걸린다.
만약 중간에 clock cycle을 많이 소모하면 전체 clock cycle이 버려지게 된다.
k+(2n-1)
위의 문제를 해결하기 위한 방법 : 모듈을 두개로 나누어서 사용한다.
k+n의 시간이 걸린다.
Pipelined 시스템이 최고 성능을 발휘하기 위해 모든 stage가 멈춤 없이 계속 일을 수행하여야 한다.
그러나 resource 충돌(같은 자리에 write), branching 등의 이유로 pipeline이 연속으로 동작할 수 없는 경우를 pipeline hazard라고 한다.
이 문제는 컴퓨터의 성능을 저하시키므로 이에 대해 많은 해결 방법이 존재
위와 같이 instruction을 fetch하여 decode 해보니 branch인 경우 그 다음 instruction이 의미가 없기 때문에 pipeline의 동작을 잠시 멈추고 I2 다음 instruction을 실행하게 한다.
읽기만 할 수 있는 메모리
PROM : Programmable ROM
EPROM : Erasable PROM(삭제 가능) - 자외선을 쐬면 지워진다.
EEPROM : Electrically Erasable PROM(전기적으로 삭제 가능한 PROM) - 지우는 속도가 상당히 느리다.
접근하더라도 waiting clock이 존재한다. 이때의 waiting clock이 컴퓨터 성능을 결정한다.
프로세스가 메모리에 있는 것을 fetch-execute 할때 일정 범위내에서 다음 instruction을 실행한다.
비록 프로그램이 쭉 나열되어 있다고 하더라도 특정부분을 계속 access한다.
principle of locality로 인해 일부분의 데이터만 가지고 있으면 된다는 것이다.
program을 작성할때 가급적 작은 loop에 작성해야 한다.
컴퓨터 기술은 느리고 빠른놈들 사이의 싸움이다.
scheduler utility가 CPU에 프로그램별 작동시간을 할당하여 반복 작업하도록 한다.
하나의 instruction 안에 sub-instructions들로 구성하여 동시에 작동하는 방법이다.
digital이나 multimedia processing에 유용하다.
어셈블리 언어의 필요성을 이해하도록 하자
항상 2진수를 사용한다.
이진수는 사전 약속에 의하여 여러 용도로 사용할 수 있다.
이진수 리스트 만으로는 아무런 의미가 없기 때문에 우리가 의미를 부여해야 한다.
radix 10 number라고도 부른다.
10,2,7 등을 radix 또는 base 라고 부른다.
이진수의 경우
8bit : a byte(컴퓨터) or an octet(통신)
8 bit 이상 : 일반적을 word라고 부름(시스템에 따라 다름)
이진수가 아닌 경우
각 자리수를 digit라고 부른다.
Hexadecimal Numbers(16진수)
Win32에서는 주소에 32비트가 필요하다. -> 이때 각각 4비트씩 묶어서 16진수로 표시한다.
정리
주의사항