마지막챕터 : 컴퓨터
[ 소통을 원하지는 않습니다 ]
혼공컴운 (2)
[혼공컴운] 2주차_컴퓨터 구조+운영체제 04장 ~ 05장

Chapter 04 CPU와 작동 원리

04-1 ALU(Arithmetic Logic Unit)와 제어장치(Control Unit)

- ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들입니다.

- ALU는 연산 결과와 플래그를 내보냅니다. 

- 제어장치는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들입니다.

- 제어장치는 CPU 내부와 외부로 제어 신호를 내보냅니다.

 

출처: 혼자 공부하는 컴퓨터구조 + 운영체제. 한빛미디어

 

** 4장 ALU와 제어장치(105쪽)에서 "CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느립니다. ALU가 연산할 때마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접근하게 되고, 이는 CPU가 프로그램 실행 속도를 늦출 수 있습니다. 그래서 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장하는 겁니다."라는 부분이 있는데, 이는 마치 ALU가 결괏값을 속도 때문에 레지스터에 저장하는 말처럼 들리지만, 개인적으로는 ALU가 RAM과 직접 데이터나 신호를 주고 받을 수 없어서 레지스터에 저장하는 게 적절한 설명이 아닐까 싶습니다.
ALU는 CPU의 제어장치(CU, Control Unit)과 데이터 버스를 통해서 램(RAM)과 데이터 전송을 진행한다고 합니다. 물론, 레지스터에 결괏값을 저장하는 게, 제어장치와 데이터 버스를 통해 램에 저장하는 것보다 속도가 빠른 건 맞다고 생각합니다.  

참고로, 초기 컴퓨터 아키텍처가 발전할 때, 레지스터가 RAM 메모리보다 먼저 포함됐었다는 얘기가 있습니다. 

 

** 플래그 레지스터(Flag register)에 저장되는 플래그에 대한 설명도 컴퓨터의 구조를 이해하는 데 도움이 될만할 것 같은데, 요약 부분에는 없어서 참고로 기록해 둡니다. 

- 부호 플래그: 연산한 결과의 부호를 나타낸다. 

- 제로 플래그: 연산 결과가 0인지 여부를 나타낸다. (0으로 나눌 수 없는 오류를 방지하기 위한 조치가 아닌가 추측됩니다.)

- 캐리 플래그: 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다. 

- 오버플로우 플래그: 연산 결과가 연산 결과를 담을 레지스터보다 큰 상황을 오버플로우(Overflow)라고 하는데, 이 오버플로우가 발생했는지 나타낸다고 합니다. 

- 인터럽트 플래그: 인터럽트가 가능한지를 0과 1로 나타내며, 1인 경우에는 인터럽트가 가능하고, 0인 경우에는 인터럽트가 불가능하다고 합니다. 하드웨어 인터럽트가 가능할 때와 불가능할 때(요청 무시)가 이 플래그를 통해 판단되는 것 같습니다. 

- 슈퍼바이저 플래그: 커널 모드(Kernel mode)와 사용자 모드(User mode) 중 어떤 모드로 실행 중인지 나타낸다고 합니다.  

 

** 이 책을 읽어 보니 ALU가 산술 논리 연산을 하는 중요한 장치이긴 하지만, 컴퓨터나 CPU의 동작을 이해할 때는 제어장치가 어떤 역할을 하는지 이해하는 게 초심자에게는 꽤 중요할 거라는 생각이 듭니다. 예전에 읽었던 책에서 제어장치를 간단하게 다룬 건지 아니면 읽어봐도 무슨 소리인지 몰라서 그냥 대충 넘어간 건지는 기억나지 않습니다. ㅋㅋㅋ 
제어장치(Control Unit)이 데이터 주고 받는 장치와 순서(순차)를 떠올려 보면 이 챕터를 이해하는 데 좋을 것 같습니다. 

그래서 111쪽 3번 문제도 참고로 기록해 봅니다. 정답은 책 뒷부분에..

출처: 혼자 공부하는 컴퓨터 구조 + 운영체제. 한빛미디어.

 

 

04-2 레지스터(Register)

- 프로그램 카운터(PC, Program Counter)는 메모리에서 가져올 명령어의 주소, 명령어 레지스터는 해석할 명령어를 저장합니다. 

- 메모리 주소 레지스터(MAR, Memory Address Register)는 메모리의 주소, 메모리 버퍼 레지스터는 메모리와 주고 받을 데이터를 저장합니다. 

- 범용 레지스터(GR, General Purpose Register)는 데이터와 주소를 모두 저장하고, 플래그 레지스터는 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장합니다. 

- 스택 포인터(SP, Stack Pointer)는 스택 최상단의 위치를 저장합니다.

- 베이스 레지스터(BR, Base Register)에 저장된 주소는 기준 주소로서의 역할을 합니다.  

 

04-3 명령어 사이클과 인터럽트

- 명령어 사이클은 하나의 명령어가 처리되는 주기로, 인출(Fetch), 실행(Execute), 간접 인터럽트 사이클(Indirect Cycle)로 구성되어 있습니다. 

- 인터럽트는 CPU의 정상적인 작업을 방해하는 신호입니다. 

- 인터럽트의 종류에는 예외(Exception)와 하드웨어 인터럽트(Hardware interrupt)가 있습니다. 

- 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램입니다. 

 

** 명령어 사이클은 인출(Fetch), 해석(Decode), 실행(Execute) 순서로 진행되는 것 같고, 작업에 따라 메모리 접근(Memory Access)이나 결괏값을 저장하는 과정이 들어갈 수도 있는 것 같으나, 갈수록 사이클을 단순화하는 방향으로 나아가고 있다고 하는 것 같습니다. 

 

** 동기 인터럽트(Synchronous interrupt)를 프로그램이 발생시키는 소프트웨어 인터럽트(Software interrupt)로, 비동기 인터럽트(Asynchronous interrupt)를 하드웨어 인터럽트(Hardware interrupt)로 보는 의견도 있는 것 같습니다. 이 책에서는 "동기 인터럽트"라는 용어 대신 "예외"라는 용어로 사용한다고 하네요. 옛날 기억과 조금 다른 것 같아 찾아보니 예외는 동기 인터럽트의 하위 집합(?)으로 보는 게 일반적인 것 같은데, 초심자 분들을 위한 서적임을 감안해서 대체한 것 같습니다.

 

 

 


Chapter 05 CPU 성능 향상 기법

05-1 빠른 CPU를 위한 설계 기법
- 클럭 속도가 높은 CPU는 빠르게 작동합니다. 

- 코어란 CPU 내에서 명령어를 실행하는 부품입니다. 

- 멀티코어 프로세서란 여러 개의 코어를 포함하는 CPU를 말합니다. 

- 스레드에는 하드웨어적 스레드와 소프트웨어적 스레드가 있습니다. 

- 멀티스레드 프로세서란 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU를 말합니다. 


05-2 명령어 병렬 처리 기법 
- 명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법입니다. 

- 슈퍼스칼라는 여러 개의 명령어 파이프라인을 두는 기법입니다. 

- 비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법입니다. 


05-3 CISC(Complex Instruction Set Computer)와 RISC(Reduced Instruction Set Computer)
- ISA(Instruction Set Architecture)는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속입니다. 

- CISC는 복잡하고 다양한 종류의 가변 길이 명령어 집합을 활용합니다. 

- RISC는 단순하고 적은 종류의 고정 길이 명령어 집합을 활용합니다. 

 

 

 

 

[기본 숙제] 

 

125쪽 2번 문제.

2. 설명에 맞는 레지스터를 보기에서 찾아 빈칸()을 채워 보세요.

보기: 프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터

- ① (플래그 레지스터): 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터

- ② (프로그램 카운터): 메모리에서 가져올 명령어의 주소를 저장하는 레지스터

- ③ (범용 레지스터): 데이터와 주소를 모두 저장할 수 있는 레지스터

- ④ (명령어 레지스터): 해석할 명령어를 저장하는 레지스터

 

155쪽 4번 문제.

4. 다음 그림은 멀티코어 CPU를 간략하게 도식화한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요.

-> 코어(Core)

출처: 혼자 공부하는 컴퓨터 구조 + 운영체제. 한빛미디어.

 

 

[추가 숙제]

Ch.05(05-1). 코어(Core)와 스레드(Thread), 멀티 코어(Multi Core)와 멀티 스레드(Multi Thread)의 개념을 정리하기

 

코어(Core): 프로세서(Processor) 안에서 독립적이고 물리적인 처리 유닛.(하드웨어 안의 부품) 

코어가 여러 개 있는 프로세서는 멀티 코어 프로세서.

 

스레드(Thread): 프로세스(Process) 실행하는 가장 작은 실행 경로로, 코드의 실행 경로라고 합니다. 각 스레드는 프로세스 안에서 메모리를 서로 공유할 수 있습니다. 

스레드를 동시에 여러 개 운용 할 수 있으면 멀티 스레드(Multi thread)

 

코어도 프로세서 안에서 메모리 영역을 공유할 수 있지만 여러 과정이 필요하고(통신일 듯), 스레드는 별도의 과정 없이 직접적으로 공유된 메모리를 다룰 수 있습니다. 요즘 보통의 컴퓨터 구성은 당연히 멀티 스레드, 멀티 코어 구조이고, 이 둘은 성능 향상과 효율적인 작업 처리를 목표로 하는 기술입니다.

 

 

 

** 컴퓨터 구조를 이해할 때 필수인 CPU에 대해 다루는 4장과 5장을 읽었는데, 옛날 어렴풋한 기억과 책 내용을 맞춰 보고, 갱신(?)했습니다. 같은 주제의 책도 몇 개 정도 다른 시기에 읽어보는 게 좋은 이유는 머리 속에 남아있는 내용이 제대로 된 건지 살펴보며 다시 짜맞출 수 있기 때문입니다. 

클럭(Clock) 신호의 역할을 컴퓨터 부품들을 타이밍에 맞춰 일사불란하게 움직여 속도를 높이거나 줄이는 역할이라고 했는데, 타이밍을 맞추는 이유가 속도를 높이는 이유보다 중요한 것 같습니다. 

 

** 최신 데스크톱 PC용 인텔 CPU에서는 하이퍼쓰레딩을 넣지 않는 추세라고 하네요. 

 

하이퍼쓰레딩이란
하이퍼쓰레딩(동시 멀티쓰레딩이라고도 함)은 매우 간단한 개념이다. 각 프로세서 코어는 하나의 명령어 쓰레드를 실행하도록 설계되었지만, 하이퍼쓰레딩은 단일 프로세서 코어 내부에 두 번째 ‘가상’ 프로세서를 생성한다. 하이퍼쓰레딩을 사용하면 개별 프로세서 코어가 항상 두 개의 코어 중 하나 이상에서 명령을 실행해 항상 작동 상태를 유지한다. CPU 코어가 유용한 작업을 수행할 수 있을 때 유휴 상태로 방치되는 것은 마니아들이 원치 않는 일이다.

문제는 두 번째 코어가 ‘진정한’ 두 번째 물리적 코어가 아닌 가상 코어라는 점이다. 이로 인해 리소스 경합과 추가 오버헤드가 발생할 수 있으며, 게임 중 하이퍼쓰레딩을 켜둘지 말지에 대한 문제는 수년 동안 논쟁의 대상이 되어 왔다.  

...

홀록은 “사실 몇 가지가 복합적으로 작용한 결과”라고 말했다. 첫째, 하이퍼쓰레딩을 제품에 포함하지 않음으로써 실제로 전력 소비를 절약할 수 있다는 것을 알았고, 하이퍼쓰레딩을 포함하지 않아도 멀티코어 성능에서 약 15%, 20% 정도 앞서고 있다는 것을 알 수 있다. 따라서 효율성을 높이면서도 전체 컴퓨팅 성능에서 목표를 달성할 수 있었다는 의견이다.
...
출처: 하이퍼쓰레딩 없는 인텔 애로우 레이크, 전력 효율 극대화와 성능 향상 달성할까. - By mark_hachman. ITWORLD. 

 

  Comments,     Trackbacks
[혼공컴운] 1주차_컴퓨터 구조+운영체제 01장 ~ 03장

[책을 읽게 된 이유] 

컴퓨터 운영체제에 대한 복습과 쉬운 설명이 들어있는 안내서를 찾기 위해 "혼자 공부하는 컴퓨터 구조와 운영체제"를 읽게 되었습니다. 현재 01장 ~ 03장을 읽었는데, 아직은 전체 내용에 비해서는 미리보기 정도의 내용인 것 같습니다. 

 

 

 

Chapter 01 컴퓨터 구조 시작하기

 

01-1 구조를 알아야 하는 이유

- 컴퓨터 구조를 이해하면 문제 해결 능력이 향상됩니다.

- 컴퓨터 구조를 이해하면 문법만으로는 알기 어려운 성능/용량/비용을 고려하며 개발할 수 있습니다. 

 

[개인적인 생각] 컴퓨터 운영체제의 목적 중 하나가 응용 프로그램을 컴퓨터 하드웨어와 상호 작용할 수 있게 해주는 것이므로 개발환경이 되는 컴퓨터 구조와 운영체제에 대한 전반적인 이해가 없다면 상호 작용에서 발생할 수 있는 오류나 문제점 등에 대해 적절하게 대응하기 어려운 게 당연하다고 생각됩니다. 

 

01-2 컴퓨터 구조의 큰 그림

- 컴퓨터가 이해하는 정보에는 데이터(Data)와 명령어(Instruction)가 있습니다.

- 메모리(Memory)는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품입니다. 

- CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품입니다. 

- 보조기억장치(Secondary storage)는 전원이 꺼져도 보관할 프로그램을 저장하는 부품입니다. 

- 입출력장치(Input/Output device)는 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품입니다. 

- 시스템 버스(System bus)는 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로입니다. 

 

출처: 혼자 공부하는 컴퓨터 구조 + 운영체제. 한빛미디어.

 

Chapter 02 데이터

 

02-1 0과 1로 숫자를 표현하는 방법

[참고] "정보 단위"란 컴퓨터에서 정보를 처리하고 저장하는 데 사용되는 기본적인 데이터의 크기 또는 형식을 의미합니다. 일반적으로 정보 단위는 다음과 같은 여러 가지 형태로 나뉘어질 수 있습니다. 정보 단위는 데이터 저장, 전송, 처리와 같은 다양한 컴퓨터의 기능에서 중요한 역할을 하며, 효율적인 데이터 관리를 위해 이해하는 것이 중요합니다.

- 비트는 0과 1로 표현할 수 있는 가장 작은 정보 단위입니다.

- 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트는 비트보다 더 큰 정보 단위입니다.

- 이진법은 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 수를 표현하는 방법입니다. 

- 이진법에서 음수는 2의 보수로 표현할 수 있습니다. 

- 십육진법은 15를 넘어가는 시점에 자리 올림하여 수를 표현하는 방법입니다. 

 

** kB, MB, GB, TB와 KiB, MiB, GiB, TiB는 서로 다른 표현이고, 후자는 키비바이트, 메비바이트, 기비바이트, 테비바이트라고 읽는다고 합니다. 새롭게 알게 된 내용.. 


02-2 0과 1로 문자를 표현하는 방법
- 문자 집합은 컴퓨터가 인식할 수 있는 문자의 모음으로, 문자 집합에 속한 문자를 인코딩하여 0과 1로 표현할 수 있습니다. 

- 아스키 문자 집합에 0부터 127까지의 수가 할당되어 아스키 코드로 인코딩됩니다. 

- EUC-KR은 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식입니다. 

- 유니코드는 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일된 문자 집합이며, UTF-8, UTF-16, UTF-32는 유니코드 문자의 인코딩 방식입니다. 

 



Chapter 03 명령어

03-1 소스 코드와 명령어
- 고급 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어입니다. 

- 저급 언어는 컴퓨터가 직접 이해하고 실행할 수 있는 언어입니다.

- 저급 언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있습니다. 

- 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어입니다. 

- 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행는 언어입니다. 


03-2 명령어의 구조
- 명령어는 연산 코드(Operation code)와 오퍼랜드(Operand)로 구성됩니다. 

- 연산 코드는 명령어가 수행할 연산을 의미합니다. 

- 오퍼랜드는 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미합니다. 

- 주소 지정 방식은 연산에 사용할 데이터 위치를 찾는 방법입니다. 

 

[참고] 명령어(Instruction)는 CPU의 명령어 레지스터(IR, Instruction Register) 안에 저장된다고 합니다.

주소 지정 방식(Addressing mode)

- 즉시 주소 지정 방식(Immdiate addressing mode): 연산 코드에서 사용할 데이터(상수값 같은..)를 오퍼랜드 필드에 직접 명시해서 사용.

- 직접 주소 지정 방식(Direct addressing mode): 오퍼랜드 필드에 사용할 데이터의 메모리 유효주소를 명시해서 사용.

- 간접 주소 지정 방식(Indirect addressing mode): 오퍼랜드 필드에서 사용할 데이터의 메모리 유효주소에 대한 주소를 명시해서 사용.

- 레지스터 주소 지정 방식(Register addressing mode): 오퍼랜드 필드에 연산에 사용될 데이터가 들어 있는 레지스터를 명시해서 사용.

- 레지스터  간접 주소 지정 방식(Register indirect addressing mode): 연산에 사용될 데이터를 메모리에 저장하고, 그 메모리의 유효주소를 저장한 레지스터를 오퍼랜드 필드에 명시해서 사용. 

 

** 5개의 주소 지정 방식은 각기 장단점이 있는데(속도, 유효주소의 크기 등), 그건 책 사서 읽으시면 좋을 것 같습니다. 헷갈리는 부분이 있어서 그 부분만 써봤습니다. 

 

 

[기본숙제]

 

51쪽 확인 문제 3번.

다음 설명의 빈칸에 들어갈 알맞은 내용을 써 보세요.

프로그램이 실행되려면 반드시 (메모리)에 저장되어 있어야 합니다.

 

65쪽 확인 문제 3번.

1101(2) 의 음수를 2의 보수 표현법으로 구해 보세요. 

1 1 0 1

↓ 모든 0과 1 뒤집기

0 0 1 0

1 더하기

0 0 1 1

 

1101(2)을 표현한 값은 0011(2)입니다.

 

 

 

 

[추가 숙제]

 

100쪽의 스택과 큐 개념 정리해 보기.

 

스택(Stack)과 큐(Queue)는 자료 구조(Data Structure)의 두 가지 중요한 형태.

스택 (Stack)

스택은 "후입선출(Last In, First Out, LIFO, '리포'라고 읽는다고 합니다.)" 방식으로 작동하는 데이터 구조. 즉, 가장 나중에 추가된 데이터를 가장 먼저 삭제.
 - 푸시(push): 스택에 요소를 추가합니다.
 - 팝(pop): 스택에서 가장 최근에 추가된 요소를 제거하고 반환합니다.
 - 피크(peek): 스택의 가장 위에 있는 요소를 반환하되, 제거하지 않습니다.

큐 (Queue)

큐는 "선입선출(First In, First Out, FIFO, '피포'라고 읽는다고 합니다.)" 방식으로 작동하는 데이터 구조. 즉, 가장 먼저 추가된 데이터를 가장 먼저 삭제.

 - 인큐(enqueue): 큐에 요소를 추가합니다.
 - 디큐(dequeue): 큐에서 가장 먼저 추가된 요소를 제거하고 반환합니다.
 - 프론트(front): 큐의 가장 앞에 있는 요소를 반환하되, 제거하지 않습니다.

  Comments,     Trackbacks