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 1, 2024
1 parent aa52c1a commit bf9f36a
Showing 1 changed file with 35 additions and 3 deletions.
38 changes: 35 additions & 3 deletions _posts/fast/2024-10-25-os.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ EUC-KR은 약 2000개 이상의 한글을 표현할 수 있으나, 그럼에도
> 메모리에 적재된 데이터엔 모두 주소가 할당되어있고, 이 주소를 통해 메모리에 적재된 데이터에 접근하게 된다.
>
> 이 주소라는 개념때문에 미리 설명을 하였고, 이제부터 "주소에 접근한다" 라는 문장은 **메모리에 저장된 데이터 또는 명령어를 가져오기 위해 주소를 사용하여 가져온다(접근한다)** 라는 의미가 된다.[$mem4]
>
> 추가적으로 **레지스터**는 추후 설명하겠지만 **CPU 내부의 임시적으로 데이터를 저장 할 빠른 메모리**라고 생각하면 된다. CPU가 메모리에 접근하는 속도보다 CPU 내부의 레지스터에 접근하는것이 더욱 빠르기 때문에, 연산 등에선 레지스터를 사용하게 된다.
{: .prompt-info }

> 목차 상 명령어를 먼저 설명하나, 원활한 이해를 위해 후반의 [컴퓨터 구조](#2-컴퓨터-구조)([메모리](#2-2-메모리주기억장치), [레지스터](#2-1-3-레지스터) 등)를 먼저 보고 오거나, 오고가며 병행하는 것도 좋은 선택이다.
Expand Down Expand Up @@ -287,8 +289,7 @@ opcode엔 다양한 역할의 opcode가 존재하는데, 크게 아래와 같은

#### 1-3-1-2. operand

**operand**(피연산자)엔 데이터가 직접 들어가거나 주소(또는 레지스터)가 들어간다. 주소에 대해선 추후 '[메모리](#2-2-메모리주기억장치)' 절에서 자세히 설명하겠지만(미리 보고와도 좋다), 간단하게 설명하면 메모리엔 데이터(프로그램 명령어 또한 메모리에 저장된다)가 저장되는 공간엔 '주소'가 부여 된다.

**operand**(피연산자)엔 데이터가 직접 들어가거나 주소(또는 레지스터)가 들어간다.
즉, 해당 주소에 접근한다는건 해당 주소 공간에 있는 데이터에 접근한다는 의미이다.

여기서 몇개의 주소를 넣을것인가에 따라 **n주소 명령어**라고 한다. 만약 PUSH와 같이 operand가 없는 경우 0주소 명령이라고 한다.
Expand Down Expand Up @@ -319,7 +320,6 @@ opcode엔 다양한 역할의 opcode가 존재하는데, 크게 아래와 같은
- **간접 주소 지정(Indirect Addressing)**
- 직접 주소 지정 방식의 단점 중 하나인 유효 주소의 크기가 24비트로 제한된다는 점을 보완하기 위함이며, 데이터가 저장된 유효 주소가 다른 주소에 저장이 되어있고, 이 다른 주소를 명시함으로써 단점을 보완한다. 하지만 메모리 접근을 2번 이상 접근해야된다는 단점이 있다.
- **레지스터 주소 지정(Register Addressing)**

- 직접 주소 지정과 방식은 같으나, 메모리 접근이 아닌 레지스터 접근을 통해 데이터를 접근하는 방식이다. 레지스터에 대해선 추후 설명할 예정이나, 미리 보고와도 좋다.

레지스터에 접근하는것이 메모리에 접근하는 것 보다 빠르므로 직접 주소 지정 방식보다 빠르다.
Expand Down Expand Up @@ -468,10 +468,42 @@ print(a + b)

## 2-1. CPU

**CPU**는 Central Processing Unit의 약자로, 직역하면 중앙 처리 장치이라 부른다.
이름 그대로 컴퓨터에서 가장 중요한 핵심 부품이며, 이 장치에서 **데이터의 연산/처리**, **제어** 등을 하게 된다.

CPU의 구조는 크게 아래와 같이 구분된다.

* **산술 논리 연산 장치**(ALU, Arithmetic and Logical Unit)
* **제어장치**(Control Unit)
* **레지스터**(Register)
* **캐시 메모리**(Cache Memory)

### 2-1-1. ALU

**ALU**는 이름 그대로 연산 장치로, 덧셈, 뺄셈, 곱셈부터 논리 연산, 시프트 연산 등의 컴퓨터가 데이터를 연산할 때 필요한 연산 장치이다.
사실 큰 그림만 본다면 위 설명으로 끝낼 수 있다. 더욱 간단히 말하자면 계산기에 비유할 수 있다.

ALU는 아래와 같은 입력과 출력을 가진다.

* 입력
* 제어장치로 부터 -> 제어신호
* 레지스터로 부터 -> 피연산자(연산할 데이터)
* 출력
* 결과값 -> 레지스터
* 플래그 -> 플래그 레지스터

ALU의 입력엔 단순히 "계산을 하기 위한 필요한 정보"가 입력된다.
우리가 연산을 할 때 "OO과 OO을 더해라" 라고 생각하는 것 처럼, 입력에도 레지스터로 부터 연산할 데이터(피연산자)와 제어장치로 부터 어떤 연산을 할 지 수행할 연산을 입력받는다.

그리고 출력으론 결과값을 레지스터로 내보낸다. 그리고 결과값이 담긴 레지스터를 메모리에 저장하거나, 다시 연산등을 하게 된다.

그 다음으론 **플래그(Flag)**라는 용어가 등장한다. 이는 연산한 결과에 대한 부가적인 정보가 담긴다. 예를 들어, 연산 결과가 0이라면 Zero 플래그가 1이 될것이고, 앞서 설명했다 싶이 음수가 되면 부호 플래그가 1이 될것이다.
또한 연산 결과가 제한된 크기를 넘을 때 발생하는 오버로드 플래그 등도 여기에 저장되며, 이러한 플래그가 저장되는 레지스터를 **플래그 레지스터**라고 한다.

### 2-1-2. 제어장치

**제어장치**는 제어신호를 발생시키거나 받아서 제어하고, 명령어를 해석하는 장치이다.

### 2-1-3. 레지스터

### 2-1-4. 명령어 사이클
Expand Down

0 comments on commit bf9f36a

Please sign in to comment.