From ad03ce7dbf9b86336d73b16af7882f717b95fcab Mon Sep 17 00:00:00 2001 From: ky0422 Date: Tue, 5 Nov 2024 10:06:20 +0900 Subject: [PATCH] Update 2024-10-25-os.md --- _posts/fast/2024-10-25-os.md | 55 ++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/_posts/fast/2024-10-25-os.md b/_posts/fast/2024-10-25-os.md index 7be3792..1525867 100644 --- a/_posts/fast/2024-10-25-os.md +++ b/_posts/fast/2024-10-25-os.md @@ -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) @@ -63,7 +65,9 @@ tags: ["컴퓨터", "하드웨어", "CPU"] > ### 이 글을 읽는 방법 > -> 기본적으로 이 글은 프로그래밍 경험 있는 독자, 컴퓨터 구조에 대해 아주 조금이라도 아는 독자들에게 추천합니다. 처음 등장하는 용어들에 대해선 최대한 각주 등으로 설명하나, 생략되어있을 수 있습니다. +> 기본적으로 이 글은 프로그래밍 경험 있는 독자, 컴퓨터 구조에 대해 아주 조금이라도 아는 독자들에게 추천합니다. 내용은 **기초** 레벨이며 프로그래밍을 위해선 이 내용 정도는 알아야한다고 생각하는 필자입니다. +> +> 처음 등장하는 용어들에 대해선 최대한 각주 등으로 설명하나, 생략되어있을 수 있습니다. > > 또한 목차 순서대로 가지 않아도 되고, 모르는 개념만 골라서 읽어도 좋습니다. > @@ -201,6 +205,8 @@ ASCII는 문자 하나당 **8비트**로 구성되는데, 표현 가능한 문 그렇기에 한글 문자를 하나하나 등록해둔 **완성형 인코딩 방식**과 **조합형 인코딩 방식**으로 나눠지게 된다. +--- + ##### 완성형 인코딩 방식 말 그대로 문자 하나하나를 등록해두고, 이에 대한 코드 포인트를 부여한다. 당연히 ASCII에 비해 코드 포인트의 크기가 커질 것이고, 이는 조합형 인코딩 방식에서도 마찬가지다. @@ -208,10 +214,14 @@ ASCII는 문자 하나당 **8비트**로 구성되는데, 표현 가능한 문 `'가'`, `'나'`, `'다'` ... `'힣'` 등의 거의 모든 글자를 등록한다. 여기서 '거의'라는 의미는 존재하지 않는 글자 또한 존재한다는 의미고, 이는 곧 완성형 인코딩의 단점이 된다. +--- + ##### 조합형 인코딩 방식 완성형과는 다르게 글자 하나를 조합하는 방식이며, 예를 들어 `간` 이라는 글자가 있다면 `ㄱ + ㅏ + ㄴ`으로 조합된다. +--- + ##### EUC-KR KS X 1001, KS X 1003 문자 집합 기반으로, 완성형 인코딩 방식인 **EUC-KR**이 등장한다. @@ -694,6 +704,8 @@ CPU의 제어장치에서 하나의 명령어를 처리할 때 마다 각각의 4. 만약 인터럽트를 받아들일 수 있다면, 지금까지의 작업을 스택에 백업하고, **인터럽트 벡터**를 참조하여 **인터럽트 서비스 루틴**을 실행한다. 5. 인터럽트 서비스 루틴이 끝나면, 백업한 작업을 복구하고 다시 실행한다. +--- + ##### 인터럽트 요청 신호, 인터럽트 플래그 **인터럽트 요청 신호**는 이름 그대로 인터럽트를 요청하는 신호이다. @@ -702,6 +714,8 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터 다만 일부 인터럽트(컴퓨터 강제 종료 등)는 인터럽트 플래그를 무시하고 실행될 수 있다. 이 처럼 막을 수 없는 인터럽트는 non-maskable interrupt라고 부르기도 한다. +--- + ##### 인터럽트 서비스 루틴, 인터럽트 벡터 **인터럽트 서비스 루틴**은 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리해야 될지 정의한 코드이다. @@ -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. 병렬 처리 @@ -757,3 +804,5 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터 [^ip1]: 다만 인터프리트 과정에서 추가적인 메모리 소비(오버헤드)가 발생하기 때문에 이 점을 고려해야 한다. [^cs1]: 추후 설명할 예정이지만, "메모리"라 칭하는건 대부분 주기억장치(RAM)을 의미한다. [^regi1]: 여기서 말한 "메모리"는 주기억장치(RAM)을 의미한다. +[^clock1]: 단위는 Hz(헤르츠)를 사용하며, 1초에 몇번 반복되는가 나타낸다. 현재 존재하는 CPU의 경우 GHz 단위가 대부분이며, 3GHz의 경우 1초에 클럭 신호가 30억번을 반복된다는 의미이다. +[^thread1]: 프로그램과 프로세스는 다른 개념이다. 프로그램은 어떠한 명령어들의 집합을 의미하고, 프로세스는 그 프로그램이 실행되고 있는 상태의 프로그램을 의미한다.