강민철님의 "혼자 공부하는 컴퓨터 구조+운영체제"을 기반으로 학습한 게시물입니다.
📕 목차
1. Operating System
2. Overall
1. Operating System
📌 What is Operating System?
- 컴퓨터에는 여러 물리적, 논리적 시스템 자원들이 모여있다.
- Physical Resource : Processor, Memory, Disk, Terminal, Network, ⋯
- Virtual Resource : tasks, segments/pages, files, drivers, communication protocols, ⋯
- 자원이 한정되어 있으며, 하나 혹은 다수의 프로그램이 자원을 공유하기 위해 관리자가 필요해졌다.
- 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램
- OS 또한 프로그램이므로 memory에 적재되어야 한다.
- 부팅 시에 Kernel space라는 특수 공간에 적재되어 실행된다.
- Kernel space 제외한 영역을 User space라고 한다.
- Application이 실행될 때, memory 주소가 겹치지 않게 공간을 할당하고 Program을 적재해주는 역할을 한다.
- 더 이상 실행되지 않는 Program이나, 자원을 독점하는 Program을 강제로 memory에서 삭제하는 역할도 수행한다.
- 동시에 여러 Process가 동작할 때, CPU를 사용 우선 순위, 할당 시간 등을 제어한다.
- OS는 Application에 자원을 효율적으로 배분하고, Process들이 지켜야 할 규칙을 만들어 System을 관리한다.
- 관리할 자원 별로 기능이 나누어져 있어, 각각의 역할대로 HW를 관리한다.
📌 운영체제를 알아야 하는 이유
운영체제는 진짜진짜진짜진짜진짜진짜진~~~~짜 중요하다.
특히 공부를 하면 할 수록 Network와 OS 쪽 지식이 부족하면 따라잡기가 힘든 상황이 점점 많아진다.
그렇다면 대체 왜 알아야 하는가?
우선 OS가 왜 필요한지를 예시로 들어보면 된다.
냉장고처럼 자원이 많지 않은 프로그램은 작은 시스템만으로 커버가 가능하다. (물론 요즘처럼 온갖 기능 다 때려넣는 냉장고면 얘기가 달라지긴 한데..)
문제는 컴퓨터처럼 자원이 많은 경우에는 OS가 없으면, 개발자가 그걸 전부 관리해주어야 하는데 이게 말도 안 되는 양의 작업량과 전공 지식을 요구한다.
그걸 위해 OS가 있긴 있어야 하는데, 문제는 OS 회사마다, 그리고 제품마다 자원 관리 정책이 상이하다.
"제 컴퓨터에선 되는데요?"라는 개발자 명언 중 큰 부분이 OS, 즉 환경 차이가 불러온 문제일 가능성이 크다.
그렇다면, 이걸 그냥 MZ하게 "응, 내 탓 아니야~"라고 무시할 것이냐(나도 MZ...), 그 환경의 차이를 이해하고 문제를 개선하는 전략을 세우는 Specialist가 될 것이냐.
잘 생각해보면 된다.
근데 요새 비전공자들은 그렇다 치고, 전공자들도 OS 중요성 모르고 대충 공부하는 거 보면 참....🤦♂️
2. Overall
📌 Kernel
- OS에서 핵심 서비스를 담당하는 부분 (모든 OS에 반드시 존재)
- OS가 제공하지만 Kernel에 포함되지 않는 서비스 예 : 사용자 인터페이스(UI, User Interface)
- UI에는 그래픽 유저 인터페이스(GUI; Graphical User Interface)와 커맨드 라인 인터페이스(CLI; Command Line Interface)가 있다.
- 컴퓨터와 상호작용하기 위한 통로일 뿐 Kernel에 속한 기능은 아니다.
📌 이중 모드(dual mode) & 시스템 호출(system call)
- Application은 컴퓨터 자원을 사용하기 위해 반드시 Kernel에게 요청(system call)해야 한다.
- 이중 모드(dual mode) : ALU의 supervisor flag로 판단
- 사용자 모드(user mode)
- OS 서비스를 제공받을 수 없는 실행 모드 (kernel 영역의 코드를 실행할 수 없다.)
- 대부분의 Application들은 기본적으로 User mode로 실행된다.
- User mode로 실행 중인 CPU는 I/O 명령같은 HW 자원 접근 기능을 실행할 수 없다.
- 커널 모드(kernel mode)
- OS 서비스를 제공받을 수 있는 실행 모드
- Kernel mode로 실행 중인 CPU는 모든 명령어를 실행할 수 있다.
- 사용자 모드(user mode)
- User mode의 Process는 System call을 통해 Kernel mode로 전환하여 OS service를 제공받을 수 있다.
- 일종의 Interrupt이며, 정확히는 Software Interrupt(I/O Device가 아닌 특정 명령어에 의해 발생)다.
- 기존의 Interrupt 방식과 유사하게 동작한다.
- system call
- OS code 실행
- system call 복귀
📌 핵심 서비스
1️⃣ Process
- Memory에 적재되어 실행 중인 Program
- 순간적으로는 CPU는 한 번에 하나의 Process만 실행 가능하다. (Process 전환 속도가 너무 빨라서 실감하지 못할 뿐이다.)
- 여러 Process가 동시에 실행되는 환경에서는 Process Synchronization이 필수적이다.
- 여러 Process가 실해오디지 못하고 멈춰있는 Deadlock을 해결해야 한다.
2️⃣ 자원 접근 및 할당
- CPU
- CPU Scheduling : OS가 여러 Process에게 CPU를 공정하게 할당하는 방법
- Memory
- Process들은 크기와 적재되는 주소가 가지각색이고, 실행될 때마다 그 주소가 바뀐다.
- OS는 Process에게 적절히 Memory를 할당하고, 부족할 경우에 대한 해결책을 제시한다.
- I/O Device
- ISR은 OS가 제공하는 기능으로 Kernel mode에 있다.
3️⃣ File System
- OS가 보조기억장치 속 데이터들을 file과 directory로 관리하는 기능 역시 OS 핵심 서비스다.
📌 가상 머신과 이중 모드
- Virtual machine에 설치한 OS도 결국 Application이므로 User mode로 동작한다.
- Virtual machine의 OS에 설치된 Application이 OS service를 제공받기가 힘들다.
- 가상화를 지원하는 CPU는 Kernel mode와 User mode외에 Hypervisor mode를 따로 둔다.
- 이로 인해, Virtual machine의 Application도 OS로부터 기능을 제공받을 수 있다.
📌 system call의 종류
종류 | 시스템 호출 | 설명 |
프로세스 관리 | fork() | 새로운 자식 프로세스 생성 |
exec() | 프로세스 실행 (메모리 공간을 새로운 프로그램 내용으로 덮어씌움) | |
exit() | 프로세스 종료 | |
waitpid() | 자식 프로세스 종료까지 대기 | |
파일 관리 | open() | 파일 열기 |
close() | 파일 닫기 | |
read() | 파일 읽기 | |
write() | 파일 쓰기 | |
stat() | 파일 정보 확인 | |
디렉토리 관리 | chdir() | 작업 디렉토리 변경 |
mkdir() | 디렉토리 생성 | |
rmdir() | (비어 있는) 디렉토리 삭제 | |
파일 시스템 관리 | mount() | 파일 시스템 마운트 |
unmount() | 파일 시스템 마운트 해제 |