Operating System Services
운영체제는 사용자와 시스템에게 다양한 실행 환경을 제공한다.
User Interface(UI) - CLI 는 사용자가 직접 명령을 내리는 것을 허락한다.
그리고 이러한 인터페이스를 제공하는 것이 쉘(Shell) 이다. GUI 는 가장 친숙한 인터페이스로, MS Window, Apple Mac OS, Unix/Linux 등을 포함한다. TSUI 는 마우스, 키보드 등을 요구하는 터치스크친 장치이다.
Program execution - 시스템은 프로그램을 메모리에 로드하고 실행할 수 있어야 한며, 정상적으로든 에러를 감지하여 비정상적으로든 실행을 완료해야 한다
I/O operations - 실행하는 프로그램은 파일 또는 I/O 에 관련된 명령을 요구할 것이다
OS는 사용자에게 유용한 기능들을 제공한다.
- 파일 시스템 조작, 통신, 에러 감지
운영체제는 또한 자원 공유를 통해 효율적인 시스템 작업을 위한 기능들을 제공한다.
- 자원 할당, 회계, 보호와 보안
System Calls
시스템 콜은 커널과 사용자 프로그램을 이어주는 인터페이스 역할을 한다.
대부분 C, C++ 와 같은 High-level 언어로 쓰여져 있다. 또한 high-level Application Programming Interface(API) (Win32, POSIX, JAVA API)를 통해서 System call을 사용할 수 있다.
System-call 인터페이스는 각 시스템 콜에 부여된 번호를 인덱스 테이블 형식으로 관리하고 있다.
시스템 콜 인터페이스는 OS 커널에서 의도한 시스템 콜을 호출하고, 시스템콜의 상태와 리턴 값을 돌려준다. 따라서 사용자는 시스템 콜이 어떻게 실행되는지 알 필요가 없다.
사용자가 시스템에 접근하기 위해서는 커널 모드로 전환되어야 하는데, 이때 시스템 콜을 사용한다.
시스템 콜이 호출되면 interrupt 가 발생하며, 이때 OS는 해당 시스템 콜의 인터럽트 서비스 루틴(Interrupt service routine) 을 찾기 위해 시스템 콜 테이블을 탐색한다.
해당 시스템 콜의 인터럽트 서비스 루틴은 보통 C로 짜여진 코드이며, 시스템 콜 테이블이 가리키는 특정한 메모리 주소가 어떤 동작을 할지 정의해 놓은 것이다.
해당 서비스 루틴을 모두 처리하고 나면 다시 커널 모드에서 사용자 모드로 넘어오게 된다.
* interrupt 와 trap 의 차이
인터럽트 : 하드웨어적 흐름의 변화로, 프로그램 외부(I/O 장치, 디스크) 등에서 발생하며, 발생 시점이 일정하지 않기 때문에 비동기적이다.
트랩 : 소프트웨어적 흐름의 변화로, 소프트웨어 인터럽트라고도 한다. 프로그램 내부에서 일어나는 에러로, 발생 시점이 프로그램의 일정한 지점이기 때문에 동기적이다.
사용자 프로세스에서 fork() 시스템 콜을 호출하는 과정이다.
1. c 라이브러리에서 fork() 시스템 콜의 고유 번호인 '2' 를 eax 레지스터에 저장하고 0x80 인터럽트를 발생시키며 사용자 모드에서 커널 모드로 변경된다.
2. 커널은 IDT(Interrupt Descriptor Table) 에서 0x80 번지에 있는 trap을 찾는다. IDT 에는 여러 종류의 trap 이 각 주소에 저장되어 있는데, system_call() 에 해당하는 trap 은 0x80 번지에 있다.
3. system_call() 함수에서 eax 인자를 통해서 시스템 콜 번호를 찾는다. 아까 fork() 에 해당하는 '2' 가 저장되었으므로 시스템 콜 테이블로 2를 인자로 넘겨준다.
4. 시스템 콜 테이블에서 해당 인자에 맞는 시스템 콜 함수를 찾아 실행하고, 실행이 완료되면 다시 커널 모드에서 사용자 모드로 변경하게 된다.
위와 같은 경우에는 printf 함수를 쓰기 위해 표준 라이브러리인 stdio.h 를 include 하였다. printf 함수는 출력을 해주는 함수로, 즉 I/O 연산이 필요하다.
I/O 연산은 사용자 모드가 아닌 커널 모드에서 사용 가능한 것으로, 사용자는 시스템 콜을 호출해야 한다.
시스템 콜의 5가지 유형
1. 프로세스 제어 (process control) : create/terminate , load/execute, wait/wignal event
ex) fork(), execve(), signal()
2. 파일 조작 (File management) : create/delete, open/close, read/write
ex) open(), read(), write(), close()
3. 장치 조작 (Memory management) : allocate memory
ex) brk()
4. 정보유지 (Information maintenance) : 시간과 날짜 설정, 획득 / 프로세스, 파일, 장치 속성 획득 및 설정
ex) time()
5. 통신 (Communications) : 통신 연결 생성 및 제거, 메시지 송수신
ex) socket(), bind(), connect()
Operating System Structure
MS-DOS - Shell 과 같은 간단한 형태로, 계층화가 체계적으로 되어 있지 않다.
UNIX - 조금 더 복잡한 monolithic(모듈화) 개념의 커널로, 계층화된 구조를 가지고 있다.
각 계층마다 하는 일은 구분되어 있으며, 각 계층의 기능은 시스템 전체에 영향을 끼친다.
또한 커널이 모든 기능을 포함하고 있다.
또한, 커널이 H/W 에 접근할 수 있는 인터페이스를 만들어 정의한다.
Layered - 기능별로 OS 를 구분하였으며 각 기능은 독립적으로 작동한다.
모듈화를 통해 각 계층은 바로 아래 계층에서 제공하는 기능과 서비스만 사용 가능하다.
구축과 디버깅이 단순하지만 각 계층의 기능을 명확히 정의하기 어렵고 효율성이 떨어진다.
Microkernel - 커널이 없어도 할 수 있는 일들이 남겨져있으며 monolithic 과 반대되는 개념이다. 즉, 최소한의 기능만 커널에서 제공하고, 많은 기능들이 유저 모드에서 제공된다.
따라서 가벼우며 확장성이 크고 폐쇄형 OS 에 적합하다. 많은 Darwin 의 일부가 마이크로커널 Mach 를 기반으로 만들어졌다.
Modules - monolithic 이지만 기능별로 모듈화 한다. kernel 에 집어넣지만 필요할 때만 로드할 수 있다.
Mac OS X Structure - 커널 환경은 주로 Mach 마이크로 커널과 BSD UNIX 커널이다. -> Darwin 커널
하이브리드 구조 - Darwin 은 Mach 시스템 콜과 BSD UNIX 시스템 콜 두개의 인터페이스를 지원한다.
IOS - Mac os X 에 기반에 기능을 추가한 구조이다. 즉, Mach + BSD 인 Darwin 커널을 기반으로 만들어졌다.
Android - 제일 하위 계층은 Linux 커널이다
'운영체제(OS)' 카테고리의 다른 글
Operating Systems - 5. CPU Scheduling - (2) (0) | 2021.10.14 |
---|---|
Operating Systems 5. CPU Scheduling - (1) (0) | 2021.10.13 |
Operating Systems 3. Processes (0) | 2021.10.11 |
Operating Systems 1. Introduction (0) | 2021.10.10 |
[Linux] Linux Kernel Compile 리눅스 커널 컴파일 하는법 (0) | 2021.09.14 |
댓글