본문 바로가기
Minecraft - Diamond Picaxe
학교 공부

혼자 공부하는 컴퓨터 구조 + 운영체제

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard?cid=329800

 

[지금 무료]개발자를 위한 컴퓨터공학 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가 받아들이고 내보내는 정보
플래그 레지스터의 예시

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

CPU 내부의 제어장치

제어장치가 받아들이고 내보내는 정보

  • 여기서 클럭이란, 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다. 
  • 명령어 레지스터로부터 해석할 명령어를 받아들일 때, 부가적인 정보도 필요하기에 플래그 값도 받아들인다.
  • 외부로부터 발생한 제어 신호를 CPU 내부의 제어장치도 받아들여야 한다. 

CPU 내부의 레지스터

 

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

스택 포인터

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

변위 주소 지정 방식
프로그램 카운터와 더함(상대 주소 지정 방식)
베이스 레지스터와 더함(베이스 레지스터 주소 지정 방식)

 


인터럽트

 

  • 명령어는 "인출사이클 -> (메모리 접근이 더 필요한 경우) 간접사이클 -> 실행사이클" 의 사이클을 거친다. 이 흐름을 방해하는 신호가 인터럽트이다.
  • 아무때나 발생하는 것이 아닌 CPU가 꼭 주목해야하거나, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 인터럽트가 발생한다.
  • 인터럽트는 동기 인터럽트(예외), 비동기 인터럽트(하드웨어 인터럽트)로 나뉜다.
  • 동기 인터럽트(예외): CPU에 예기치 못한 상황을 접했을 때 발생한다. (ex. CPU가 접근하고자 한 메모리에 데이터가 없다던가, 디버깅을 한다던지, 실행할 수 없는 명령어라던지) 크게 폴트, 트랩, 중단, 소프트웨어 인터럽트로 나뉜다.
  • 비동기 인터럽트(하드웨어 인터럽트): 주로 입출력장치에 의해 발생하며 알림과 같은 역할을 한다. 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다.

  1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지 여부를 확인한다.(인터럽트 플래그는 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트, 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님)
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다. (스택 영역에 백업해둠)
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.(인터럽트 서비스 루틴: 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램, 프로그램이기에 일반적으로 메모리에 저장), (인터럽트 벡터: 각각의 인터럽트를 구분하기 위한 정보, 인터럽트 서비스 루틴이 각각 다른데 이를 구분하기 위해 존재, CPU가 해당 인터럽트의 서비스 루틴 시작주소를 알기 위해 존재)
  6. 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.

최종 명령어 사이클 구성


클럭 속도

 

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

 


코어(Core)

 

현대적인 관점에서 CPU

  • 코어는 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