# 컴퓨터 구조와 운영체제를 알아야 하는 이유 - 운영체제 개념

![](https://velog.velcdn.com/images/prettylee620/post/e525fab9-ce4d-46ef-a695-e547222b6e2e/image.png)

## 컴퓨터 구조를 알아야 하는 이유

> 개발자는 코드만 잘 짜면 되는 거 아닌가? 프로그래밍 문법을 공부해야 겠지..?

프로그래밍 언어 뿐 아니라 `컴퓨터의 근간[동작 = 구조, 운영체제]`을 알아야 한다.

### 🌻 컴퓨터의 근간을 알게 되면 좋은 점

> 🔗 https://www.youtube.com/watch?v=LBqJwmFMQHI\&t=2269s

#### 1. 문제 해결 능력

> 분명 코드를 제대로 작성했는데 왜 동작하지 않는 거지? **같은 코드인데도 동작하는 사람이 있다.**

내가 만든 프로그램이 어떻게 동작하는지를 알아야 한다. 컴퓨터를 미지의 대상이 아니라 분석의 대상으로 봐야 하는 능력을 길러야 한다.

즉, `컴퓨터의 내부 동작`을 들여다봐야 한다. 그러니까 내가 만든 코드가 **컴퓨터의 가장 밑단부터 어떻게 차근차근 실행되는 지**를 알 수 있어야 한다. 개발자들이 말하는 분석하는 능력을 길러야 한다는 의미가 여기서부터 시작된다고 볼 수 있다.

미지의 대상에서 `분석의 대상`으로 바라볼 수 있는 힘과 컴퓨터를 `관조할 수 있는` 능력을 늘려서 문제를 해결할 수 있는 개발자가 될 수 있다.

#### 2. 성능, 용량, 비용

> **개발에서 가장 중요한 이야기 중 하나**, 애플리케이션 개발 시 대규모 트래픽 처리라던지.. 빠른 처리라던지.. 등등과 같이 중요한 것이다.

클라우드 서비스를 이용하더라도 CPU, 메모리, 저장 용량을 직접 선택해야 한다. 그것에 따라 가격, 성능, 용량이 달라진다. 이러한 부분은 프로그래밍 언어의 기초 문법만으로는 해결하기 어려운 문제이다.

즉, `컴퓨터 구조`는 **결국 성능, 용량, 비용**에 대한 이야기

## 컴퓨터의 구조는 2가지로 나뉜다.

### 🌻 첫 번째, 컴퓨터가 이해하는 두 가지 `정보`

> 모든 프로그램은 컴퓨터가 이해하는 정보는 두 개이다.

#### 1. **데이터**

* 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
* 컴퓨터와 주고받는/내부에 저장된 정보를 데이터라 통칭하기도 한다.

#### 2. **명령어**

* _**컴퓨터는 결국 명령어를 처리하는 기계**_
* 컴퓨터를 실질적으로 움직이는 정보
* 데이터는 명령어를 위한 일종의 재료

> 명령어라는 건 1과 2를 더하라 ⇒ 1과 2를 데이터

![](https://velog.velcdn.com/images/prettylee620/post/311e9631-d8b6-4368-95df-4a42b5d2c9b9/image.png)

물론, 실제로 **CPU가 실행하는 명령어**는 0과 1로 이루어져있다. 컴퓨터는 0과 1만 이해할 수 있다.

* `기계어` : 명령어들의 집합
* `어셈블리어`

![](https://velog.velcdn.com/images/prettylee620/post/a95ebe18-a04a-4926-9f6d-37c626e64aa7/image.png)

컴퓨터가 이해하는 언어를 **사람이 읽기 쉽게 한 번 변환해준 것**이자 컴퓨터가 동작시키는 실질적인 정보인 명령어를 말한다.

### 🌻 두 번째, 컴퓨터의 네 가지 핵심 부품

![](https://velog.velcdn.com/images/prettylee620/post/b82be61e-94c8-4d9d-804b-d938f3ed0764/image.png)

#### 1. **CPU**

> 관리자 역할을하는 **운영체제의 `커널`이 프로그램을 메모리에 올려 프로세스로 만들면** 일꾼은 CPU가 처리

* 메모리에 있는 명령어를 가져와 읽어 들이고, 해석하고 실행하는 부품이다.
* `ALU(산술 논리 연산장치)` : 계산기, 계산을 위한 회로들의 모음
* `레지스터` : CPU 내부의 작은 임시기억저장장치, CPU는 자체적으로 저장할 방법이 없기 떄문에 레지스터를 거쳐 데이터 전달
* `제어장치` : 제어 신호를 내보내고, 명령어를 해석하는 장치, 데이터 처리를 위한 순서 결정

↔ 여기서 **제어 신호** : 컴퓨터들을 관리하고 작동시키기 위한 전자장치(메모리 읽기 신호, 메모리 쓰기 신호)

#### 💡 CPU 동작 구조

![](https://velog.velcdn.com/images/prettylee620/post/a4146844-def8-46c1-8154-f81d4d813057/image.png)

1. 메모리 1번지에 있는 명령어를 실행하고 싶다면, **제일 먼저 1번지에 있는 명령어를 CPU 내부로 읽어들인다.** 제어장치는 제어 신호로서 1번지 명령어를 읽어들이게 됨
2. 메모리 읽기라는 제어 신호를 받았다면\*\*, 1번지의 명령어를 CPU 내부의 작은 저장장치\*\*인 `레지스터`로 가져오게 된다.
3. 레지스터로 읽어들인 명령어를 제어장치는 명령어를 해석을 하게 됨
4. 3번지, 4번지 저장된 데이터를 읽어들이기 위해 다시 메모리 읽기 제어 신호를 쏨

![](https://velog.velcdn.com/images/prettylee620/post/07d9a306-158f-4c1e-bb60-b385dc008b1d/image.png)

5. 3번지와 4번지에 있는 데이터를 레지스터로 읽어들이기
6. ALU는 단순히 더하게 됨
7. 그 결과를 레지스터에 저장

![](https://velog.velcdn.com/images/prettylee620/post/8d2e8102-6def-4b66-b2c8-6c9a7fee6a08/image.png)

8. 2번지의 명령어를 실행하기 위해 메모리 읽기 제어 신호를 내보내고
9. 해석한 결과를 메모리 쓰기를 저장 = 메모리 쓰기

#### 💡 CPU 정리

* CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치
* CPU 내부에는 ALU, 레지스터, 제어장치가 있다.
  * ALU는 계산하는 장치
  * 레지스터는 임시 저장 자치
  * 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치

#### 💡 인터럽트

> 입터럽트란 어떤 신호가 들어왔을 때 \*\*CPU를 잠깐 `정지`\*\*시키는 것

키보드, 마우스 등 IO 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생하며, 발생 시 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 **인터럽트 핸들러 함수 실행**

> 그렇다면.. `인터럽트 핸들러 함수`란?

인터럽트가 발생했을 때, 이를 **핸들링하기 위한 함수.** 커널 내부의 IRQ를 통해 호출되며, `request_irq( )`를 통해 인터럽트 핸들러 함수 등록 가능

🥐 **하드웨어 인터럽트**

키보드를 연결한다거나 마우스를 연결하는 일 등의 IO 디바이스에 발생하는 인터럽트를 말한다.

🥐 **소프트웨어 인터럽트**

**트랩**이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동한다.

#### 2. **메모리\[주 기억장치 = RAM]**

> 어디에 저장되었는지.. 위치 정보도 필요하다 번지란 `위치 정보`

![](https://velog.velcdn.com/images/prettylee620/post/9ba2912e-221d-4d6f-9558-beb7e9bcc9bb/image.png)

* `현재 실행되는` 프로그램의 **명령어와 데이터를 저장**하는 부품
* 프로그램이 실행되려면 메모리에 저장되어 있어야 한다.
* 메모리에 저장된 값의 위치는 주소로 알 수 있다.

**🥕 RAM**

* (보조기억장치에 비해)비싸다
* 전원이 꺼지면 저장된 정보를 잃는다 = **휘발성 저장장치**

#### 3. **보조기억장치**

* RAM, SSD, USB Memory, CD Rom, 하드디스크, SD 카드
* 전원이 꺼져도 보관할 프로그램을 저장하는 부품으로 메인보드 외부에 존재
* (주 기억장치보다)용량도 더 크고 가격이 저렴

#### 4. **입출력장치**

* 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환 할 수 있는 부품

#### 💡 핵심부품들을 연결해주는 두 가지

![](https://velog.velcdn.com/images/prettylee620/post/caebdf9d-f889-40af-982b-1d5d8c9314e0/image.png)

1. **메인 보드**

* 메인보드에 연결된 부품들을 연결시킬 수 있는 판

2. **시스템 버스**

* 정보를 주고 받는 통로
* 컴퓨터의 핵심 부품을 연결하는 버스

> 즉, 메인보드에 연결된 부품은 `버스`를 통해 **정보를 주고 받으며**, `버스`는 컴퓨터의 부품끼리 \*\*정보를 주고받는 일종의 `통로`\*\*이며, 다양한 종류가 있다.

1. **시스템 버스의 내부 구성**

* 주소 버스 : 주소를 주고받는 통로
* 데이터 버스 : 명령어와 데이터를 주고받는 통로
* 제어 버스 : 제어 신호를 주고받는 통로
* 메모리 읽기

![](https://velog.velcdn.com/images/prettylee620/post/ddcbed75-baeb-4a32-b3ac-2774552f6e71/image.png)

### 🌻 DMA 컨트롤러

* DMA 컨트롤러는 **I/O 디바이스가 메모리에 직접 접근**할 수 있도록 하는 `하드웨어 장치`
* CPU에만 너무 많은 인터럽트 요청이 들어오기 떄문에 **CPU 부하를 막아주면 CPU 의 일을 부담하는 보조일꾼**

#### 메모리

* CPU는 일꾼 메모리는 작업장, 메모리의 크기가 곧 메모리의 크기

#### 타이머

* 특정 프로그램에 시간을 다는 역할

#### 디바이스컨트롤러

* 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU

## 운영체제

### 🌻 운영체제란?

> 리눅스, 윈도우, 안드로이드, IOS, macOs

#### (시스템) 자원

* 프로그램이 실행되기 위해 마땅히 필요한 요소
* 컴퓨터의 네 가지 핵심 부품 포함

#### 운영체제

> 운영체제 또한 특별하지만 프로그램이기 때문에 마찬가지로 메모리에 저장, 다만 특별하기에 커널 영역에서 실행

![](https://velog.velcdn.com/images/prettylee620/post/adc9e60e-8afd-4468-8796-b73f071c88f1/image.png)

* 자원을 관리하는 특별한 **프로그램**
* `실행 중인 프로그램`\[=프로세스]을 관리하는 특별한 **프로그램**

### 🌻 운영체제의 큰 그림\[역할]

#### 누가 사용자 영역에 프로그램을 적재하였을까?

> 예를 들어 내가 인터넷 브라우저에 들어가면 사용자 영역에 1500번지에 적재해주는데 누가 해주는 걸까?

A. 그게 바로 `운영체제`의 역할

#### 운영체제의 자원(메모리) 관리

1. 적재되는 위치 관리

![](https://velog.velcdn.com/images/prettylee620/post/2aec5abe-4d4f-4294-b1df-d8c03cb8fa28/image.png)

2. 실행하고자하는 프로그램, 즉 **프로세스에 크기에 비해 메모리의 물리적인 크기가 작아도 실행될 수 있다.** 이러한 기능을 제공해주는 것이 운영체제이다.

* 가능한 이유 : 페이징, 스와핑

즉, 한정된 메모리에 어떤 프로세스에 얼만큼 할당해야 하는지를 관리한다.

> Q. 어떤 프로세스를 먼저, 얼마나 오래 실행할까?

#### 운영체제의 자원(CPU) 관리(= CPU 스케줄링과 자원 관리)

메모리에 저장되어 있는 다양한 프로세스가 실행하려면 CPU가 있어야 한다\*\*. 실행되기 위해서는 CPU가 사용되어야 한다.\*\*

그렇다면… 어떤 프로세스를 어떤걸 먼저.. CPU를 쓰며,얼마나 오래 쓸지를 결정해주는 것이 바로 `운영체제`이다.

즉, CPU의 소유권을 **어떤 프로세스에게 할당할지, 프로세스의 생성과 삭제, 자원할당 반환 관리** 한다.

> Q. 이렇게 많은 프로그램들이 동시에 실행되는데, 누가 일목요연하게 실행을 관리해주지..?

#### 운영체제의 프로세스

여러 많은 프로그램들이 동시에 실행되도 문제 없게 정리해주는 이것 또한 운영체제가 해줌…

![](https://velog.velcdn.com/images/prettylee620/post/eaf3d481-d895-4db2-9c0f-43928043abcc/image.png)

> 개발자 입장에서 공부해야 하는 가장 큰 이유가 **운영체제가 프로세스를 어떻게 관리하는지를 알아야 함**

> 수 많은 프로세스들이 자원에 마구 직접 접근해도 괜찮을까?

프로세스가 제대로 실행되려면 자원(CPU, SSD 등)이 필요

A. 원래대로라면 NO! 자원을 보호할 수 있는 수단이 필요하다 이런 문지기 역할 하는 것이 운영체제

#### 문기지 역할(시스템 호출)을 통한 자원 보호

![](https://velog.velcdn.com/images/prettylee620/post/79b065ae-52dc-4bc3-8138-47efd918b5d2/image.png)

* 운영체제는 `시스템 호출 [= 시스템 콜]이라고 하는 것을 통해`자원 이용 시 자원 문지기 역할
* 사용자 프로세스는 결과적으로 운영체제를 통해 자원에 접근
* 자원 접근을 대행
* 하드웨어(= 자원)

#### 그 외

* 디스크 파일 관리 : 디스크 파일을 어떤 방법으로 보관해야 할지 관리
* I/O 디바이스 관리 : I/O 디바이스들인 마우스, 키보드 컴퓨터 간의 데이터를 주고 받는 것을 의미

### 🌻 운영체제와 응용프로그램, 하드웨어 간 관계

![](https://velog.velcdn.com/images/prettylee620/post/cdedf736-b0bc-49b5-be41-eb6868af6e87/image.png)

![](https://velog.velcdn.com/images/prettylee620/post/8572a6d2-52a5-44c4-86dc-ae0081cd6583/image.png)

* 운영체제 `자원(컴퓨터의 4가지 부품 + 실행에 필요한 요소들)`을 **어떻게 효율적으로 관리하고 보호받을 수 있는지**
* 실행하고자 하는 프로그램이 **어떻게 효율적으로 할당받아 실행할지**를 결정하는게 `운영체제`이다.
* 운영체제는 관리해야 하는 자원 별로 분리 하는 경우가 많다.

### 🌻 운영체제 구조\*\*(Operating System Structures)\*\*

**운영체제는 그 속에서 프로그램이 실행되는 환경을 제공해 준다.**

1. 운영체제가 제공하는 **서비스에 초점**을 맞추는 것이다.
2. 운영체제가 사용자와 **프로그래머에게 제공하는 인터페이스에 초점**을 맞추는 것이다.
3. **시스템의 구성요소와 그들의 상호 연결에 초점**을 맞추는 것이다.

> `리눅스`의 경우 **GUI**(단순 명령어 창이 아닌 아이콘을 **마우스로 클릭**하는 단순한 동작으로 컴퓨터와 상호작용)말고 **CUI**(**명령어**로 처리하는 인터페이스)만 있다.

![](https://velog.velcdn.com/images/prettylee620/post/3043b9b3-4ddb-40c3-85a8-6e82d80d10d7/image.png)

여기서 `드라이버`란 **하드웨어를 제어하기 위한 소프트웨어**이다.

### 운영체제 계층 구조

> 🔗 https://many258.github.io/study/os-base-concept/

![](https://velog.velcdn.com/images/prettylee620/post/8644d99c-23b9-4bd6-9113-e65de4ca359b/image.png)

#### 명령어 해석기(Shell)

* 사용자 명령을 입력받아 시스템 기능을 수행하는 명령 해석기
* 사용자와 시스템 간의 인터페이스를 담당

#### 제어 프로그램(Kernel)

* 하드웨어를 제어하는 프로그램으로 메모리. cpu, 단말기. 프린터 등 시스템의 자원 활용도를 높이기 위해 **스케줄링과 자료 관리를 하는 핵심 요소**

#### 기계어

* 0과 1로 표시되며 실행할 명령, 데이터, 기억 장소의 주소 등을 포함한다. **하드웨어를 직접 실행할 수 있는 형태로 구성**되며 컴퓨터의 모든 하드웨어를 제어하기 위한 다양한 비트 형식의 명령어가 존재

#### 마이크로프로그램

* ROM이나 PROM에 **영구히 기록되는 프로그램**을 말하는 것으로 보통 펌웨어를 의미

## 운영체제를 알아야 하는 이유

### 🌻 운영체제는 프로그램을 위한 프로그램이다.

운영체제는 **사용자를 위한 프로그램이 아니다.** 그저 컴퓨터를 이용하기만 할 때는 알지 몰라도 상관없다. 만들고 실행하는 프로그램에게 여러 기능을 주는 프로그램이 운영체제이다.

> 프로그램을 만드는 개발자는 운영체제를 알아야 한다. **어떻게 내가 만들고자 하는 프로그램이 도움을 받고 있는지 동작하는지를 이해 해야한다.**

### 🌻 문제 해결 능력 - 오류 메세지에 대한 깊은 이해

* 오류 메세지를 내보내는 근원적인 주체는 운영체제로 볼 수 있다. 그렇기 때문에 **내가 만들고자 하는 프로그램이 도움받고 있는 운영체제를 깊게 이해하면 오류 메세지에 대해 깊게 이해할 수 있다.**

> 운영체제는 즉, 그 속에서 _**프로그램이 실행할 수 있도록 하는 환경을 제공**_
