- 저자
- 강민철
- 출판
- 한빛미디어
- 출판일
- 2022.08.16
안녕하세요 !
혼공단 11기로 선정 되어
공부하게 된 박지영입니다 🙂
매주 1회 혼자 공부하는 컴퓨터구조 + 운영체제 요약을 올리고 있습니다.
파이썬, 빡공단 C언어 등 많은 프로그래밍 요약을 올리고 있을거니
다른 글도 많은 관심 부탁드립니다 🥰
Chapter 04 CPU의 작동 원리
04-1 ALU와 제어장치
ALU. 저번요약에 등장했던 용어이죠 ?
ALU는 CPU에서 계산을 담당합니다.
ALU는 레지스터를 통해 피연산자를 받아들이고
제어장치로부터 제어신호를 받아들입니다.
그리고 ALU가 연산을 하여 결과값을 레지스터에 보내고, 플래그를 플래그 레지스터에 보냅니다.
(연산 결과가 연산결과를 담을 레지스터보다 큰 상황 : 오버플로우)
연산결과에 대한 추가적인 상태정보 : 플래그
대표적인 플래그
- 부호 플래그 : 연산한 결과를 부호로 나타냄( 1: 음수, 0 : 양수 )
- 제로 플래그 : 연산결과가 0인지 여부 나타냄 ( 1: 연산결과 0, 0 : 연산결과 0 아님 )
- 캐리 플래그 : 연산결과 올림수나 빌림수가 발생 여부 나타냄 ( 1: 발생함, 0 : 발생하지 않음 )
- 오버플로우 플래그 : 오버플로우가 발생 여부 나타냄 ( 1: 발생함, 0 : 발생하지 않음 )
- 인터럽트 플래그 : 인터럽트가 가능한지 여부 나타냄 ( 1: 가능함, 0 : 가능하지 않음 )
- 슈퍼바이저 플래그 : 커널모드가 실행중인지, 사용자모드가 실행중인지 ( 1: 커널모드, 0 : 사용자모드 )
(1은 긍정, 0은 부정인 경우가 많다)
그리고 플래그들은 플래그 레지스터라는 레지스터에 저장됨.
제어장치 : 제어신호(컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호)를 내보내고, 명령어를 해석하는 부품
클럭 : 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간단위 (똑-딱-똑-딱-)
제어장치는 해석해야 할 명령어(명령어 레지스터)를 받아들입니다.제어장치는 플래그 레지스터 속 플래그 값을 받아들입니다.제어장치는 시스템 버스, 그 중 제어버스로 전달도니 제어신호를 받아들입니다.(제어장치는 CPU 내/외부로 제어신호를 보낸다)
04-2 레지스터
레지스터 종류
- 프로그램 카운터
- 명렁어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 범용 레지스터
- 플래그 레지스터
- 스택 포인터
- 베이스 레지스터
프로그램 카운터(명령어 포인터) : 메모리에서 가져올 명령어의 주소. 메모리에서 읽어 들일 명령어의 주소를 저장
명렁어 레지스터 : 해석할 명령어. 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터
메모리 주소 레지스터 : 메모리의 주소를 저장하는 레지스터
메모리 버퍼 레지스터(메모리 데이터 레지스터) : 메모리와 주고받을 값(데이터/명령어)을 저장하는 레지스터
범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터. 데이터와 주소를 모두 저장할 수 있다.
플래그 레지스터 : 연산결과 또는 CPU상태에 대한 부가적인 정보를 저장하는 레지스터
특정 레지스터를 이용한 주소 지정방식
1. 스택 주소 지정 방식
- 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식. 가장 최근에 저장하는 값부터 꺼낼 수 있다.
(이걸 보니 100p의 스택과 큐가 생각나네요)
- 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터. 마지막으로 저장한 값의 위치를 저장하는 레지스터
- 스택영역 : 스택 메모리 안에 스택데이터를 넣을 영역
2. 변위 주소 지정 방식
변위 주소 지정 방식 : 오퍼랜드 필드 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
변위 주소 지정 방식을 사용하는 명령어는
연산코드 필드, 어떤 레지스터의 값을 더할지 나타내는 레지스터 필드, 주소를 담고 있는 오퍼랜드 필드가 있다.
- 상대 주소 지정 방식 : 오퍼랜드와 프로그램 카운터의 값을 더하여 유효주소를 얻는 방식 ex. 프로그램 카운터가 -3이라면 -3번지에.
- 베이스 레지스터 주소 방식 : 오퍼랜드와 베이스 레지스터의 값을더하여 유효 주소를 얻는 방식
ex. 연산코드의 베이스 레지스터 50, 베이스 레지스터 200이라면 기준 주소 200번지로 부터 50번지 떨어진 코드 실행.
(121~122P 그림 참조하는 것이 이해하기 쉬워요 ! -> 그림이 필요하실 것 같다면 댓글로 알려주세요 !)
04-3 명령어 사이클과 인터럽트
명령어 사이클 : 명령어를 처리하는 정형화된 흐름
-> 이 흐름이 끊어지는 상황 : 인터럽트
프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행 -> 이 주기를 명령어 사이클
메모리에 있는 명령어를 CPU로 가지고 오는 단게 : 인출 사이클
CPU로 가져온 명령어를 실행하는 단계 : 실행 사이클
인출 사이클(가지고 오는)과 실행 사이클(실행하는)을 계속 반복한다.
간혹 메모리에 한 번 더 접근이 필요한 경우가 있습니다. 이것을 간접 사이클이라고 합니다.
인출 사이클 <--(메모리에 접근이 더 필요한 경우 : 간접사이클)--> 실행 사이클
인터럽트
프로그램을 개발하다보면 KeyboardInterrupt(키보드 인터럽트) 같은 인터럽트를 보실 수 있습니다.
인터럽트는 영어로 interrup이며 "방해하다, 중단시키다"라는 것을 의미합니다.
이렇게 CPU의 작업을 방해하는 신호를 인터럽트라고 합니다.
인터럽트의 종류
1. 동기 인터럽트(예외) : 예상치 못한 상황을 마주쳤을때. CPU가 실행하는 프로그래밍 상의 오류같은 예외적인 오류가 발생했을 때
- 폴트 : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외.
- 트랩 : 예외를 처리한 직수 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외.
(디버깅 : 프로그램 개발 중에 발생한 문제를 진단하고 해결하기 위한 작업)
- 중단 : CPU가 실행 중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때
- 소프트웨어 인터럽트 : 시스템 호출이 발생했을 때
2. 비동기 인터럽트(하드웨어 인터럽트) : 입출력 장치에 의해 발생.
- 막을 수 있는 인터럽트
- 막을 수 없는 인터럽트
하트웨어 인터럽트 처리 순서 :
(인터럽트 요청 신호 -> 인터럽트 플래그 -> 인터럽트 벡터 -> 인터럽스 서비스 루틴(인터럽트 핸들러). 을 반복
(백업을 복구 실행하여 벡터부터 시작하며 반복))
인터럽트 서비스 루틴 : 인터럽트를 처리하기 위한 프로그램
인터럽트 벡터 : 서비스 루틴을 식별하기 위한 정보
Chapter 05 CPU 성능 향상 기법
05-1 빠른 CPU를 위한 설계 기법
클럭 (클럭 속도는 헤르츠 단위(Hz)) -> 클럭 속도가 높은 CPU는 빠르게 작동한다.
클럭속도는 일정하지 않습니다.
다만, 고성능을 요하는 순간에는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때는 유연하게 클럭 속도를 낮춘다.
최대 클럭 속도를 강제로 더 끌어올릴 수도 있다 (이런 기법을 오버클럭킹)
코어 : 명령어를 실행하는 부품
멀티코어CPU(멀티코어 프로세서) : 코어를 여러 개 포함하고 있는 CPU
스레드 : 실행흐름단위
- 하드웨어적 스레드 : 하나의 코어가 동시에 처리하는 명령어 단위
(멀티스레트 프로세서 or 멜티스레드 CPU라고도 한다.)
(하이퍼스레딩이라는 용어 자주 나오기 기억해두기)
- 소프트웨어적 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위
(python, java c++ 등의 프로그래밍 언어를 이용해 소프트웨어적 스레드 만들 수 있다)
멀티스레드 프로세서는 실제로 설계하는 일은 복잡하지만 핵심은 레지스터입니다.
하나의 코어로 여러 개 명령어를 동시에 실행 할 수 있는 CPU
하드웨어 스레드를 논리 프로세서라고도 부른다.
05-2 명령어 병렬 처리 기법
명령어를 동시에 처리하여 CPU를 한시도 쉬지않고 작동시키는 기법 : 명령어 병령 처리 기법.
대표적으로 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있습니다.
마치 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 부른다.
(명령어 파이프라이닝 : 동시에 여러 개의 명령어를 겹쳐 실행하는 기법)
파이프라이닝이 높은 성능을 가져오기는 하지만 성능 향상 실패하는 경우도 있다. 이러한 상황을 파이프라인 위험이라고 한다.
파이프라인 위험의 종류는 데이터 위험, 제어 위험, 구조적 위험이다.
데이터 위험 : 명령어 간 데이터 의존성에 의해 발생
제어 위험 : 분기 등으로 인한 프로그램 카운터의 갑작스로운 변화에 의해 발생
-> 제어위험을 위해 사용하는 기술. 분기예측 : 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술
구조적 위험(자원위험) : 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU,
레지스터 등과 같은 CPU 부품을 사용하려고 할때 발생
슈퍼스칼라 : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
비순차적 명령어 처리 : 이름에도 알 수 있듯 명령어들을 순차적으로 실행하지 않는 기법. '합법적 새치기' 느낌
무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지한다.
05-2 명령어 병렬 처리 기법
어느덧 CPU의 마지막 이야기입니다.
CPU의 언어인 ISA와 각기 다른 성격의 ISA를 기반으로 설계된 CLSC와 RLSC를 학습해보겠습니다.
CPU가 이해할 수 있는 명령어들의 모음을 명령어 집학 or 멸령어 집합 구조(ISA)라고 합니다.
CPU마다 ISA가 다를 수 있다는 것.
CLSC와 RICC 이론 비교
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝하기 어려움 | 파이프라이닝하기 쉬움 |
이렇게 혼공단 컴퓨터구조 + 운영체제 1주차 4~5파트 요약 정리를 마쳤습니다.
이제 미션을 해볼까요??
2주차 (1/8 ~ 1/14) |
Chapter 04 ~ 05 | p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기 | Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기 |
기본 미션 인증
선택미션의 개념은
위에 요약정리에 있어요 !
이렇게 2주차도 잘 마쳤는데
10기때보단 열심히 할 수 있어서 뿌듯하네요.그때는 파이썬과 자바를 동시에 해서 너무 힘들었어요ㅠㅠ다들 공부를 하려면 역시 한가지를 최대한 열심히 파는게 좋은 것 같아요 !!
1주차엔 우수혼공단은 아니지만
참고하세요 !! 로 되어서 내심 기뻤습니다 !!
제 요약글이 참고해도 될 정도라니 너무 좋았어요 !!