|
| 1 | +# 운영 체제(Operating System)란? |
| 2 | +운영 체제(OS, Operating System)는 컴퓨터 시스템의 자원들(하드웨어_CPU, RAM, 저장장치, 네트워크 등)을 효율적으로 관리하며, 이를 통해 다른 응용 프로그램들이 자원을 효과적으로 사용할 수 있게 해준다. 운영체제 또한 소프트웨어이며, 소프트웨어의 목적인 사용자와 하드웨어 사이에 인터페이스를 제공해 사용자가 쉽게 컴퓨터를 다룰 수 있게 해준다. |
| 3 | + |
| 4 | +즉, 운영체제란 **사용자와 응용프로그램이 편리하고 효과적으로 컴퓨터 시스템의 자원을 사용할 수 있도록 환경을 제공해주는 시스템 소프트웨어이다.** |
| 5 | + |
| 6 | +# 커널 |
| 7 | + |
| 8 | +운영체제의 코어(핵심) 부분을 **커널(Kernel)**이라고 하는데, 일반적으로는 커널에 여러가지 기능(라이브러리, 시스템 프로그램 등)을 포함한 전체 상태를 운영체제라고 한다. |
| 9 | + |
| 10 | +**커널은 하드웨어 자원을 관리하고, 앱에게 추상화된 인터페이스를 제공하는 관리자이다. (프로세스/메모리/IO/네트워크/드라이버 관리 수행)** |
| 11 | + |
| 12 | +## 유저 모드 / 커널 모드 |
| 13 | + |
| 14 | +운영체제는 앱(응용프로그램, 이후부터 앱으로 통일.)이 컴퓨터를 쓰게 해주되, 망치지는 못하게 막아야 한다. 이를 위해서 권한을 나누었는데 이를 유저 모드와 커널 모드로 나누었다. |
| 15 | + |
| 16 | +- **유저 모드(User mode)**: 제한된 권한 (안전) |
| 17 | +- **커널 모드(Kernel mode)**: 모든 권한 (위험하지만 필요) |
| 18 | + |
| 19 | +### 유저 모드(User Mode) |
| 20 | + |
| 21 | +앱이 제한된 권한으로 실행되는 CPU 실행 모드이다. |
| 22 | + |
| 23 | +즉, 앱은 OS가 허용한 범위 안에서만 작동할 수 있으며 이로인해 시스템 전체가 망가지지 않게 된다. |
| 24 | + |
| 25 | +- 하드웨어에 직접 접근 ❌ |
| 26 | +- 다른 앱 메모리 접근 ❌ |
| 27 | +- 커널 메모리 접근 ❌ |
| 28 | +- 위험한 명령 실행 ❌ |
| 29 | + |
| 30 | +이 행동들을 할 수 있다면 보안이나 안정성이 박살날 것이다. |
| 31 | + |
| 32 | +그러나 앱을 이용해보면 파일 저장, 네트워크, 카메라, 마이크 등을 사용하는 것을 알 수 있다. |
| 33 | + |
| 34 | +이 때 **시스템 콜(System Call)** 을 통해 커널에게 요청하게 된다. |
| 35 | + |
| 36 | +즉, 흐름을 보면 |
| 37 | + |
| 38 | +1. 앱이 시스템 콜을 호출 |
| 39 | +2. CPU가 “유저 모드 → 커널 모드”로 전환 |
| 40 | +3. 커널이 실제 작업 수행 |
| 41 | +4. 다시 “커널 모드 → 유저 모드”로 복귀 |
| 42 | +5. 앱이 결과를 받음 |
| 43 | + |
| 44 | +시스템 콜에 대해서는 이 후에 더 자세하게 다루겠다. |
| 45 | + |
| 46 | +그렇다면 다른 앱 메모리 접근은 어떻게 막을까? |
| 47 | + |
| 48 | +이 때 가상 메모리(Virtual Memory)를 사용하게 된다. 짧게 각 앱은 자신만의 주소 공간(가상 메모리)를 갖게 되어 다른 앱의 주소공간에 접근하지 못하게 된다. |
| 49 | + |
| 50 | +이 부분도 이 후에 더 자세하게 다루겠다. |
| 51 | + |
| 52 | +### 커널 모드(Kernel Mode) |
| 53 | + |
| 54 | +커널이 실행되는 모드로 모든 권한을 갖는다. 그렇기 때문에 커널에서 버그가 난다면 OS 전체가 죽게된다. |
| 55 | + |
| 56 | +- CPU/메모리/디스크/네트워크 등 모든 자원 접근 가능 ✅ |
| 57 | +- 하드웨어 I/O 수행 가능 ✅ |
| 58 | +- 모든 프로세스 관리 가능 ✅ |
| 59 | + |
| 60 | +위에서 얘기 했듯, 앱은 유저 모드에서 실행되지만 파일 읽기, 네트워크 통신 같은 기능을 위해 커널에 요청하는 방법으로 시스템 콜(System Call)이 있다. |
| 61 | + |
| 62 | +**예시** |
| 63 | + |
| 64 | +- `open()`, `read()`, `write()` (파일 I/O) |
| 65 | +- `socket()`, `send()`, `recv()` (네트워크) |
| 66 | +- 프로세스 관련 호출 |
| 67 | + |
| 68 | +<aside> |
| 69 | +📌 iOS 개발자 관점에서는 직접 시스템 콜을 직접 부르는 경우는 자주 없지만, UIKit/Swift API 내부에서는 결국 시스템 콜로 내려간다. |
| 70 | +</aside> |
| 71 | + |
| 72 | +> 커널은 커널 모드에서 동작하며, 앱은 유저 모드에서 실행된다. 앱이 권한이 필요한 작업(I/O 등)을 수행하려면 시스템 콜을 통해 커널에 요청한다. |
| 73 | +> |
| 74 | +
|
| 75 | +# 운영체제의 역할 |
| 76 | + |
| 77 | +## 프로세스 관리 |
| 78 | + |
| 79 | +운영체제에서 작동하는 앱(프로그램)을 관리하는 기능으로 다른 의미로는 CPU를 관리하는 것으로 볼 수도 있다. |
| 80 | + |
| 81 | +현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당하며, 이 프로세스 간 공유 자원 접근과 통신 등을 관리하게 된다. |
| 82 | + |
| 83 | +- 프로세스, 스레드 |
| 84 | +- 스케줄링 |
| 85 | +- 동기화 |
| 86 | +- IPC 통신 |
| 87 | + |
| 88 | +관련 내용들을 운영체제 학습하면서 더 다루게 될 것이다. |
| 89 | + |
| 90 | +## 저장장치 및 메모리 관리 |
| 91 | + |
| 92 | +메인 메모리와 저장장치에 해당하는 하드디스크, NAND 등을 관리하는 기능이다. |
| 93 | + |
| 94 | +- 메모리 관리(Memory Management) |
| 95 | + - 1차 저장장치(Main Memory, RAM) |
| 96 | + - 프로세스에 할당하는 메모리 영역의 할당과 해제 |
| 97 | + - **가상 메모리** |
| 98 | + - 각 메모리 영역 간의 침범 방지 + 메인 메모리의 효율적 활용 |
| 99 | +- 저장장치 관리(Storage) |
| 100 | + - 2차 저장장치(HDD, NAND Flash Memory 등) |
| 101 | + - 파일 형식의 데이터 저장 |
| 102 | + - 디스크 I/O 요청을 처리하고 관리(I/O scheduling, buffering 등) |
| 103 | + - 이런 파일 데이터 관리를 위한 **파일 시스템**을 OS에서 관리 |
| 104 | + - `FAT, NTFS, EXT2, JFS, XFS` 등 많은 파일 시스템들이 개발되어 사용 중 |
| 105 | + |
| 106 | +<aside> |
| 107 | +📌 iOS에서는 **샌드박스(Sandbox)** 를 통해 앱마다 파일 접근을 제한하여, 다른 앱의 저장 영역을 접근할 수 없도록 격리한다. |
| 108 | + |
| 109 | +</aside> |
| 110 | + |
| 111 | +## 네트워킹 |
| 112 | + |
| 113 | +TCP/IP 기반의 인터넷에 연결하거나, 응용 프로그램이 네트워크를 사용하려면 **운영체제(커널)가 네트워크 스택을 제공**해야 한다. |
| 114 | + |
| 115 | +> **네트워크 스택(Network Stack)**은 운영체제가 TCP/IP 등 네트워크 프로토콜을 계층 구조로 구현한 것으로, 응용 프로그램은 소켓/네트워크 API를 통해 이를 사용하여 통신할 수 있다. |
| 116 | +(응용 프로그램은 보통 URLSession 같은 고수준 API를 사용하지만, 내부적으로는 OS의 소켓 인터페이스(Socket API)와 네트워크 스택을 통해 통신이 수행된다.) |
| 117 | +> |
| 118 | +
|
| 119 | +운영체제는 네트워크 장치(Wi-Fi, Cellular 등)를 제어하고 프로세스가 네트워크 기능을 사용할 수 있도록 소켓(Socket) 기반 인터페이스(Socket API)를 제공한다. |
| 120 | + |
| 121 | +또한 여러 프로세스가 동시에 네트워크를 사용하는 상황에서 **자원 관리, 성능 최적화, 보안 제어**를 수행해야 하기 때문에 운영체제에서 담당하게 된다. |
| 122 | + |
| 123 | +## 사용자 관리(User/Permission/Security) |
| 124 | + |
| 125 | +하나의 컴퓨터에서 여러 사람이 이용하는 경우가 있다. 그렇기 때문에 각 사용자의 계정을 관리할 수 있는 기능이 필요하다. 사용자 별로 프라이버시와 보안을 위해 파일에 대해 접근 제한을 지원해야한다. |
| 126 | + |
| 127 | +또한 운영체제는 앱이 다른 앱 데이터를 읽거나, 다른 정보들을 추적하거나 하면 안되기 때문에 권한이 없으면 실행 자체를 못 하게 강제하도록 한다. |
| 128 | + |
| 129 | +### iOS |
| 130 | + |
| 131 | +<aside> |
| 132 | +📌 |
| 133 | +iOS는 macOS/Linux 처럼 다중 사용자 OS가 아니기 때문에 **보안과 권한 관리**를 더 중요시 한다. |
| 134 | + |
| 135 | +</aside> |
| 136 | + |
| 137 | +- Sandbox |
| 138 | +- Permission |
| 139 | + - 카메라 |
| 140 | + - 마이크 |
| 141 | + - 사진첩 |
| 142 | + - 등등의 접근 |
| 143 | + |
| 144 | +## 디바이스 드라이버(Device Drivers) |
| 145 | + |
| 146 | +운영체제는 시스템의 자원, 하드웨어를 관리한다. 여러 하드웨어들을 운영체제에서 인식하고 관리하게 만들어 응용 프로그램이 하드웨어를 사용할 수 있게 만들어야 한다. 따라서, 운영체제 안에 하드웨어를 추상화 해주는 계층이 필요하다. 이 계층이 바로 **디바이스 드라이버(Device Driver)**라고 불린다. 하드웨어의 종류가 많은 만큼, 운영체제 내부의 디바이스 드라이버도 많이 존재한다. |
| 147 | + |
| 148 | +> **“디바이스 드라이버” → 운영체제가 여러 브랜드/모델의 하드웨어들을 통일된 방식으로 사용하기 위한 통역사** |
| 149 | +> |
| 150 | +
|
| 151 | +하드웨어를 직접 제어하는 것은 위험하다. 잘못 동작할 경우 운영체제 안정성을 해치거나 보안 문제가 발생할 수 있기 때문이다. 그렇기 때문에 일반적으로 커널 공간에서 동작하며 높은 권한을 가진 코드로 실행된다. |
| 152 | + |
| 153 | +<aside> |
| 154 | +📌 |
| 155 | + |
| 156 | +iOS는 제조사가 Apple이라 하드웨어와 운영체제가 긴밀하게 설계되어 드라이버 호환성이 비교적 단순한 편이다. |
| 157 | + |
| 158 | +그럼에도 운영체제의 핵심 구조는 그대로 갖고있다. (앱은 하드웨어에 직접 접근하지 않고, 운영체제가 제공하는 API를 통해 간접적으로 사용.) |
| 159 | + |
| 160 | +</aside> |
| 161 | + |
| 162 | +--- |
| 163 | + |
| 164 | +> 즉, 운영체제의 역할은 한정된 모든 자원을 여러 프로그램이 공유하는 상황에서 **충돌을 방지하고, 보안을 지키며, 성능을 최적화**하는 것이다. **자원 추상화(쉽게 쓰기), 보호(안전하게 통제)** |
| 165 | +> |
0 commit comments