[컴퓨터구조] 혼공컴구 독서 #3 - CPU - ALU, 플래그, 제어장치

2026. 1. 17. 23:34·CS/컴퓨터구조

https://dev-dx2d2y-log.tistory.com/185

 

[컴퓨터구조] 혼공컴구 독서 #2 - 명령어

혼공컴구 책을 쭉 보니까 책 앞부분이 데이터와 명령어를 다루고 있다. 그런데 데이터는 이진수로 숫자와 문자를 표기하는 방법에 대해서 나타내고 있길래.. 이건 패스 이 부분은 https://dev-dx2d2y-

dev-dx2d2y-log.tistory.com

저번에는 명령어에 대해서 다뤄보았다. 명령어와 데이터는 컴퓨터가 알고 있는 것에 해당하며, 이제는 컴퓨터의 핵심부품에 대해서 다뤄보도록한다. 그 첫 번째 주자는 CPU.

 

[컴퓨터구조] 혼공컴구 독서 #1 - 컴퓨터구조 개관 및 기초

혼공컴구 1편에서 CPU의 구조를 간단하게 다뤄보았다. 이제부터 하나씩 다뤄보도록하자면


ALU

ALU, 산술논리연산장치의 매커니즘을 간략히 표현하자면 위와같다. 레지스터에서 피연산자를, 제어장치에서 제어신호를 받아서 연산을 수행한다. 이후 결과와 플래그 레지스터를 반환한다. 결과는 문자나 숫자와 같은 값일수도, 아니면 특정 메모리 주소일수도 있다.

 

레지스터에 결과값을 저장하는 이유는 모든 결과값을 메모리에 저장하면 실행이 느려지기 때문이다. CPU가 메모리에 적게 접근할수록 좋다. 그래서 우선은 레지스터에 저장하는편.


플래그

다른 내용들은 이전에 다루기도했고 알만한 내용이지만, 플래그는 아직 생소하므로 플래그를 다뤄보자면,

 

https://brian3632.tistory.com/entry/%ED%94%8C%EB%9E%98%EA%B7%B8-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0Flag-Register

플래그는 보통 4바이트, 32개의 비트로 이루어져있다. 그중에서 22번비트부터 31번비트까지는 예약용도로 사용한다.

 

과정은 보통 연산 -> 플래그비트 설정 -> 다음연산 시 이를 확인

의 과정이 이루어진다. 예를 들어보면, 오버플로우가 발생할 때 1로 설정되는 OF 플래그가 있는데, 연산하다가 오버플로우가 일어나면 그 연산이 끝나자마자 OF를 1로 설정한다. 제어장치는 이 플래그들을 확인하고 후속연산을 지시하는 등으로 연산이 이루어진다.

 

플래그비트들은 다음을 나타낸다.

※위 사진과 아래 예시들은 x86기반 EFLAGS를 나타낸다. 


1. 상태 플래그

ALU가 연산을 끝마쳤을 때, 연산결과의 상태를 명시한다.

 

CF - Carry Flag

Carry란 최상위비트에서 자리올림이 일어났음을 의미하는데, 주로 unsigned overflow를 의미한다. Unsigned 연산에서 overflow가 일어나면 CF 플래그가 1로 바뀐다.

 

PF - Parity Flag

연산결과에 1을 나타내는 비트가 짝수 개면 1로 바뀐다. 과거에는 데이터 전송 상의 오류로 0이 1로 바뀌거나 하는 일이 있었기 때문에 송수신지에서 PF를 대조해보았다. 현대에서는 잘 안쓰인다.

 

AF - Auxiliary Flag

연산결과 하위 4개 비트에서 Unsigned overflow가 발생했을 때 1로 세팅된다. 직관적이기도하고 2진수와 10진수 변환속도가 빠른데다가 소수계산에서 부동소수점보다 정확성이 높아 4개의 비트에 0~9를 담아 십진수처럼 수를 표기했는데, 15는 마치 0001(1) 0101(5)로 표기했다. (BCD 연산, 현재 자바의 BigDecimal이 소수정확성을 높이려는 의도와 같다. 원리는 다름)

 

BCD를 썼을 때 1010 (십진수 10이지만, BCD에서 4개비트로 사용하려는 범위를 넘어섬)처럼 오버플로우가 발생하면 이를 0001 0000 으로 바꿔줄 수 있도록 플래그비트를 세운 것이다. 역시 현대에는 부동소수점과 그냥 이진수로 수를 저장하기 때문에 잘 안쓰인다.

 

ZF - Zero Flag

연산결과가 0일 경우 1, 아닐 경우 0을 표기한다. == 과 같은 등차연산을 수행할 때에는 내부적으로는 뺄셈을 사용하게되는데, 이 때 두 피연산자가 같다면 0이 반환될 것이다. 이 때 모든 비트들을 훑어보는게 아니라 ZF만 확인하면 빠르게 결과를 알 수 있다.

 

SF - Sign Flag

부호를 나타낸다. 연산결과가 Signed 형태일 경우 연산결과의 첫 번째 비트와 결과가 같다. 0이 양수, 1이 음수. ZF와 비슷하게 부등호연산을 수행할 때 SF를 확인한다.

 

OF - Overflow Flag

Signed overflow가 일어났음을 명시한다.


2. 컨트롤 플래그

ALU와는 무관하지만, 명령어 수행의 조건들을 명시한다. OS 커널이 명령어 수행 전 미리 맞춰둔다.

 

TF - Trap Flag

디버깅용 플래그비트. 만약 디버깅을 위해서 코드를 딱 한 줄 실행해야하는 경우 등이 있을 때, Trap Flag가 1로 설정되면 명령어를 한 개 수행하고, 이후에는 0x01 inturrupt (debug inturrupt)를 발생시켜 명령어나 프로세스의 실행을 중지한다.

 

IF - Inturrupt enable Flag

외부 인터럽트를 허용한다. 인터럽트란 키보드, 마우스, 데이터 도착 등 수많은 외부신호를 의미하는데, 이를 허용하면 작업 중간에 외부 인터럽트가 들어오면 외부 인터럽트 작업을 수행한다. 프로그램은 멈춘다. Context switching과 비슷하다. 1이 허용

 

DF - Direction Flag

데이터를 읽을 때, 0으로 설정되면 데이터를 앞에서부터 읽는다. 즉, 주소값을 증가시키며 읽고, 1로 설정되면 주소값을 감소시키며 읽는다. 즉, 뒤에서부터 읽는다. 보통 데이터는 4바이트 단위로 복사가 이루어지는데, 만약 붙여넣기할 부분이 원본데이터와 겹친다면 제대로된 복사가 이루어지지 않으므로 뒤에서부터 복사하도록 설정할 수 있다.

 

IOPL - I/O Privilage Level

운영체제 커널과 같이 권한이 높은 코드만 I/O 기능에 접근하도록 한다. 2개의 비트를 사용하며, 0이 높은 권한, 3이 낮은 권한이다. 0이 OS 커널이고, 3이 일반 사용자 프로그램이다.

 

여기서  약간 의문이 드는데, "지금 내가 쓰는 블로그 글들은 뭐지? 이것도 I/O 기능인데? 일반 브라우저가 권한이 높지는 않다고 했는데?"라는 생각이 든다.

 

우선 IOPL은 OS가 부팅될 때 00 (OS커널만 I/O 기능에 접근해라)로 설정된 후, 특정한 상황 (특정 관리자 권한을 얻은 프로그램 등)에서만 변하며, 이 변화는 오직 OS 커널만 수행할 수 있다. 왜냐하면 보안문제 때문에. 이론적으로 IOPL이 낮아져서 브라우저도 I/O에 접근가능하면 해커가 브라우저에 코드를 심어놓으면 사용자가 입력하는 정보나, I/O를 통해서 나가는 정보를 다 캐갈 수 있기 때문이다. (물론 아주 똑똑한 개발자들이 아주 많기 때문에 IOPL 이외에도 다른 보안책들이 있다.)

 

그래서 내가 키보드를 누르면, OS가 브라우저 화면을 띄우다가 멈추고 키보드에서 값을 입력받는다. (여기서 IF가 쓰인다. IF가 허용되지 않으면 창을 끄던가 작업이 끝나야함)

 

즉, 브라우저가 읽는게 아니라, OS가 직접 가서 I/O 명령을 수행하고, 브라우저에게 입력된 값을 넘긴다. 그럼 브라우저는 이 받은 글자를 화면에 띄우는 것으로 명령 마무리.

 

NT - Nested Task Flag

인터럽트된 테스크의 연결을 관리한다. 1로 설정되면 현재테스크가 다른 테스크에 의해 호출됨을 의미한다. 즉, 어떤 작업을 수행하다가 현재 테스트로 작업이 변경됨을 의미한다.

 

RF - Resume Flag

디버깅 시에 예외가 발생하면 이를 무시하고 다음 명령어를 수행한다. 그래서 TF가 1로 설정되어있는데 RF도 1로 설정되면 TF 기능을 무시한다.

 

VM - Virtual-8086 Mode

가상8086 모드로 전환되었음을 의미한다. 윈도우에서 ms-dos를 실행시키기위해 사용하는 일종의 보호모드라고

 

AC - Alignment Check

메모리 참조 시 정렬을 활성화한다. CPU는 4바이트씩 메모리를 읽어오는데, 따라서 메모리 시작주소가 4의 배수가 아니면 에러를 발생시킨다. 성능최적화 또는 4바이트씩 비정렬데이터를 읽어올 수 없는 특정CPU와의 최적화를 위해 사용한다.

 

VIF - Virtual Interrupt Flag

IF와 기능이 비슷하다. OS는 일반 프로그램이 IF플래그를 만지면 OS 전체에 영향이가므로, 일반 프로그램이 IF플래그를 만지면 IF플래그가 아니라 VIF플래그를 만지도록 설정했다. 따라서 브라우저가 방해금지를 위해서 IF플래그를 만지면, 실제로는 VIF 플래그를 건드려서 OS가 VIF플래그를 보고 방해금지를 제어한다.

 

VIP - Virtual Interrupt Pending

VIF가 설정된 경우 어쩔 수 없이 다른 요청이 대기하게될 수 있다. 이 때 VIP 플래그를 설정해서 요청이 대기 중임을 알린다.

 

ID - Identification Flag

CPUID 명령 지원 유무를 지정한다. CPUID는 CPU의 제조사, 모델명, 기능 등의 정보를 제공하는 기능이다. 주로 성능을 알아보기 위해서 ID플래그를 1로 설정해 보낸다.

 

이처럼 많은 플래그들이 위치해있다. 주로 쓰이는 플래그는 CF, ZF, SF, OF, IF, 수퍼바이저 플래그(IOPL이 그 예시이다.)가 있다.

 

위 플래그에서 윈도우 x86용 EFLAGS에서 쓰이는 것은 PF, AF (과거의 유산), TF, DF, IOPL, VIF, VIP, VM 등이 있다. x86 이외에도 다른 플래그 필드도 조사해보고 싶으나 그럼 컴구하다가 밤새서 사망할 것이 자명하기 때문에 패스


제어장치

제어장치는 제어신호를 보내고, 명령어를 해석한다고 했다. 제어신호는 컴퓨터 부품을 관리하고 작동시키기 위한 신호다. 여러 곳에서 제어신호와 명령어, 클럭 등의 정보를 받고, 제어신호를 보낸다.


클럭

클럭은 컴퓨터 내부에서 사용되는 시간 단위로, 컴퓨터의 모든 부품들이 이 클럭에 맞춰서 움직인다. 논리회로에 가해지는 전기적 진동의 속도를 나타내며, 이 클럭은 일정 주기가 있다. 그래서 이 주기에 맞추서 데이터 이동, 연산 수행 등이 일어난다. 유의해야할 점은 부품들이 클럭에 맞춰서 작동하는게 아니라, 한 클럭마다 작동한다. 즉, 전기신호가 한 번 딱 올 때 각 부품들이 작업을 수행한다는 것이다.

 

이 클럭이 없다면, 모든 부품들이 저마다 다른 템포로 작업을 수행한다. ALU에서 연산이 엄청 빨리 끝났는데 정작 제어신호가 오는 템포는 엄청 느려서 대기해야하는 경우 등, 중구난방으로 템포가 맞춰진다면 문제가 생기므로 일정 템포를 주어서 그 때마다 연산을 수행토록하는 편이다. 그래서 클럭이 짧다면 일을 자주자주 처리하므로 빠른 일처리가 가능하지만 너무 빠르면 회로가 타버린다고한다.


명령어 처리

명령어 레지스터에서 처리할 명령어를 받는다. 그리고 제어신호를 발생시켜서 수행할 내용을 지시한다.


플래그 읽기

위 플래그 내용의 플래그비트를 읽고, 오류가 생기면 오류를 발생시키는 등 플래그를 확인하고 그에 따라 제어신호를 발생시키는 일을 수행한다.


제어버스에서 전달된 신호 받기

CPU외부 장치에서도 제어신호가 발생한다. 대표적으로 입출력장치. 거기서 발생한 제어신호가 제어버스를 타고 CPU에 도달하는데, 그 신호를 확인한다.


정보 내보내기

이처럼 제어장치는 외부로부터 정보를 받아서 제어장치에 필요한 제어신호를 담아서 전송한다. 이는 크게 CPU 내부와 CPU 외부로 나뉘는데, CPU 내부는 ALU나 플래그 바꾸기 등 레지스터에 관한 것들이고, CPU 외부는 보조기억장치, 입출력장치 등에 관한 것이다.

'CS > 컴퓨터구조' 카테고리의 다른 글

[컴퓨터구조] OOO, OoOE, 토마슬로 알고리즘을 통한 비순차적 명령어 처리 + 혼공컴구 독서 #6 - CPU 성능향상  (1) 2026.01.25
[컴퓨터구조] 혼공컴구 독서 #5 - 명령어 사이클과 인터럽트  (0) 2026.01.23
[컴퓨터구조] 혼공컴구 독서 #4 - CPU 레지스터  (0) 2026.01.20
[컴퓨터구조] 혼공컴구 독서 #2 - 명령어  (0) 2026.01.16
[컴퓨터구조] 혼공컴구 독서 #1 - 컴퓨터구조 개관 및 기초  (1) 2026.01.14
'CS/컴퓨터구조' 카테고리의 다른 글
  • [컴퓨터구조] 혼공컴구 독서 #5 - 명령어 사이클과 인터럽트
  • [컴퓨터구조] 혼공컴구 독서 #4 - CPU 레지스터
  • [컴퓨터구조] 혼공컴구 독서 #2 - 명령어
  • [컴퓨터구조] 혼공컴구 독서 #1 - 컴퓨터구조 개관 및 기초
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[컴퓨터구조] 혼공컴구 독서 #3 - CPU - ALU, 플래그, 제어장치
상단으로

티스토리툴바