반응형
ALU
- 다양한 계산 담당
- 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들임
- 연산결과(결과값)를 레지스터에 저장하고, 연산결과에 대한 추가적인 정보인 플래그를 플래그 레지스터에 저장
- 플래그 종류
- 부호 플래그 : 연산결과의 부호 -> 1(음수) or 0(양수)
- 제로 플래그 : 연산결과가 0인지 여부 -> 1(연산결과 0) or 0(연산결과 0 아님)
- 캐리 플래그 : 연산 결과 올림수 or 빌림수가 발생했는지 여부 -> 1(올림수나 빌림수 발생) or 0(발생 안 함)
- 오버플로우 플래그 : 오버플로우 발생 -> 1(오버플로우 O) or 0(오버플로우 X)
- 인터럽트 플래그 : 인터럽트 가능 여부 -> 1(인터럽트 가능) or 0(인터럽트 불가)
- 슈파바이저 플래그 : 커널모드 or 사용자 모드 -> 1(커널 모드) or 0(사용자 모드) - 내부에 여러 회로 존재 -> 가산기, 보수기, 시프터, 오버플로우 검출기 등
제어장치
- 제어 신호를 내보내고, 명령어를 해석
- 제어 장치가 받아들이는 정보
- 클럭 신호 : 컴퓨터를 동작하게 하는 시간 단위로, 클럭 주기에 맞춰 하나의 명령어 실행
- 해석해야 할 명령어 : 명령어 레지스터로부터 해석할 명령어를 받아들임
- 플래그 값 : 플래그 레지스터의 플래그 값을 받아들이고 이를 참고해 제어 신호 발생
- 제어 신호 : CPU 외부 장치로부터 발생한 제어 신호가 제어 버스를 통해 전달 - 제어 장치가 내보내는 정보
- CPU 외부에 전달 : 메모리에 전달하는 제어 신호 or 입출력장치에 전달하는 제어 신호를 제어 버스를 통해 전달
-> 메모리에 저장된 값을 읽을 때 or 메모리에 새로운 값을 쓰고자 할 때
-> 입출력장치의 값을 읽을 때 or 입출력장치에 새로운 값을 쓰고자 할 때
- CPU 내부에 전달 : ALU에 전달하는 제어 신호 or 레지스터에 전달하는 제어 신호
-> 수행할 연산을 지시할 때
-> 레지스터 간 데이터 이동 or 레지스터에 저장된 명령어를 해석할 때
레지스터
- 프로그램 카운터(Program Counter, PC)
- 메모리에서 읽어 들일 명령어의 주소 저장 -> 바로 이어서 읽어들일 메모리 주소가 저장 - 명령어 레지스터(Instruction Register)
- 방금 메모리에서 읽어 들인 명령어 저장
- 제어 장치가 해당 레지스터에 저장된 명령어를 읽고 이를 해석해 제어 신호 생성 - 메모리 주소 레지스터(Memory Address Register, MAR)
- 메모리의 주소를 저장하는 레지스터 - 메모리 버퍼 레지스터(Memory Buffer Register, MBR)
- 메모리와 주고 받을 값(데이터&명령어)을 저장하는 레지스터 - 플래그 레지스터
- 연산결과 or CPU 상태에 대한 부가적 정보를 저장 - 범용 레지스터
- 데이터와 주소를 모두 저장할 수 있는 레지스터 - 스택 포인터
- 베이스 레지스터
*메모리에 저장된 프로그램 실행 시 레지스터 작동 순서
1) 실행할 프로그램이 메모리의 1000번지 주소부터 위치
2) 프로그램 카운터(PC)에 1000 저장
3) 메모리 주소 레지스터(MAR)에 1000 저장
4) 제어 장치에서 '메모리 읽기' 제어 신호를 제어 버스를 통해, 메모리 주소 레지스터 값을 주소 버스를 통해 메모리에 전달
5) 메모리 1000번지 주소에 저장된 값을 데이터 버스를 통해 메모리 버퍼 레지스터(MBR)에 전달 후 저장, 이후 프로그램 카운터(PC) 증가
6) 메모리 버퍼 레지스터(MBR)에 저장된 값을 명령어 레지스터(IR)에 저장
7) 제어 장치가 명령어 레지스터(IR)의 명령어를 해석하고 제어 신호 발생
8) 1000번지 명령어 처리가 종료되면 프로그램 카운터(PC)에 저장된 명령어 실행
레지스터를 이용한 주소 지정 방식
- 스택 주소 지정 방식
- 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터는 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터 -> 해당 위치에만 데이터 추가&추출 가능
- 메모리 내 스택처럼 사용하는 스택 영역이 존재 - 변위 주소 지정 방식
- 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소를 얻어내는 방법
- 명령어 = 연산 코드 + 레지스터 + 오퍼랜드 필드
-> 상대 주소 지정 방식 : 오퍼랜드와 프로그램 카운터의 값을 더해 유효주소를 구하는 방식
-> 베이스 레지스터 주소 지정 방식 : 오퍼랜드와 베이스 레지스터 값을 더해 유효주소를 구하는 방식
명령어 사이클
- 프로그램 속 각각의 명령어들이 일정 주기로 반복되며 실행되는 것
- 인출 사이클(fetch cycle) : 명령어를 메모리 -> CPU로 가져옴
- 실행 사이클(execution cycle) : CPU로 가져온 명령어를 실행(명령어 해석 및 제어 신호 발생 using 제어장치)
- 간접 사이클(indirect cycle) : 간접 주소 방식 등 유효 주소를 통해 메모리에 다시 접근
인터럽트
- CPU의 정상적인 작업을 방해하는 신호
- 동기 인터럽트 + 비동기 인터럽트
- 동기 인터럽트(synchronous interrupts) : CPU에 의해 발생하는 인터럽트(ex. 프로그램 상의 오류) = 예외(exception)
- 비동기 인터럽트(asynchronous interrupts) : 입출력장치에 의해 발생하는 인터럽트 = 하드웨어 인터럽트
-> 주기적 작업 확인 불필요, 효율적 작업 - 하드웨어 인터럽트 처리 순서
1) 입출력장치 -> CPU에 인터럽트 요청 신호 전송
2) CPU가 실행 사이클을 마치고 새로운 명령어를 인출(fetch)하기 전 인터럽트 여부 체크
3) 인터럽트 요청 확인 후 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 상황인지 확인
4) 수용 가능 시 지금까지의 작업 백업
5) 인터럽트 벡터를 참조해 인터럽트 서비스 루틴 실행
6) 인터럽트 서비스 루틴 종료 시 백업해 둔 작업 복구 후 실행 재개 - 인터럽트 플래그 : 플래그 레지스터 내 하드웨어 인터럽트를 수용할지 여부를 결정하는 플래그
- 인터럽트 서비스 루틴(=인터럽트 핸들러) : 인터럽트를 처리하기 위한 프로그램
- 인터럽트 벡터 : 인터럽트 서비스 루틴을 식별하기 위한 정보 -> 인터럽트 서비스 루틴의 시작 주소를 알 수 있음
- 기존 작업 백업 : 기존 프로그램 카운터 값 등 모든 내용을 메모리 스택 영역에 저장
+) 예외의 종류
- 폴트(fault) : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외
- 트랩(trap) : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외
- 중단(abort) : CPU가 실행 중인 프로그램을 강제 중단해야하는 심각한 오류 발견 시 발생하는 예외
클럭
- 일반적으로 클럭 속도가 CPU는 명령어 사이클을 더 빠르게 반복
- 클럭 속도(Hz) = CPU 속도
- 클럭 속도를 무작정 높이면 심각한 발열 문제 발생
- 오버클럭킹 : CPU는 계속 일정한 클럭 속도를 유지하는 것이 아닌 고성능을 요하는 순간 순간적으로 클럭 속도를 높임
코어와 멀티코어
- 코어 : CPU 내 명령어를 실행하는 부품
- 멀티코어 CPU or 멀티코어 프로세서 : 코어를 여러 개 포함하고 있는 CPU
- 코어 수가 너무 적어도, 너무 많아도 일정 작업량 처리 성능에 크게 영향을 주지 않을 수 있음
스레드와 멀티스레드
- 스레드 = 하드웨어적 스레드 + 소프트웨어적 스레드
- 하드웨어적 스레드 : 하나의 코어가 동시에 처리하는 명령어 단위
- 소프트웨어적 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위 -> 싱글 스레드/멀티스레드
- 멀티스레드 프로세서 : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU
- 하나의 명령어 처리를 위해 필수적인 레지스터(프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터)를 여러 개 가짐
- 하드웨어 스레드 = 논리 프로세서 : 마치 '한 번에 하나의 명령어를 처리하는 CPU'가 여러 개 있는 것 처럼
CPU를 효율적으로 동작 시키는 명령어 병렬 처리 기법
1. 명령어 파이프라인
- 동시에 여러 개의 명령어를 겹쳐 실행하는 기법
- 파이프라인 위험이 발생할 수 있음 = 데이터 위험 + 제어 위험 + 구조적 위험
- 데이터 위험 : 데이터 의존적인 두 명령어를 무작정 동시에 실행할 시 발생하는 위험
- 제어 위험 : 프로그램 카운터의 갑작스러운 변화로 명령어 파이프라인에 미리 가져와 처리 중이던 작업들이 불필요 -> 분기 예측으로 예방
- 구조적 위험 : 서로 다른 명령어가 동시에 ALU, 레지스터 등 CPU 부품을 사용하려 할 때 발생 = 자원 위험
2. 슈퍼 스칼라
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 슈퍼스칼라 프로세서는 매 클럭 주기마다 동시에 여러 명령어 인출, 실행 가능
3. 비순차적 명령어 처리
- 명령어를 순차적으로 실행하지 않는 기법
- 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행해 명령어 파이프라인이 멈추는 것을 방지
명령어 집합
- 명령어 집합 구조(ISA, Instructions Set Architecture) : CPU가 이해할 수 있는 명령어들의 모음
- ISA가 같은 CPU끼리는 서로의 명령어를 이해할 수 있지만 ISA가 다르면 서로의 명령어를 이해할 수 없음
- 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리법 등 -> CPU의 하드웨어 설계에 영향
- CPU의 언어, 하드웨어가 소프트웨어를 이해하는 규칙
CISC
- Complex Instruction Set Computer : 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)
- 복잡하고 다양한 명령어
- 가변 길이 명령어
- 다양한 주소 지정 방식
- 프로그램을 이루는 명령어 수가 적음
- 여러 클럭에 걸쳐 명령어 수행
- 파이프라이닝하기 어려움
RISC
- Reduced Instruction Set Computer : 단순하고 적은 종류의 고정 길이 명령어 집합을 활용하는 컴퓨터
- 단순하고 적은 명령어
- 고정 길이 명령어
- 적은 주소 지정 방식 -> load, store를 통한 메모리 직접 접근
- 프로그램을 이루는 명령어 수가 많음
- 1 클럭 내외로 명령어 수행
- 파이프라이닝하기 쉬움
반응형
'STUDY > 컴퓨터구조&운영체제' 카테고리의 다른 글
Week04(메모리와 캐시메모리&보조기억장치) (0) | 2023.06.12 |
---|---|
Week02(데이터&명령어) (0) | 2023.03.29 |
Week01(컴퓨터의 핵심부품) (0) | 2023.03.22 |