Skip to content

Commit

Permalink
Update 2024-10-25-os.md
Browse files Browse the repository at this point in the history
  • Loading branch information
yulmwu committed Nov 5, 2024
1 parent 1433622 commit ad03ce7
Showing 1 changed file with 52 additions and 3 deletions.
55 changes: 52 additions & 3 deletions _posts/fast/2024-10-25-os.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ tags: ["컴퓨터", "하드웨어", "CPU"]
5. [인터럽트](#2-1-5-인터럽트)
1. [동기 인터럽트](#2-1-5-1-동기-인터럽트)
2. [비동기 인터럽트](#2-1-5-2-비동기-인터럽트)
6. [코어](#2-1-6-코어)
6. [코어와 스레드](#2-1-6-코어와-스레드)
1. [코어](#2-1-6-1-코어)
2. [스레드](#2-1-6-2-스레드)
7. [병렬 처리](#2-1-7-병렬-처리)
8. [명령어 집합 구조](#2-1-8-명령어-집합-구조)
1. [CISC](#2-1-8-1-cisc)
Expand All @@ -63,7 +65,9 @@ tags: ["컴퓨터", "하드웨어", "CPU"]

> ### 이 글을 읽는 방법
>
> 기본적으로 이 글은 프로그래밍 경험 있는 독자, 컴퓨터 구조에 대해 아주 조금이라도 아는 독자들에게 추천합니다. 처음 등장하는 용어들에 대해선 최대한 각주 등으로 설명하나, 생략되어있을 수 있습니다.
> 기본적으로 이 글은 프로그래밍 경험 있는 독자, 컴퓨터 구조에 대해 아주 조금이라도 아는 독자들에게 추천합니다. 내용은 **기초** 레벨이며 프로그래밍을 위해선 이 내용 정도는 알아야한다고 생각하는 필자입니다.
>
> 처음 등장하는 용어들에 대해선 최대한 각주 등으로 설명하나, 생략되어있을 수 있습니다.
>
> 또한 목차 순서대로 가지 않아도 되고, 모르는 개념만 골라서 읽어도 좋습니다.
>
Expand Down Expand Up @@ -201,17 +205,23 @@ ASCII는 문자 하나당 **8비트**로 구성되는데, 표현 가능한 문

그렇기에 한글 문자를 하나하나 등록해둔 **완성형 인코딩 방식****조합형 인코딩 방식**으로 나눠지게 된다.

---

##### 완성형 인코딩 방식

말 그대로 문자 하나하나를 등록해두고, 이에 대한 코드 포인트를 부여한다. 당연히 ASCII에 비해 코드 포인트의 크기가 커질 것이고, 이는 조합형 인코딩 방식에서도 마찬가지다.

`'가'`, `'나'`, `'다'` ... `'힣'` 등의 거의 모든 글자를 등록한다.
여기서 '거의'라는 의미는 존재하지 않는 글자 또한 존재한다는 의미고, 이는 곧 완성형 인코딩의 단점이 된다.

---

##### 조합형 인코딩 방식

완성형과는 다르게 글자 하나를 조합하는 방식이며, 예를 들어 `` 이라는 글자가 있다면 `ㄱ + ㅏ + ㄴ`으로 조합된다.

---

##### EUC-KR

KS X 1001, KS X 1003 문자 집합 기반으로, 완성형 인코딩 방식인 **EUC-KR**이 등장한다.
Expand Down Expand Up @@ -694,6 +704,8 @@ CPU의 제어장치에서 하나의 명령어를 처리할 때 마다 각각의
4. 만약 인터럽트를 받아들일 수 있다면, 지금까지의 작업을 스택에 백업하고, **인터럽트 벡터**를 참조하여 **인터럽트 서비스 루틴**을 실행한다.
5. 인터럽트 서비스 루틴이 끝나면, 백업한 작업을 복구하고 다시 실행한다.

---

##### 인터럽트 요청 신호, 인터럽트 플래그

**인터럽트 요청 신호**는 이름 그대로 인터럽트를 요청하는 신호이다.
Expand All @@ -702,6 +714,8 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터

다만 일부 인터럽트(컴퓨터 강제 종료 등)는 인터럽트 플래그를 무시하고 실행될 수 있다. 이 처럼 막을 수 없는 인터럽트는 non-maskable interrupt라고 부르기도 한다.

---

##### 인터럽트 서비스 루틴, 인터럽트 벡터

**인터럽트 서비스 루틴**은 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리해야 될지 정의한 코드이다.
Expand All @@ -721,7 +735,40 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터

처리가 완료되면 다시 원래 주소로 돌아와 복구한 다음 명령어를 계속 이어나간다.

### 2-1-6. 코어
### 2-1-6. 코어와 스레드

이 파트부터 아래의 명령어 집합 구조까지 CPU의 속도/성능과 관련한 내용이며, 이 파트를 끝으로 CPU에 대한 내용은 끝난다.

먼저 원초적으로 돌아가서, 일종의 하드웨어 관점에서 생각해보자. CPU는 일정한 주기를 이뤄 움직이는데, 이 일정한 주기를 주는 부품이 크리스탈(Crystal)이라는 오실레이터(Oscillator) 부품이다. 전기/전자 공학은 설명하지 않으니 간략하게 설명한다면 일정한 주기의 주파수(전기 신호)를 발생시키는 부품이다.

이 부품을 바탕으로 움직이는 일정한 주기를 **클럭(Clock)**이라 한다.[^clock1] 그럼 당연히 이 클럭 속도가 빠르면 CPU 속도 또한 빨라질것이다.

하지만 전기의 특성 중 하나로, 열손실이 발생한다는 문제가 존재한다. 이는 CPU가 매우 뜨거워진다는 의미인데, 이를 식히기 위해 별도의 장치가 필요하게 된다.

그래서 CPU 클럭 속도를 무지성으로 늘릴 순 없으며, 다른 방법을 통해 성능을 향상시켜야 한다.

#### 2-1-6-1. 코어

다시 원초적으로 돌아가서, 속도를 늘리려면 클럭 속도를 제외하고 어떤 방법이 있을까?
바로 단순하게 CPU의 부품(ALU, 제어장치, 레지스터, 캐시 등)을 여러개로 늘리면 된다.
이러한 CPU의 주요 구성 부품이 담긴 유닛을 **코어(Core)**라고 한다.

코어가 하나일 경우 단일코어, 여러개의 경우 멀티코어라 부른다. 하지만 코어만 마냥 늘린다고 속도가 꼭 빨라지는것은 아니다.

예를 들어, 어떠한 명령어를 처리하는데 코어가 1개만 있어도 충분하게 처리할 수 있으나 여러개인 경우 그 외의 코어가 필요하지 않게된다.

#### 2-1-6-1. 스레드

**스레드(Thread)**는 어떠한 프로세스[^thread1]이나 코어 등에서 실행되는 흐름의 단위이다.
스레드는 **하드웨어적 스레드****소프트웨어적 스레드**로 구분된다.

---

##### 하드웨어적 스레드

---

##### 소프트웨어적 스레드

### 2-1-7. 병렬 처리

Expand Down Expand Up @@ -757,3 +804,5 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터
[^ip1]: 다만 인터프리트 과정에서 추가적인 메모리 소비(오버헤드)가 발생하기 때문에 이 점을 고려해야 한다.
[^cs1]: 추후 설명할 예정이지만, "메모리"라 칭하는건 대부분 주기억장치(RAM)을 의미한다.
[^regi1]: 여기서 말한 "메모리"는 주기억장치(RAM)을 의미한다.
[^clock1]: 단위는 Hz(헤르츠)를 사용하며, 1초에 몇번 반복되는가 나타낸다. 현재 존재하는 CPU의 경우 GHz 단위가 대부분이며, 3GHz의 경우 1초에 클럭 신호가 30억번을 반복된다는 의미이다.
[^thread1]: 프로그램과 프로세스는 다른 개념이다. 프로그램은 어떠한 명령어들의 집합을 의미하고, 프로세스는 그 프로그램이 실행되고 있는 상태의 프로그램을 의미한다.

0 comments on commit ad03ce7

Please sign in to comment.