diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json new file mode 100644 index 0000000..700ff41 --- /dev/null +++ b/.obsidian/workspace.json @@ -0,0 +1,169 @@ +{ + "main": { + "id": "634aaf0496b492c8", + "type": "split", + "children": [ + { + "id": "25a4c94f5622f304", + "type": "tabs", + "children": [ + { + "id": "21fcf842d395c9fd", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "OS/OS 개론(1).md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "OS 개론(1)" + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "01c3c39e1b081319", + "type": "split", + "children": [ + { + "id": "453d809014ecf4e2", + "type": "tabs", + "children": [ + { + "id": "7c379b6d44b27816", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + }, + "icon": "lucide-folder-closed", + "title": "파일 탐색기" + } + }, + { + "id": "065a8f22f598d999", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + }, + "icon": "lucide-search", + "title": "검색" + } + }, + { + "id": "4be260accb36353c", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {}, + "icon": "lucide-bookmark", + "title": "Bookmarks" + } + } + ] + } + ], + "direction": "horizontal", + "width": 220.5 + }, + "right": { + "id": "ca0d6dc7d3cb4600", + "type": "split", + "children": [ + { + "id": "b359ea281cfb8844", + "type": "tabs", + "children": [ + { + "id": "bfbd089905bf8b5e", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "OS/OS 개론(1).md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-coming-in", + "title": "OS 개론(1)의 백링크" + } + }, + { + "id": "2b8977e99d61b97c", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "OS/OS 개론(1).md", + "linksCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-going-out", + "title": "OS 개론(1)의 나가는 링크" + } + }, + { + "id": "487df3e4c5bbf217", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + }, + "icon": "lucide-tags", + "title": "Tags" + } + }, + { + "id": "8bb1c149a146fbb0", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "OS/OS 개론(1).md" + }, + "icon": "lucide-list", + "title": "OS 개론(1) 개요" + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:퀵 스위처 열기": false, + "graph:그래프 뷰 열기": false, + "canvas:새 캔버스 만들기": false, + "daily-notes:오늘의 데일리 노트 열기": false, + "templates:템플릿 삽입": false, + "command-palette:명령어 팔레트 열기": false + } + }, + "active": "21fcf842d395c9fd", + "lastOpenFiles": [ + "OS/OS 개론(1).md" + ] +} \ No newline at end of file diff --git "a/OS/OS \352\260\234\353\241\240(1).md" "b/OS/OS \352\260\234\353\241\240(1).md" new file mode 100644 index 0000000..7aec6b6 --- /dev/null +++ "b/OS/OS \352\260\234\353\241\240(1).md" @@ -0,0 +1,161 @@ +#OS + +>operating system concepts 10th 1장을 토대로 정리하였습니다. + +# 1️⃣ Introduction + +OS를 배우기 전 기초 지식으로 알아두면 좋을 컴퓨터 하드웨어 구성과 프로그램의 실행 과정을 먼저 정리해보겠습니다. + +## 1. 컴퓨터 하드웨어의 기본 구성 + +### 1.1 CPU (Central Processing Unit) + +- **구성 요소** + - **ALU(Arithmetic Logic Unit)** : 산술 연산(덧셈, 뺄셈 등)과 논리 연산(AND, OR, XOR 등)을 담당하는 장치 + - **컨트롤 유닛(Control Unit)** : 메모리에 있는 명령어를 fetch하여 decoding하고, ALU나 기타 부품이 해당 명령을 올바르게 실행하도록 제어하는 장치 + - **레지스터(Register)** : CPU 내부에 있는 매우 빠른 임시 저장공간. 흔히 프로그램 카운터(PC)나 산술 연산을 임시로 저장하는 레지스터들이 존재 + +- **역할** + - 메모리에 저장된 기계어를 **fetch**하고, + - 인출한 명령어를 **decode**하여 어떤 연산을 해야 하는지 결정하고, + - **execute**을 통해 실제 연산(ALU 동작 및 레지스터 조작)을 수행함 + +- **특징** + - CPU가 이해하는 것은 **오직 기계어**임 + - 따라서 고급 언어(ex. C, Java 등)로 작성된 프로그램을 기계어로 컴파일하거나, 인터프리트 해주는 과정이 반드시 필요 + +### 1.2 메모리(Memory) + +- **주기억 장치(Main Memory)** : 프로그램이 실행될 때, CPU가 바로 접근하여 코드와 데이터를 임시로 저장하는 공간 +- 보통 RAM을 의미하며, **전원이 꺼지면 휘발**되는 특성을 가짐 -> 휘발성 메모리 + +### 1.3 입출력 장치(I/O Device) + +- **입력(Input) 장치** : 키보드, 마우스, 터치스크린, 마이크 등 +- **출력(Output) 장치** : 모니터, 프린터, 스피커 등 +- CPU와 메모리가 직접 I/O 장치들과 상호 작용하지 않고, I/O 컨트롤러나 bus를 통해 데이터를 주고받음 + +>❓ **버스?** + 현대의 일반적인 컴퓨터 시스템은 여러개의 CPU와 장치 컨트롤러(Device controllers)로 구성되어 있음 + 이들은 공통버스로 이어져 메모리를 공유함 + +```text + disks mouse, keyborad, printer monitor + | | | ++-----+ +--------+--------+ +--------+-------+ +---------+--------+ +| CPU | | disk controller | | USB controller | | graphics adapter | ++--+--+ +--------+--------+ +--------+-------+ +---------+--------+ + | | | | + +-------------+---------+---------+-------------------+ + | + +---+----+ + | memory | + +--------+ +``` + + +## 2. 프로그램 실행 과정 + +### 2.1 고급 언어에서 기계어로 + +1. **소스 코드 작성**(ex. C, C++, Java 등) +2. **컴파일(또는 인터프리트) 과정**을 거쳐 **기계어**로 변환 +3. 변환된 기계어는 **메모리에 로드**되어 실행 + +### 2.2 CPU의 명령어 실행 사이클 + +1. **Fetch** : 메모리에서 현재 PC(Program Counter)가 가리키는 명령어를 가져옴 +2. **Decode** : 가져온 명령어를 해독하여 어떤 연산을 해야 하는지 파악 +3. **Execute** : ALU와 레지스터 등을 활용하여 명령어가 요구하는 연산 수행 +4. **Store/Write Back** : 실행 결과가 필요하다면 레지스터나 메모리에 저장 +5. 다음 명령어로 이동(PC를 갱신)하고, 다시 fetch 과정을 반복 + +==이러한 **인출-해독-실행** 사이클에 따라 명령어를 순차적으로 처리하는 구조를 **폰 노이만(von Neumann) 아키텍처**라고 합니다.== + +# 2️⃣ What operating systems do + +운영체제 하드웨어와 응용프로그램 사이에 존재하는 프로그램을 말합니다. +컴퓨터의 하드웨어를 관리하고, 하드웨어와 소프트웨어, 사용자를 매개하는 프로그램을 뜻하죠. + +그렇기에 운영체제를 다른 말로는 **resource manager**(자원관리자) 라고 부릅니다. + +예전에는 운영체제(OS)를 커널(Kernel)이라고도 불렀습니다. + +>❓**커널(Kernel)** + 커널은 운영체제의 핵심 + 운영체제는 커널과 커널 모듈(Kernel module)들로 구성되는데, 커널이 운영체제의 핵심이다보니 일반적으로 운영체제와 커널은 동일시 됨. 커널이 같다면 같은 운영체제로 취급 + +운영체제의 역할은 사용자 관점(User View)과 시스템 관점(System View)으로 나눠볼 수 있습니다. + +## 1. 운영체제의 역할 +### 1.1 User View + +일반적으로 사용자는 컴퓨터를 사용할때 단순히 키보드와 마우스를 이용해 조작합니다. +사용자가 단순히 기계만 조작함으로서 컴퓨터를 사용할 수 있는 이유는 운영체제가 있기 때문입니다. + +운영체제는 사용자가 컴퓨터 자원 사용(Resource utilization)을 신경쓰지 않게 도우며, 사용자가 컴퓨터를 쉽게 이용할 수 있도록 만들어 줍니다. + +또 다른 경우를 살펴보면, 사용자는 메인프레임(Mainframe)에 연결된 터미널을 사용하거나 미니컴퓨터(Minicomputer)를 사용이 할 수 있습니다. 이 상황에서 컴퓨터의 자원을 여러 사용자가 나눠쓰게 되는데, 운영체제는 사용자들이 자원을 공평하게 사용할 수 있도록 도와줍니다. + +### 1.2 System View + +시스템에게 운영체제는 **자원 할당자**(Resource allocator)입니다. +컴퓨터 시스템은 CPU 시간, 메모리 공간, 파일 저장소 공간, 입출력 장치 등 다양한 문제를 해결해야 하는데요. +운영체제는 이러한 컴퓨터 자원들을 관리하는 **제어 프로그램**으로서 동작하게 됩니다. + +### 1.3 운영체제의 역할은? + +위 두 관점을 종합해 보면, 운영체제(OS)가 사용자에게는 **편리한 인터페이스**로서 동작하고, 시스템에게는 **자원을 효율적으로 관리**하는 관리자(할당자)로 동작한다는 점을 이해할 수 있습니다. + +이로부터 얻을 수 있는 중요한 **이해/시사점**은 다음과 같습니다. + +- **운영체제의 이중 역할** + - ‘사용자’ 측면에서의 편의성과 + - ‘시스템’ 측면에서의 자원 할당・관리 + + 이 두 가지 역할을 균형 있게 수행하는 것이 운영체제의 핵심 기능임 + +- **추상화와 보호** + OS는 하드웨어 자원에 대한 접근을 추상화해 주어, 사용자가 하드웨어 동작을 직접 다룰 필요 없도록 도움 + 동시에 여러 사용자가 자원을 안전하게 나누어 쓰도록 보호와 관리 메커니즘을 제공함 + +- **다중 사용자 환경** + 여러 사용자가 동시에 시스템에 접근하고 프로그램을 실행하는 환경에서는 운영체제가 공정한 자원 사용 보장, 사용자 간의 간섭(충돌) 방지, 보안, 오류 처리 등을 신경 써야 함 + + +==정리하자면, **운영체제는 사용자에게는 편리함을, 시스템 입장에서는 효율과 안전성을 제공**하는 소프트웨어라는 점을 알 수 있습니다.== + +## 2. Computer Startup + +그렇다면 컴퓨터는 어떻게 시작되고 이때의 운영체제는 어떤 역할을 하는지 알아봅시다. + +컴퓨터가 시작되는 과정(booting)은 다음과 같습니다. + +컴퓨터를 켜면 **부트스트랩 프로그램**(Bootstrap program)이라는 초기화 프로그램이 실행됩니다. +이 프로그램을 컴퓨터의 **ROM(Read-Only Memory)** 이나 EEPROM(Electrically Erasable Programmable Read-Only Memory)에 저장되어 있으며, 주로 펌웨어(Firmware)라고 불립니다. + +Bootstrap program은 시스템을 초기화하고, **부트로더**(Boot loader)를 실행합니다. + + 멀티부팅 컴퓨터도 존재하는데, 이 경우 부트로더가 여러 운영체제를 가리키고 있기에 어떤 운영체제를 실행할지 선택해야 합니다. + +그리고 Boot loader는 최종적으로 운영체제를 실행하게 됩니다. + +>❓**booting을 하는 이유?** + 컴퓨터의 메모리는 비휘발성 메모리(ROM)이라서 종료 했다가 다시 실행하면 초기화 됨 + 그렇기에 컴퓨터를 작동하기 위해서 운영체제를 읽어들여야 하는데 이를 위해 booting을 진행 + +커널이 load, 실행되면 **시스템과 사용자에게 서비스를 제공**해야 하는데요. +이때 일부 서비스는 커널 외부에서 제공되는데, 이들은 부팅할 때 메모리에 로드되는 시스템 프로세스(System processes)나 시스템 데몬(System daemons)을 말합니다. + +>❓**데몬?** + 데몬(Daemon)은 전형적으로 **백그라운드**(background)에서 실행되면서, 특정 서비스나 기능을 지속적으로 제공하거나 모니터링하는 역할을 하는 **프로세스**를 말함 + 일반적으로 사용자가 직접 실행하거나 인터랙션하는 애플리케이션과 달리, 데몬은 부팅 시점 혹은 필요에 따라 자동으로 시작되어 시스템 이벤트나 요청을 감시하고 처리함 + +UNIX의 경우 첫 시스템 프로세스는 **init**이며, 이 프로세스는 또 다른 데몬들을 실행시킵니다. +데몬은 프로세스로 백그라운드에서 돌면서 시스템 로그는 남기는 등의 여러 작업을 진행합니다. + +이러한 과정이 끝나면 시스템이 완전히 booting되고, 이벤트가 발생하기를 기다리게 됩니다. + +# 🔗 참고 +operating system concepts 10th +https://parksb.github.io/article/5.html \ No newline at end of file