[지금 무료]개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제| 강민철 - 인프런
현재 평점 4.9점 수강생 19,533명인 강의를 만나보세요. 베스트셀러 『혼자 공부하는 컴퓨터 구조 + 운영체제』 저자 무료 직강. 개발자들이 꼭 알아야 할 컴퓨터 구조, 운영체제 전공서 요약집. 컴
www.inflearn.com
위 강의를 참고하였습니다!
전공으로 컴퓨터구조를 배웠고 곧 운영체제를 배우게 될 예정이지만,
복습 및 예습 개념으로 수강하였습니다.
.
새롭게 알게 된 내용 및 중요 개념을 중심으로 글을 작성하고자 합니다.
컴퓨터의 4가지 핵심 부품
- CPU (ALU, 레지스터, 제어장치)
- 메모리 (=메인메모리, 주기억장치의 줄임말.하드웨어로는 ROM과 RAM이 있지만 특히 RAM에 주목한다. 지금 실행중인 프로그램의 명령어와 데이터를 저장한다)
- 보조기억장치 (메모리의 RAM은 보조기억장치에 비해 비싸고, 전원이 꺼지면 저장된 내용을 잃는다. 그래서 사용하는 게 보조기억장치이다. 지금 실행하고 있지 않은 프로그램의 내용을 저장한다. 즉 보관할 내용을 저장할 수 있다)
- 입출력장치
들 장착(?)한 메인보드(마더보드)는 시스템 버스(주소 버스, 데이터 버스, 제어 버스)를 통해서 정보를 주고받을 수 있다.
명령어의 구조
- '연산코드(수행할 연산) + 오퍼랜드(연산에 사용될 데이터 or 연산에 사용될 데이터가 저장된 위치)'로 구성되었다.
- 보통은 오퍼랜드에 연산에 사용될 데이터가 저장된 위치를 담고 있어서, 오퍼랜드를 주소필드라고도 한다.
- 연산코드의 종류와 생김새는 CPU마다 다르지만, 보통은 크게 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어가 있다.

명령어 주소 지정 방식 (addressing modes)
+ 유효 주소(effective address): 연산에 사용할 데이터가 저장된 위치
명령어 주소 지정 방식이란 연산에 사용할 데이터가 저장된 위치를 찾는 방법, 유효 주소를 찾는 방법, 다양한 명령어 주소 지정 방식들이 존재한다.
- 즉시 주소 지정 방식(immediate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시, 가장 간단한 형태의 주소 지정 방식, 연산에 사용할 데이터의 크기가 작아질 수도 있지만 빠르다.

- 직접 주소 지정 방식(direct addressing mode): 오퍼랜드 필드에 유효 주소를 직접적으로 명시, 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어든다.

- 간접 주소 지정 방식(indirect addressing mode): 오퍼랜드 필드에 유효 주소의 주소를 명시, 앞선 주소 지정 방식들에 비해 속도가 느리다. CPU가 메모리를 뒤적뒤적(..) 거리는 시간은 굉장히 속도가 느리다. 그래서 메모리 접근을 최소화하는 것이 속도면에서는 가장 좋다.

- 레지스터 주소 지정 방식(register addressing mode): 연산에 사용할 데이터가 저장된 레지스터를 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠르다.

- 레지스터 간접 주소 지정 방식(register indirect addressing mode): 연산에 사용할 데이터를 메모리에 저장, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시한다.

CPU 내부의 ALU


- ALU는 CPU 내부에 있는 계산기 역할을 하는 회로이다.
- 계산을 하기 위해서는 피연산자와 수행할 연산이 필요하다. 피연산자는 레지스터로부터 받아들이고, 수행할 연산은 제어장치로부터 제어신호로서 받아들인다.
- 플래그는 연산 결과에 대한 부가적인 정보이다. (부호플래그, 제로플래그, 캐리플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그)
CPU 내부의 제어장치

- 여기서 클럭이란, 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다.
- 명령어 레지스터로부터 해석할 명령어를 받아들일 때, 부가적인 정보도 필요하기에 플래그 값도 받아들인다.
- 외부로부터 발생한 제어 신호를 CPU 내부의 제어장치도 받아들여야 한다.
CPU 내부의 레지스터
- 레지스터는 CPU 내부의 작은 임시저장장치로 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장한다.
- 프로그램 카운터: 메모리에서 가져올 명령어의 주소(메모리에서 읽어 들일 명령어의 주소, 1증가한다)
- 명령어 레지스터: 해석할 명령어(방금 메모리에서 읽어 들인 명령어)
- 메모리 주소 레지스터: 메모리의 주소(CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
- 메모리 버퍼 레지스터: 메모리와 주고받을 값(데이터와 명령어)
- 플래그 레지스터: 연산 결과 또는 CPU 상태에 대한 부가적인 정보
- 범용 레지스터: 다양하고 일반적인 상황에서 자유롭게 사용(보통 여러 개 있음)
- 스택 포인터: 주소 지정에 사용, 스택의 꼭대기를 가리키는 레지스터(스택이 어디까지 차 있는지에 대한 표시), 스택 주소 지정 방식이란 스택과 스택 포인터를 이용한 주소 지정 방식, 추가적으로 스택은 메모리 안에 스택처럼 쓸 수 있게 지정된 공간이 있다.

- 베이스 레지스터: 주소 지정에 사용, 기준 주소를 저장하는 레지스터, 변위 주소 지정 방식이란 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터 or 베이스 레지스터)의 값을 더하여 유효 주소를 얻기 때문에 명령어 구조가 연산코드 + 레지스터 + 오퍼랜드로 구성되어 있다.



인터럽트
- 명령어는 "인출사이클 -> (메모리 접근이 더 필요한 경우) 간접사이클 -> 실행사이클" 의 사이클을 거친다. 이 흐름을 방해하는 신호가 인터럽트이다.
- 아무때나 발생하는 것이 아닌 CPU가 꼭 주목해야하거나, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 인터럽트가 발생한다.
- 인터럽트는 동기 인터럽트(예외), 비동기 인터럽트(하드웨어 인터럽트)로 나뉜다.
- 동기 인터럽트(예외): CPU에 예기치 못한 상황을 접했을 때 발생한다. (ex. CPU가 접근하고자 한 메모리에 데이터가 없다던가, 디버깅을 한다던지, 실행할 수 없는 명령어라던지) 크게 폴트, 트랩, 중단, 소프트웨어 인터럽트로 나뉜다.
- 비동기 인터럽트(하드웨어 인터럽트): 주로 입출력장치에 의해 발생하며 알림과 같은 역할을 한다. 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다.
- 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
- CPU는 실행사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지 여부를 확인한다.(인터럽트 플래그는 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트, 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님)
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다. (스택 영역에 백업해둠)
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.(인터럽트 서비스 루틴: 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램, 프로그램이기에 일반적으로 메모리에 저장), (인터럽트 벡터: 각각의 인터럽트를 구분하기 위한 정보, 인터럽트 서비스 루틴이 각각 다른데 이를 구분하기 위해 존재, CPU가 해당 인터럽트의 서비스 루틴 시작주소를 알기 위해 존재)
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.

클럭 속도
- 클럭 속도: 헤르츠(Hz) 단위로 측정
- 헤르츠(Hz): 1초에 클럭이 반복되는 횟수
- 클럭이 '똑딱' 하고 1초에 한 번 반복되면 1Hz
- 클럭이 1초에 100번 반복되면 100Hz
코어(Core)

- 코어는 CPU 내에서 명령어를 실행하는 부품으로 여러 개 있을 수 있다.(싱글코어, 멀티코어)
- 멀티코어의 경우, 얼마나 명령어들을 각각의 코어에 적절히 분배하는 지가 연산 속도 면에서 중요하다.
스레드
- 프로세스(실행 중인 프로그램) 내에서 실제로 작업을 수행하는 가장 작은 단위의 실행 흐름
- 하드웨어적 스레드, 소프트웨어적 스레드로 나뉜다.
- 하드웨어적 스레드(=논리 프로세서): 하나의 코어가 동시에 처리하는 명령어 단위(ex. 1코어 1스레드 CPU, 2코어 4스레드 CPU와 같이 멀티 스레드 CPU 등)
- 하나의 코어가 하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들을 여러 개 가지고 있다면, 멀티스레드 CPU를 설계할 수 있다.
- 소프트웨어적 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위(싱글스레드 vs 멀티스레드)
- 1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다.
'학교 공부' 카테고리의 다른 글
| Kotlin 공부 (0) | 2026.01.30 |
|---|---|
| git, github 공부 (0) | 2025.07.22 |
