💻 Operating System Services
For user
UI (User Interface)
- command-line interface (CLI)
Shell
- OS에 의해 실행되는 명령에 직접적으로 접근 가능
- Bin안의 실행 파일을 shell이 찾아서 수행
- Batch Interface
커맨드가 파일에 저장되고 해당 파일이 실행되는 구조
- GUI (Graphic UI)
Window, Unix, macOS 등 우리가 사용하는 OS
Program execution
I/O 연산
- file 과 I/O device에 접근할 방법 제공
File System Manipulation
- file과 directory 읽고 쓰기
- file 생성, 삭제, 검색 등
- 파일 정보 나열, 접근 권한 관리
Communication
- 프로세스간의 정보교환
- 메모리와 message passing 공유
Error Detection
- 각 error에 대해 OS는 일관성 보장을 위해 적절한 처리를 함
For efficiency
Resource 할당
- 여러 resource(cpu, memory, file storage, I/O device)를 여러 job(processes)에 할당 해줌
Accouting
- 어떤 user가 어떤 resource를 얼마나 사용하는지 계산
- 통계자료를 만들어줌
Protection
- 시스템 resource로의 접근이 관리되고 보호되는 것을 보장해줌
Security
- 외부에서는 user의 인증이 필요 외부의 I/O device에 유효하지 않은 접근으로 부터 보호
💻 System call
Kernel mode로 들어가기
- HW Interrupt
- Trap
- Exception
- System Call( 중요 )
System Call
응용프로그램이 OS에 서비스를 요청하는 메커니즘
(엄밀히 따지면 Library 함수)
- 대표적으로 read, write, fork, exit 등이 있음
-> os에게 service요청
- 라이브러리를 중간역할로 사용
라이브러리는 User level에, System Call은 Kernel에 있음
- 라이브러리 사용
- 실제 함수를 직접 호출하지 않아도 됨
- 어떤 OS에서도 사용가능 -> 프로그래밍이 쉬움
- 동일한 API로 호출이 가능하다.
- [Example]
POSIX Standard API (UNIX-like System)
POSIX API : malloc
실제 System Call로 호출되는 함수 sbrk()
- Unix like os -> POSIX -> read (library에서) -> sys_read -> System call
System Call Interface (Table 형태)
System Call을 제공해주는 table
수천개의 System call : numbering을 통해 효율적으로 관리
- 각 System Call 에 numbering되어 있음
- User -> 레지스터를 통해 숫자를 넘겨줌
- Kernel table에서 찾아서 실행
System Call 과정
- user가 fork() (POSIX 함수) 호출
- 라이브러리에서 fork() 찾음
- 레지스터에 SystemCall number : 2 넘김
- 0x80(128)번 (System Call)넘김 (software Interrupt 발생)
- IDT(Interrupt Descripter Table)에서 128번(System_call())에 해당하는 Interrupt 찾아 발생시킴
- Context 저장(다시 돌아와야지)
- Sys_call_table 에서 2번 함수(Sys_fork()) 찾아서 실행
System Program
프로그램 개발과 실행에 편리한 환경을 제공
- 파일 관리
- 상태 정보
- 파일 수정
- 프로그래밍 언어 지원
- 프로그램 로딩과 실행
- 통신
System Call의 종류
여러 종류의 System Call이 있음
Kernel이 H/W, I/O device, File 등 여러 resource 제어 (System Call 로)
-
Process 관리, 제어
end, abort, create, terminate, wait event, 등
-
파일 관리
create, open, read, write, 등
-
기기 관리
read, write, get device attributes
-
정보 유지
get time, date, process id, 등
-
통신
create, delete 통신 연결, send or receive messages
💻 OS design & Implementation
- 응용프로그램의 종류에 관계없이 general purpose로 설계 해야한다.
Micro Kernel
최소한의 기능만을 제공하고 나머지는 user level의 프로세스로 구현
보편적인 interface만 제공
- 프로세스 관리 : 프로세스 생성, 제거, 스케줄링, 동기화
- 메모리 관리 : 메모리 관리, 페이지 교체
- file system, device driver -> user level에 존재
💻 Operating System Structure
- Simple structure
- Layered approach
- Micro Kernel
- Module
- Virtual machine
대부분의 OS는 Layered approach 와 Module을 조합하여 사용한다.
Simple structure
- H/W protection이 없고, Dual mode가 아니다.
- Interface와 함수 level이 구분되어 있지 않다.
- ex. MS-DOS
- 응용프로그램은 I/O device와 H/W에 직접적으로 접근한다.
Layered approach
OS를 여러 층으로 계층화 한다.
- 하위 layer(HW)부터 상위 layer(user)로 구성한다.
- 하위 layer가 완벽히 구현되었다고 가정하고, 하위 layer에서 제공 되는 opration만을 이용하여 구현한다.
- 하위 layer에서 제공되는 interface를 통해 상위 layer가 접근한다.
하위 layer에서는 상위 layer로의 접근이 불가하다.
- 이렇게 하면 현재 layer만 고려하면 되어 구현과 debug가 간단해진다.
- UNIX System architecture
- 반면 MicroKernel은 OS와 응용프로그램이 한꺼번에 컴파일 됨.
MicroKernel
Kernel에는 아래 기능만 있음
- Process Scheduling
- Memory allocation
Device driver, File system task 등 나머지는 user level에 존재
- microkernel은 확장하기에 용이함
- 새로운 구조로 이식하기에도 용이
- kernel이 망가질 우려도 매우 낮음
- ∵ 대부분이 user level에 있기 때문에 communication의 overload가 크다.
- Example. MachOS, QnX
Modules
각 component는 기능별로 분리 되어 있음.
각각은 kernel이 원할 때, loadable
덕분에 어떤 부분을 수정했다고 해서 OS를 재 로딩 하지 않아도 됨
-
각각의 모듈은 동적(Dynamic, run time)으로 커널이 실행중에 추가, 삭제 가능 하다.
-
insmod
module을 kernel에 삽입
-
rmmod
module을 kernel에서 제거
Virtual machine
하나의 기계에서 여러 OS를 동시에 실행 하기위한 방식
Host OS 위에서 Guest OS동작
Host OS 입장에서는 Guest OS는 다 프로세스임
💻 System Boot
Bootstrap Loader
- 부팅될 때 무조건 수행하는 프로그램
- 커널에게 제어권 넘김
-> 커널을 메모리로 로드, 첫줄이 실행되도록
- 부팅 과정
1. H/W 초기화
2. kernel 로딩
3. kernel 이 main 문 실행
- ROM에 Bootstrap loader 넣어!
다 못넣으면 일부를 boot block에 넣고 그거를 kernel mode에서 실행