레지스터에 저장된 데이터에 대해 수행되는 기본적인 연산
산술 연산과 논리 연산을 처리한다.
산술 연산 - 덧셈, 뺄셈, 곱셈, 나눗셈, 증가, 감소, 보수
논리 연산 - AND, OR, NOT, XOR, shift
Masking - 하위 비트만 남기는 연산
Insert - B의 PCH(상위 비트)와 A의 PCL(하위 비트)를 합치는 연산
packed decimal <-> unpacked decimal
변환 과정에서 사용된다.
다 성능 좋은 ALU를 만들기 위해 고안된 연산들이다.
step by step에 의한 처리는 한계가 왔다. -> 병렬 처리 머신(양자 컴퓨터)가 필요하다.
P: R1 <- R2 = if (P == 1) then R1 <- R2
명령어 코드가 복잡해지는 이유는 프로그램과 하드웨어 간의 독립성을 위해서이다.
그래서 direct mode에서 indirect mode로 변화하였다.
소프트웨어가 오퍼랜드 주소를 바꿔도
하드웨어가 자체적으로 찾아서 연산할 수 있게끔 설계됐다.
개인적인 생각으로 자연어에 가까운 코드는 Python, 기계 중심의 코드는 C 같다.
위의 명령어가 전체 실행 명령어의 90% 이상을 차지한다.
명령어의 쓰임새를 알고 분석하면 더 좋은 명령어를 만들어낼 수 있고 고로 더 좋은 CPU와 ALU가 만들어진다.
명령어의 구조상 자료가 저장되어있는 장소를 지정하는 방법이 필요한데,
이유는 하드웨어와 소프트 웨어의 독립성을 유지하여 프로그램의 유연성(pointer, indexing)을 가능하게 하여 명령어의 수와 길이를 줄이기 위함이다. (세계적 표준화 기법이다.)
MOV R1, R2
(이동 명령)ex) MOV R1, #100;
십진수 값 100이 두 번째 오퍼랜드로 직접 명령문에 포함
ex) ADD R1, R2;
레지스터 R1과 R2에 보유하고 있는 값이 오퍼랜드
ex) MOV R1, 100;
R1에 100번지의 내용을 이동하라는 내용, 100번지의 내용이 오퍼랜드
ex) MOV R1, @100;
R1 <- M[100]
다음 마이크로 명령을 수행한 후, 어떤 변화가 생겼을까?
(R1 = 100, R2 = 200이라고 가정)
컴퓨터는 사용자와 통신을 하기 위해서 외부 장치, 즉 메모리로 데이터와 명령어를 읽어들일
입력 장치(input-device)와 계산 결과를 사용자에게 표시해줄 출력 장치(output-device)를 갖추어야 한다.
FGI/FGO : INPR이나 OUTR에 정보가 override 되는 것을 막기 위해 플래그를 준다. (0일 때는 값이 들어갈 수 있는 것, 1일 때는 값이 들어가지 않음)
플래그를 이용한 통신 방법을 프로그램 제어 전송(program controlled transfer)이라고 하는데 이것은 프로세스와 입출력 장치와의 속도 차이 때문에 메우 비효율적이다. (컴퓨터 프로세스의 속도가 훨씬 빠름)
이러한 상황을 해결하고자 고안된 인터럽트를 걸 수 있는 플리플롭이다.
플래그를 세트하면 CPU는 실행중이던 프로그램을 중지하고 우선으로 진행될 정보를 플래그의 세트 정보로부터 받아들여 실행 후에 다시 원 프로그램으로 복귀한다.
R = 1
이 되어 인터럽트 발생M[0] <- 256
, PC <- 1
저장 / IEN = 0
, R = 0
저장PC <- 0
실행PC <- 256
실행이 돼서 원래 수행중이던 명령으로 복귀처음엔 기계어로 프로그램을 만들다가
프로그램이 커지면서 유지보수가 힘들어지자 어셈블리어를 만들었는데
어셈블리어는 컴퓨터의 내부 동작(IEN)을 다 신경 써서 해야하고 표준화 되어있지 않아서
고급 언어가 등장했다.
컴파일러: 고급 언어 -> 어셈블리어 -> 기계어 단계로 번역
컴파일 되면 오브젝트 코드 파일로 변환되고 필요 시 실행할 수 있다.
인터프리터: 고급 언어 -> 어셈블리어 -> 기계어 단계로 번역
해석과 동시에 실행한다.
어셈블러: 어셈블리어 -> 기계어 단계로 번역
프로그램이란 컴퓨터로 하여금 원하는 데이터처리 업무를 시행시키기 위해서 작성된 명령어 또는 문장으로 구성된 리스트이며 다음과 같은 종류가 있다.
이진 코드 - 메모리 상에 나타나는 형태의 명령어로서 이진 명령어와 피연산자의 시퀀스다.
어셈블리어로 예를 들면) ADD 101, 102
8/16진수 - 이진수 코드를 편의상 8/16진수 형태로 표현한 내용
기호코드 - 사용자가 연산 부분, 주소 부분 등에 대해 기호(문자, 숫자, 특수문자 등)을 사용하게 되며, 각 기호 명령어는 하나의 이진 코드로 번역되는데 이러한 번역을 어셈블러(assembler)가 담당
고급 프로그래밍 언어 - 컴퓨터 하드웨어의 동작을 염두에 두지 않고(HW와 SW 사이의 독립성) 문제해결에 관점을 맞춰서 개발한 인간 중심의 언어 C, C#, Java 등이 대표적인 사용언어들이다. 이러한 언어를 컴파일러형 언어(complier language)라고 한다.
함수형 ㅇㄷ?
우리가 편하게 웹 서핑을 하거나, 게임을 할 때 이루어지는 통신은 모두 16진수(Hexadecimal) 표현으로 이루어진다.
컴퓨터 시스템의 계산 속도 향상을 목적으로 하여 동시 데이터 처리 기능을 제공하는 광범위한 개념의 기술을 의미한다.
사용 레지스터의 형태에 따른 병렬성 구현(ex - 시프트 레지스터, INPR, OUTR)
동일한 또는 서로 다른 동작을 동시에 수행하는 여러 개의 기능 장치(functional unit)를 가지고 데이터를 각각의 장치에 분산시켜 작업을 수행하는 경우
(ex - 산술, 논리, 시프트 동작을 세 개의 장치로 분류하고, 제어 장치의 관리에 따라 피 연산자를 각 장치들 사이에서 전환시킨다.)
병렬 처리를 할 때 각각의 장치에 AC를 달아서 데이터를 누적시켜놓고
다른 장치가 그 데이터를 필요로 할 때 전송하는 로직이 이용되고 있다.
동시에 처리되는 명령어와 데이터 항목 수에 의해 컴퓨터 시스템의 구조를 파악하는 분류 방법
명령어 흐름(Instruction stream) -> 메모리로부터 읽어온 명령어의 순서,
데이터 흐름(data stream) -> 데이터에 대해 수행되는 동작
분류 | 설명 |
---|---|
SISD | - 제어장치, 처리장치, 메모리 장치를 가지는 단일 컴퓨터 구조 - 명령어들은 순차적으로 실행되고, 병렬처리는 다중 기능 장치나 파이프라인 처리에 의해서 구현된다. |
SIMD | - 공통의 제어장치 아래에 여러 개의 처리 장치를 두는 구조 - 모든 프로세서는 동일한 명령어를 서로 다른 데이터 항목에 대하여 실행시킬 수 있다. - 모든 프로세서가 동시에 메모리에 접근 할 수 있도록 다중 모듈을 가진 공유 메모리 장치가 필요하다. |
MISD | 이론적으로만 연구 되고 있음 |
MIMD | - 여러 프로그램을 동시에 수행하는 능력을 가진 컴퓨터 시스템 - 대부분의 다중 프로세서와 다중 컴퓨터 시스템이 이 범주에 속한다. - 듀얼 코어, 쿼드 코어가 있다. |
이 분류방식은 컴퓨터의 구조적 연계방식에 대한 고찰이기보다는 외양적 행동 양식을 강조한 분류방식이라고 볼 수 있다. 이 분류 방식에 적합하지 않은 것이 파이프라인이다.
예를 들어 세탁, 건조, 다림질, 옷장에 넣기를 한다고 가정하자.
모든 옷을 세탁하고,
세탁된 모든 옷을 건조하고,
건조된 모든 옷을 다림질하고,
다림질된 모든 옷을 옷장에 넣는 방식이 아니라
옷 하나씩 각 단계를 순차적으로 돌리는 방법이다.
그러면 세탁 끝나고 건조할 때 세탁은 놀고있으니 바로 다음 옷을 투입하는 방식으로 진행된다.
이 일련의 단계에서 가장 오래 걸리는 단계를 클럭 사이클로 정의한다.
왜냐하면 제일 빠른 단계가 끝나도 다음 단계로 넘어가려면 전체 작업이 끝나야하기 때문이다.
예를 들어 건조가 끝났어도 세탁이 안 끝나면 다음 옷을 투입시키지 못한다.
tp
k
n
첫 번째 테스크 t1은 동작 완료까지 k * tp
만큼의 시간이 걸리고
나머지 (n - 1)
개의 테스크는 t1이 완료되고 나서 순차적으로 완료되니 (n - 1) * tp
의 소요시간이 걸린다.
고로 소요 시간은 k * tp + (n - 1) * tp = (k + n - 1) * tp
만큼 걸리고
총 클럭 사이클은 (k + n - 1)
이 된다.
비 파이프라인일 때
tn
n * tn
위와 같이 정의되고
증가율 공식은 비 파이프라인 소요시간 / 파이프라인 소요시간로 정의 된다.
계산을 해보면
S(증가율) = n * tn / (k + n - 1) * tp
이 상태에서 limit(n -> 무한)
을 해보면 (테스크가 무한히 증가)
S = tn / tp
가 된다.
이 때, 한 테스크의 수행시간이 같다고 하면 tn = k * tp
로 정의가 된다. (위 사진 참고)
그러면 s = k * tp / tp = k
즉, 파이프 라인의 최대 속도 증가율은 세그먼트의 수 k
라고 할 수 있다.
하나의 프로세스를 서로 다른 기능(function)을 가진 여러 개의 서브프로세스(subprocess)로 나누어 각 프로세스가 동시에 서로 다른 데이터로 취급하도록 하는 기법
각 세그먼트(segment)에서 수행된 연산 결과를 다음 세그먼트로 연속적으로 넘어가게 되어 데이터가 마지막 세그먼트를 통과하게 되면 최종적인 연산 결과를 얻게 된다.