ALU와 제어장치
ALU
- 계산만을 담당하는 계산기
- 계산을 하기 위해서는 피연산자(계산할 데이터) 수행할 연산이 필요함
- ALU는 레지스터를 통해 피연산자를 받아들이고, 수행할 연산을 제어신호를 받아들임 + - x /
- 연산을 수행한 결과는 특정 문자, 메모리주소가 될 수 있음 이 결과를 레지스터에 저장함
- ALU는 계산결과와 더불어 플래그를 레지스터에 저장함
- 계산한 결과가 레지스터보다 클때 결과값이 크다 라는 정보를 내보냄 = 오버플로우
- 연산결과에 대한 추가적인 상태정보를 플래그 라고함
플래그
- 플래그 들은 플래그 레지스터라는 레지스터에 저장됨
부호플래그
- cpu가 피연산자와 수행할 연산을 받아 연산을 수행한 후 결과로 나온 값의 부호를 나타내는 플래그
- 부호플래그가 1일때는 - , 0일때는 +
제로플래그
- 연산결과가 0인지 나타냄
- 제로플래그가 1일때 결과는 0, 0일때 연산결과는 0이 아님
캐리 플래그
- 연산결과 올림수나 빌림수가 발생했는지 나타내는 플래그
- 캐리플래그가 1일 경우 올림수나 발림수가 발생했음을 의미, 0일때는 발생하지 않았음을 의미
오버플로우 플래그
- 오버플로우(연산한 결과가 레지스터의 영역보다 큰 경우)가 발생했는지를 나타냄
- 오버플로우 플래그가 1 일경우 인터럽트가 가능함을 의미, 0일경우 인터럽트가 불가능함을 의미
인터럽트 플래그
- 인터럽트가 가능한지 나타내는 플래그
- 인터럽트 플래그1 => 인터럽트가능, 인터럽트플래그0 => 인터럽트 불가능
슈퍼바이저 플래그
- 커널모드로 실행중인지 사용자모드로 실행중인지 나타내는 플래그
- 1일경우 커널모드, 0일경우 사용자모드
제어장치
- 제어장치는 제어신호를 내보내고 명령어를 해석하는 부품
- 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기신호
제어장치는 클럭신호를 받아들임
- 클럭(clock)은 컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게하는 시간단위
- 하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있음
제어장치는 해석해야할 명령어를 받아들임
- cpu가 해석해야 할 명령어는 명령어 레지스터라는 레지스터에 저장됨
제어장치는 플래그 레지스터 속 플래그 값을 받아들임
- 플래그는 ALU연산에 대한 추가적인 상태정보
- 제어장치는 플래그값을 받아들이고 이를 참고하여 제어신호를 발생시킴
제어장치는 제어버스로 전달된 제어신호를 받아들임
- 제어신호는 CPU 외부장치도 발생시킬 수 있음, 제어버스를 통해 외부로 전달된 제어신호를 받아들임
CPU 내부로 제어신호 전달
- ALU에 전달하는 제어신호, 레지스터에 전달하는 제어신호로 나뉨
- 레지스터에는 레지스터간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위한 제어신호
CPU 외부로 제어신호 전달
- 메모리에 전달하는 제어신호, 입출력 장치에 전달하는 제어신호 두가지
- 메모리에 저장된 값을 읽거나, 쓸떄 메모리로 제어신호 내보냄
- 입출력장치의 값을 읽거나 입출력장치에 새로운값을 쓰고 싶을때 입출력장치로 제어신호 내보냄
*제장치는 플래그 레지스터로부터 플래그 값을 받아들이고, 명령어 레지스터로부터 현재 해석할 명령어를 받아들임 그리고 제어버서를 통해 제어신호를 내보냄(외부로)
레지스터
- 프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장됨
필수로 알아야하는 레지스터
- 프로그램 카운터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 플래그 레지스터
- 범용 레지스터
- 스택 포인터
- 베이스 레지스터
프로그램 카운터
- 메모리에서 가져올 명령어의 주소, 메모리에서 읽어들일 명령어의 주소를 저장함
- 명령어 포인터라고도 부름
명령어 레지스터
- 해석할 명령어, 방금 메모리에서 읽어들인 명령어를 저장하는 레지스터
메모리 주소 레지스터
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어들이고자 하는 주소값을 주소버스로 보낼 때 메모리 주소 레지스터를 거침
메모리 버퍼 레지스터
- 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터, 읽기 쓰기
- 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거침, 메모리 데이터 레지스터
실행흐름
실행할 프로그램이 메모리에 저장되어 있음 -> 프로그램 카운터에 처음 실행할 프로그램의 메모리 주소 저장 -> 메모리 주소를 읽어 들이기 위해 메모리 주소 레지스터에 프로그램 카운터에 저장된 메모리 주소를 메모리 주소저장 -> 메모리 읽기 제어신호, 메모리주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내짐 -> 메모리 주소에 저장된 값은 데이터 버스를 통해 메모리 주소 레지스터에 전달, 프로그램 카운터는 증가되어 다음 명령어를 읽을 준비 -> 메모리 버퍼레지스터에 저장된 값은 명령어 레지스터로 이동 -> 프로그램 카운터는 지속적으로 증가하며 계속해서 다음 명령어를 읽어들일 준비를 함 -> 반복
범용 레지스터
- 다양하고 일반적인 상황에서 자유롭게 사용할수 있는 레지스터
- 데이터와 주소를 모두 저장할 수 있음
플래그 레지스터
- ALU 연산결과에 따른 플래그를 플래그 레지스터에 저장
- 연산결과 , CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
스택 포인터
- 스택은 한쪽이 막혀있는 통 형식의 자료구조 LIFO형식
- 스택의 맨꼭대기에 있는 저장한 값의 위치, 주소를 저장하는 레지스터
- 스택의 어디까지 데이터가 채워져 있는지에 대한 표시
변위 주소 지정방식
- 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효주소를 얻어내는 주소 지정방식
- 레지스터 값 + 오퍼랜드 필드의 값 = 유효주소
상대 주소 지정 방식
- 오퍼랜드와 프로그램 카운터 값을 더하여 유효주소를 얻는 방식
- 오퍼랜드 + 프로그램 카운터 = 실행할 명령어 주소의 +,- 값만큼 이동
베이스 레지스터 주소 지정방식
- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효주소를 얻는방식
- 베이스 레지스터 + 오퍼랜드 = 메모리 주소
명령어 사이클과 인터럽트
명령어 사이클
- 프로그램 속 각각의 명령어 들은 일정한 주기가 반복되며 실행됨 -> 명령어 사이클
- 명령어는 일반적으로 인출과 실행 사이클을 반복하며 실행됨
인출사이클
- 메모리에 있는 명령어를 CPU로 가지고 오는 단계
실행 사이클
- CPU로 가져온 명령어를 실행하는 사이클
- 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어신호를 발생 시키는 단계
간접 사이클
- 메모리에 한번 더 접근
인터럽트
- CPU의 정상적인 작업을 방해하는 신호
동기 인터럽트
- CPU의 정상적인 작업을 방해하는 신호
- 오류와 같은 예외적인 상황에 마주쳤을때 발생하는 인터럽트 (예외)
비동기 인터럽트
- 입출력 장치에 의해 발생하는 인터럽트
- 입출력 장치에 작업을 부탁하고 작업이 완료되었을때 발생하는 인터럽트
하드웨어 인터럽트
- CPU는 입출력 도중에 명령어를 효율적으로 처리하기 위해 하드웨어 인터럽트 사용
빠른 CPU를위한 설계 기법
클럭
- 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사분란하게 움직인다.
- CPU는 명령어 사이클이라는 정해진 흐름에 맞춰 명령어들을 실행한다.
- 클럭 속도는 Hz단위로 측정함 1초에 클럭이 몇번 반복되는지를 나타냄
*오버클럭킹 : 최대 클럭 속도를 강제로 더 끌로올리는 기법, 클럭 속도를 무작정 높이면 CPU의 발열문제가 나타남
코어와 멀티코어
- 클럭 속도를 높이는 방법외에 CPU의 성능을 높이는 방법, 코어의 갯수와, 스레드의 갯수를 늘림
- 코어를 여러개 포함하고 있는 CPU를 멀티코어, 멀티코어 프로세서 라고 부름
- 코어의 갯수를 무작정 늘린다고해서 좋은것은 아님 EX) 조별과제, 인원이 많더라도 작업이 적절히 분배 되지 않으면
1명의 조원만 일함 (1~2개의 코어만 일하게됨) - 코어마다 처리할 명령어들을 얼마나 적절하게 분배하는지에 따라 연산속도가 달라짐
스레드와 멀티스레드
하드웨어적 스레드
- 하나의 코어가 동시에 처리하는 명령어의 단위
- EX) 2코어 4스레드, 명령어를 실행하는 부품 2개, 1번에 4개의 명령어를 처리할 수 있다.
- 멀티스레드 프로세서, 멀티 스레드 CPU라고 불림
- 하이퍼 스레딩: 인텔의 멀티스레드 기술
소프트웨어적 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위
- EX) 구글 크롬은 하나의 프로세스, 탭은 스레드
멀티스레드 프로세서
- 멀티스레드 프로세서는 하나의 코어로 여러 명령어도 동시에 처리하는 CPU
- 하나의 코어로 멀티스레드 프로세서를 설계중 핵심은 레지스터
- 프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터 등 하나의 명령어를 처리하기 위해 필요한 레지스터가 여러개 존재하면 가능
- 레지스터 세트 : 하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들
명령어 병렬처리 기법
- CPU가 놀지않고 시간을 알뜰하게 쓰며 작동하게 만드는 것이 중요함
명령어 파이프 라인 , 파이프 라이닝
명령어 처리과정
- 명령어 인출 -> 명령어 해석 -> 명령어 실행 -> 결과 저장
- 같은 단계가 한 클럭안에 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있음
- 같은 단계가 한 클럭안에 겹치지 않는다는 전제하에 명령어를 겹쳐서 수행하면 효율적으로 처리가능
파이프라인 위험 (성능향상에 실패하는 경우)
데이터 위험
- 명령어간 데이터 의존성에 의해 발생함, 어떤 명령어는 이전 명령어를 끝까지 실행해야만 실행할 수 있는 경우
- 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는것을 '데이터 위험'
이라고함 - EX) 아래 코드에서 b는 a가 실행되고 난후에 b를 실행할 수 있음
a = 1 + 2
b = a + 1
제어 위험
- 프로그램 카운터의 갑작스로운 변화에 의해 발생
- 프로그램 카운터는 현재 실행중인 명령어의 다음 주소로 갱신됨
- ex) 프로그램 카운터의 메모리 주소 : 1001(2) => 1002(2)가 아닌 1001(2) => 5001(2)
- 명령어 파이프라인에 미리가지고 와서 처리중이었떤 명령어들은 쓸모가 없어짐 => '제어 위험'
- 분기 예측 : 프로그램이 어디로 분기할지 미리예측 한 후 그 주소를 인출하는 기술
구조적 위험
- 명령어들을 겹쳐 실행 하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 같은 CPU 부품들을 사용하려고 할때 발생
- 자원 위험이라고도 부름
슈퍼스칼라
- CPU내부에 여려개의 명령어 파이프라인을 포함한 구조
- EX) 공장에 생산라인을 여려개 둔것과 같은 구조
- 실제로는 파이프라인 개수에 비례하여 빨라지지 않음
- CPU는 파이프라인 위험을 방지하기 위해 설계되어야함
비순차적 명령어 처리
- 명령어의 합법적인 새치기
- 명령어 파이프라인, 슈퍼 스칼라는 명령어가 순차적으로 실행되는 방식
- 데이터 의존성이 없는 명령어들을 위로 올려 먼저 처리하고, 의존성이 있는 명령어들을 아래로 내려 나중에 처리하는 기법
CISC와 RISC
명령어 집합 Instruction Set Architecture
- CPU가 이해할 수 있는 명령어 들의 모음
- CPU가 어떤 명령어를 이해하는지에 따라 컴퓨터 구조 및 설계 방식이 달라짐
- 서로 컴퓨터가 이해할 수 있는 명령어가 다름
- EX) 같은 소스코드로 만들어진 프로그램도 ISA가 다르면 CPU가 이해할 수 있는 명령어도 어셈블리어도 달라짐
- ISA는 일종의 CPU의 언어
- 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속
- CISC와 RISC는 명령어 병렬 처리 기법을 도입하기 유리한 명령어 집합 구조(ISA)
CISC
- Complex Instruction Set Computer: 복잡한 명령어 집합을 활용하는 컴퓨터(cpu)
- x86-64는 대표적인 CISC 기반 ISA입니다.
- 다양하고 강력한 기능의 명령어 집합을 활용, 명령어 형태와 크기가 다양한 가변길이 명령어 사용
- 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있음 => 컴파일된 프로그램의 크기가 작다
- 메모리를 아낄 수 있음
- 활용하는 명령어의 크기와 실행되기 까지의 시간이 일정하지 않음 => 명령어 파이프라인을 구현하는데 좋지않음, 명령어는 1클럭으로 동일해야 유리
- 실제로 자주사용되는 명령어만 쓰였다 (20% 정도)
RISC
- Reduced Instruction Set Computer
- CISC에 비해 명령어의 종류가 훨씬 적음
- 짧고 규격화된 명령어, 1클럭 내외로 실행되는 명령어 지향
- RISC는 고정길이 명령어를 사용함
- 하나의 명령어가 1클럭 내외로 실행되기 때문에 명령어 파이프라인 기법에 최적화되어 있음
- 메모리에 직접 접근하는 명령어를 load, store 두개로 제한함 => 메모리 접근을 단순화하고 최소화함
- load-store 구조라고 부르기도함
- 메모리 접근을 최소화 하고 레지스터를 활용함, CISC보다 레지스터를 활용하는 연산이 많음
- 사용 가능한 명령어 개수가 CISC보다 적기때문에 CISC보다 많은 명령으로 프로그램을 작동시킴
질문
- 동기 인터럽트와 비동기 인터럽트의 차이점과 특징
- 레지스터의 종류중 플래그 레지스터에 대해 설명해주세요
- 명령어를 병렬처리 하는 기법중 슈퍼스칼라 라는 기법과 비순차적 명령어 처리 기법의 특징과 차이점을 말해주세요
- CISC와 RISC의 차이점은?
공통질문
요소에 인덱스를 걸지 않는 이유는 무엇일까요?
'CS' 카테고리의 다른 글
보조기억 장치 (0) | 2023.07.09 |
---|---|
메모리와 캐시 메모리 (0) | 2023.07.08 |
데이터와 명령어, 명령어 구조 (0) | 2023.07.06 |
DB구조와 유형 (0) | 2023.07.02 |
쓰레드와 쓰레드풀 (0) | 2023.07.02 |