본문 바로가기
studylog

[혼공컴운] 1주차_컴퓨터 구조부터 차근차근 (ps.운영체제 딱 기다려!)

by Nam Kyeongmin 2024. 7. 4.

 

 이번 2024년 여름방학, 나는 한빛미디어 혼공학습단에 참여하여

올해 1학기에 배운 운영체제와 컴퓨터 구조를 복습 및 재학습하게 되었다.

학과 수업만으로는 지식이 부족하다고 느꼈고, 1학기 학습이 미흡했다고 판단해

다시 처음부터 차근차근 공부하고 싶었기 때문이다.

 

 그리고 어디가 미흡한지도 잘 파악이 되지 않아서

커리큘럼(틀)과 도서를 제공하는 한빛미디어의 혼공학습단을 활용하여

체계적인 학습을 진행하고자 '혼공컴운'에 참여하여 학습을 시작해 보았다.

 

 이번 포스팅은 1주차 학습에 대한 기록 내용이다.

1주차는 7월 1일부터 7일까지 일주일간의 기간을 가진다.


 

7월 1일 월요일 - "chapter01: 컴퓨터 구조 시작하기"를 학습하다!

 

 첫 스타트인만큼 본격적인 내용에 들어가기 전 프롤로그를 찬찬히 읽었는데,

컴퓨터구조와 운영체제를 아는 것이 왜 중요하고 이 책이 어떤 도움을 줄 수 있는지

세세하게 알려주는 부분이 수록되어 있어서 좋았다.

 

[프롤로그]

- 공부를 하긴 했지만 정확하게 이해가 되지 않았던 전공자라도 이 책을 만난 건 행운입니다.

- 개별 용어를 이해하더라도 전체 그림을 구상하지 못했던 경우가 많았습니다.

... 개별 용어를 유기적으로 엮어 전체 구조를 이해할 수 있도록 도와줍니다.


[ch01-01: 컴퓨터 구조를 알아야 하는 이유]

- 컴퓨터 구조를 이해하면 단순 코드 입/출력을 넘어 유연한 문제 해결 능력을 기르는데 도움을 줍니다.

- 프로그래밍 문법만으론 파악하기 어려운 프로그램의 성능, 용량, 비용을 고려하여 개발하는 능력을 가질 수 있다.

 

 덕분에 분명하고 현실적인 목표를 안고 학습 진행을 시작할 수 있었다.

 

 사실 오늘 학습한 chapter01의 01 내용이 컴퓨터 구조를 알아야 하는 이유에 대한 내용이었기 때문에 바로 chapter01의 02, '컴퓨터 구조의 큰 그림'에 대한 학습 내용을 정리해 보자.

 

컴퓨터 구조의 주요 구성에 대한 접근정리

 

컴퓨터 구조에 대한 접근은 크게,

1. 컴퓨터가 이해하는 정보와

2. 컴퓨터의 네 가지 핵심 부품으로 분리할 수 있다.

 

1. 컴퓨터가 이해하는 정보는 '데이터'와 '명령어'로 모두 이진수로 표현된다.

 여기서 중요한 것은 데이터는 말 그대로 값(키, 몸무게, 문자, 이미지 등)을 의미하고 명령어는 이러한 데이터를 실행하는 정보(출력하라, 계산하라 등)을 의미한다.

즉, 데이터만 있으면 컴퓨터는 동작할 수 없기 때문에 명령어의 역할이 굉장히 중요하다. 또한 컴퓨터 프로그램은 이러한 명령어의 모음이라고 보기도 한다.

 

메인보드를 통해 바라본 컴퓨터의 핵심 부품

 

2. 컴퓨터는 크게 네 가지, CPU(중앙처리장치), 메모리(일반적으로 RAM), 보조기억장치, 입출력장치(IO)로 구성되어 있다. 특히 이 들은 메인보드(=마더보드)에 연결되어 시스템 버스(통로)를 통해 정보를 교환한다. 이때 메인보드에는 다양한 버스가 있으며 시스템 버스는 데이터버스, 제어버스, 주소버스로 구성되어 있다.

데이터버스: 데이터를 보내고 받음

제어버스: (CPU 제어장치의) 제어신호를 보내고 받음

주소버스: 읽거나 저장할 데이터의 위치 정보(주소)를 보내고 받음

 

간략하게 각각의 부품 4가지의 특성을 정리해 보자면,

1) CPU는 제어신호를 통해 메모리 데이터와 명령어를 읽고 실행 / 메모리에 데이터 저장이 가능하다.

2) 메모리는 main memory라고도 불리며 RAM과 ROM이 있는데 일반적으로 RAM을 지칭한다.

이러한 메모리는 현재 실행되는 프로그램의 데이터와 명령어를 저장하고 신호에 따라 CPU에 전달한다.

3) 보조기억장치로는 SD, USB 등이 있으며 비싸고 전원 차단 시 정보가 손실되는 메모리의 단점을 보완

비교적 싸고 전원 차단 이후에도 보관할 파일은 삭제하지 않는 메모리 보조 역할을 수행한다.

4) 마지막 입출력장치는 키보드, 마우스 등 컴퓨터 외부에 연결되어 내부의 데이터와 명령어를 공유하는 장치다.

 

 여기서 조금 더 주목할 것은 CPU인데 CPU는 제어장치, 여러 개의 레지스터, ALU로 구성되어 있다. 여러 개의 레지스터에는 메모리로부터 받아온 명령어와 데이터를 저장하며, 산술연산장치인 ALU는 메모리로부터 받아온 데이터와 명령어를 바탕으로 연산을 수행하고, 제어장치는 메모리에게 제어신호(메모리 읽기, 메모리 쓰기 등)을 보낸다.

 

 추가적으로 앞서 언급한 제어장치에서 보내는 제어신호의 두 가지 케이스를 조금 더 살펴볼 수 있다. 앞서 언급한 시스템 버스의 버스 사용유무가 큰 차이점인데, 메모리를 읽을 때는 CPU에서 주소버스와 제어버스를 사용하며 메모리에 쓸 때는 CPU에서 주소버스, 제어버스, 그리고 데이터버스까지 모두 사용한다는 것이다.

 

 컴퓨터 구조의 핵심요소를 전반적으로 살펴보고 암기보다 흐름을 집중하라고 강조했던 chap01, 간단한 문제까지 풀고 오늘의 학습 기록 마무리!

 

012
chapter01-01,02 문제 풀기 및 채점 완료!

 


 

7월 2일 화요일 - "chapter02: 데이터"를 학습하다!

크게 두 가지 분류,

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

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

구성으로 컴퓨터가 사용하는 데이터 정보에 대한 학습을 진행했다.

 

02-01 / 0과 1로 숫자를 표현하는 방법에서 기억하고 싶은 내용을 정리해 보자.

1) 비트 -> 바이트(8비트) -> 킬로바이트(1000바이트) -> 메가 -> 기가 -> 테라

여기서 킬로 -> 메가 -> 기가 -> 테라로 갈 때 각각 1000씩 증가한다.

2) 1개의 비트는 0과 1, 총 2개의 정보를 표현하기 때문에

n비트는 2^n개의 정보를 표현한다.

3) 이진수는 0b(코드상), 첨자"(2)"(수학상)를 함께 표기하며, 십육진수는 0x(코드상), 첨자"(16)"(수학상)를 함께 표기한다.

 

4) 2의보수 => 이 개념이 좀 중요하다

1. 사용목적: 마이너스를 사용할 수 없는 이진수로 음수를 표현하기 위해!

2. 2의보수는 크게 2가지 방법으로 도출할 수 있다.

2-(1) 어떤 수를 그보다 큰 2^n에서 뺀 값

잘 안 와닿을 수 있을 것 같아서 예시 사진을 함께 첨부한다.

 

2-(2) 어떤 수의 0과1을 모두 반대로 하고 1을 더한 값 (= 비교적 간단)

3. "플래그" 사용 -> 양, 음수에 대한 정보 전달

4. 2^n를 2의 보수법으로 변환하면 자기 자신이 되어 원하는 음수값을 얻을 수 없다. => 2의 보수 한계점

 

5) 십육진법 사용 + 십육진수 -> 이진수 변환

1. 이진법으로만 숫자를 표현하면 그 길이가 너무 길어질 수 있음 -> 십육진법 사용(0~9, A~F)

2. 이진수 <-> 십육진수 간 변환이 매우 간편

3. 십육진수는 한 글자당 (0~9, A~F) 총 16개의 숫자 표현이 가능하기 때문에 2^4, 즉 4개의 비트가 필요하다. 이러한 특징을 가지는 하나의 십육진수 문자는 4개의 비트로 구성된 이진수로 변환할 수 있는 것이다. (간편한 변환) 가령 1(16)은 0001(2), A(16)은 1010(2)로 4비트로 변환될 수 있다.

 

 

02-02 / 0과 1로 문자를 표현하는 방법에서 기억하고 싶은 내용을 정리해 보자.

1) 문자집합: 컴퓨터가 인식하고 표현할 수 있는 문자들의 집합

2) 인코딩: 문자를 (컴퓨터가 인식할 수 있는) 0과 1의 문자코드로 변환하는 과정

3) 디코딩: 0과 1로 이루어진 문자코드를 문자(사람이 읽을 수 있는)로 변환하는 과정

=> 이때 문자집합과 인코딩/디코딩 방법은 매우 다양하게 구성될 수 있다!

 

4) 다양한 인코딩

(1) 아스키 코드: 하나의 문자에 대해 7비트 사용 -> 총 128개 문자 표현 가능, 아스키 문자는 아스키 코드(코드 포인트)로 인코딩되어 컴퓨터에게 읽힐 수 있다. => 한계: 한글 표현 불가, 표현이 가능한 문자 개수의 부족

(2) 한글 인코딩 방식 : 한글의 초성/중성/종성에 값 부여하는 기준에 따라 완성형과 조합형으로 구분

[1] 완성형: '가', '나', '다' 등 한 글자를 단위로 코드 포인트 부여 ex. 'EUC-KR'

[2] 조합형: 'ㄱ','ㅏ','ㄴ','ㅓ' 등 초성/중성/종성 글자 하나를 단위로 코드 포인트 부여 후 추후 코드를 합함

 

(3) EUC-KR: 2바이트로 표현하며, 총 16비트 크기의 코드(값)를 부여한다. 즉, EUC-KR로 인코딩 되는 문자는 네 자리의 십육진수(4비트 필요)로 표현이 가능하다. 이후에도 CP949등 다양한 한글 인코딩 방식이 생겼지만 한글 전체를 표현하기에 넉넉하지 않는다는 한계를 가진다.

 

(4) 따라서, 유니코드 등장 : 대부분 나라의 문자, 특수문자 등을 담은 문자집합 => 언어별 인코딩 실행 수고를 덜어줌.

아스키 코드, EUC-KR 등과 마찬가지로 문자별 고유값이 할당

 그러나, 글자에 부여된 값을 바로 인코딩 값으로 사용하지 않고 인코딩 단계를 한번 더 거치는데, 이때 사용되는 인코딩 방법으로 'UTF-8(대표적)' 존재 : 코드 포인트의 형태에 따라 1부터 4바이트까지의 인코딩 결과를 도출하는 인코딩 방식

 

012
chapter02-01,02 문제 풀기 및 채점 완료!

 

 외에도 교재에서는 UTF-8의 인코딩 방식 과정을 세세하게 다루었다. 그러나 방식을 암기하기 보다도 함께 살펴보면서 작동 원리를 이해하는데 집중하라는 책의 말을 떠올리며 마무리 문제 풀이 및 채점과 함께 2일차 chapter 02의 학습도 마무리!

 


 

7월 3일 수요일 - "chapter03: 명령어"를 학습하다!

대망의 1주차 마지막 챕터, '명령어'를 학습했다.

이번 챕터에서는 명령어(소스코드)의 종류(고급/저급), 컴파일러와 인터프리터, 실행파일과 목적파일 /

명령어의 구성(연산코드, 오퍼랜드) 그리고 주소 지정 방식과 stack, queue에 대해 살펴보았다.

간략히 개념을 정리해 보자!

 

[chap3-1]

1. 소스코드는 명령어의 집합(이건 chap2에서도 거듭 강조했다.)

2. 명령어의 종류로는 크게 고급언어(인간 이해)와 저급언어(컴퓨터 이해)로 나뉘며, 저급언어는 기계어(0과 1 비트로 표현)와 어셈블리어(기계어를 읽기 편하도록 표현)로 나뉜다.

3. 고급언어(사용자 입력)가 저급언어(컴퓨터 인식)로 변환되는 과정은 컴파일(코드 전체를 변환 후 실행) 방식과 인터프리터(한줄 단위로 코드 번환 후 실행) 방식으로 나뉜다. 컴파일 방식은 코드 중 오류가 하나라도 발견되면 실행이 불가하지만, 인터프리터는 오류 발견 전까지의 코드 실행이 가능하다.

+) 따라서 언뜻 보기엔 인터프리터 방식이 컴파일 방식보다 속도가 빨라 보이지만 컴파일 방식이 인터프리터 방식보다 속도가 빠르다.

4. 목적코드: 고급언어가 컴파일(변환)된 결과코드

5. 목적파일: 목적코드로 구성 != 실행파일: 실행코드로 구성

=> 목적파일에 없는 외부 기능이 코드 내에 요구되는 경우, 외부와 연결하는 작업(링킹)이 필요할 수 있기 때문에

=> 목적파일이라고 바로 실행되는 것은 아니기 때문에

 

[chap3-2]

1. 명령어는 연산코드('저장하라', '더하라')와 오퍼랜드(데이터값, 데이터가 있는 주소)로 구성.

2. 오퍼랜드: 명령어에 하나도 포함되지 않을 수 있으며 여러 개가 있을 수 있음, 주로 데이터값보다 데이터가 있는 주소를 많이 사용.(데이터가 저장된 위치)

=> 오퍼랜드의 길이 때문. 할당 길이가 제한적이기 때문에 데이터값을 그대로 쓰기엔 표현가지 수가 부족할 수 있음.

3. 연산코드: 수행할 연산(데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력)

4. 주소지정방식은 크게 (1)데이터값 그대로 사용과 (2)데이터 저장된 주소 사용에 따라 나뉠 수 있다.

(1)의 경우, 즉시 주소 지정 방식: 표현 가능한 데이터 수는 작지만 데이터 서치 시간이 작아 빠르다.

(2)의 경우, 저장위치가 메모리(cpu 외부)인지 레지스터(cpu 내부)인지에 따라 나뉜다.

<이때, 데이터가 저장된 주소를 유효주소라고 함>

(2)-1. 메모리인 경우,

- 직접 주소 지정 방식: 메모리에 필요한 데이터가 저장된 주소를 오퍼랜드 필드에 작성(유효주소 사용)

- 간접 주소 지정 방식: 메모리에 필요한 데이터가 저장된 주소를 가리키는 메모리의 주소를 오퍼랜드 필드에 작성(유효주소의 주소 사용)

(2)-2. 레지스터의 경우,

- 레지스터 주소 지정 방식(직접 지정과 비슷): 데이터가 저장된 레지스터의 주소를 오퍼랜드 필드에 작성(유효주소 사용)

- 레지스터 간접 주소 지정 방식(간접 지정과 비슷): 데이터가 저장된 메모리의 주소를 가르키는 레지스터의 주소를 오퍼랜드 필드에 작성, 메모리 접근 횟수가 감소하여 (2)-1의 간접 지정방식보다 빠름.(유효주소의 주소 사용)

(접근속도: cpu 내부가 cpu 외부보다 빠름)

 

(+) 추가 정리: stack과 queue

사실 이건 1-2, 2-1학기 전공에서 많이 쓴 개념이라 낯설지 않았고, 한번 더 정리하는 느낌으로 작성해 본다.

- Stack: 선입후출(FILO)이자 후입선출(LIFO)인 자료구조. 나는 팬케이크를 예시로 외웠다. 여러 장의 팬케이크를 구워 쌓을 땐 가장 마지막에 구운 게 위로가고, 먹으려고 하면 가장 위에 있는 것부터 먹는 모습이 stack을 연상시키기 좋다. 스택에 데이터를 입력할 땐 push, 제거할 땐 pop 사용.

- Queue: 선입선출(FIFO)이자 후입후출(LILO)인 자료구조. 나는 매표소에서 줄 서는 사람들을 예시로 외웠다.매표소에서 사람들이 줄을 서기 시작하면 맨 마지막에 온 사람이 줄의 끝에 있고, 표를 팔기 시작하면 가장 앞에 있는 사람(가장 먼저 온 사람)부터 표를 나눠주는 게 queue를 연상시키기 좋다.큐에 데이터를 입력할 땐 enqueue, 제거할 땐 dequeue 사용.

 

01
chapter03-01,02 문제 풀기 및 채점 완료!

 

Chapter03의 문제 풀기와 채점을 끝으로 이번 1주차 혼공컴운의 학습을 마무리한다!

이제 힘차게 시작했으니 꾸준히 나아갈 일만 남았다. 홧팅!!