Operating System Services
- 운영체제 : 프로그램 및 사용자가 사용할 수 있는 서비스 / 프로그램 실행을 위한 환경을 제공한다
운영체제가 제공하는 서비스 및 기능

- 사용자를 위한 서비스
- UI
- 프로그램 실행
- 입출력 연산
- 파일 시스템 조작
- 통신
- 오류감지
- 시스템 자체의 효율적인 운영을 위한 기능
- UI
- CLI (command line interface)
- CLI를 사용하면 직접 명령을 입력할 수 있다
- 어떨 때는 kernel(Linux)로, 때로는 시스템 프로그램(window cmd)으로 구현되어 있다.
- terminal, cmd
- GUI
- 마우스로 프로그램 실행, 파일 여는 등의 조작
- 마우스, 키보드, 모니터, 프로그램 아이콘
- touch-screen interface
- 제스처를 통해 제어, 가상 키보드와 음성인식 기능
System Calls
- os에서 제공하는 서비스에 대한 인터페이스를 제공
- interrupt를 통해 OS kernel에 대한 함수를 호출할 수 있다
- kernel과 사용자 프로그램의 통신이 필요한 운영체제 서비스에 대한 인터페이스를 제공한다.
- 일반적으로 interrupt handler로 제공된다
하드웨어와 밀접한 경우가 대부분이기 때문에 일반적으로 C, C++로 구현되어 있다.
- 권한이 낮은 모드에서 높은 모드(kernel)로 제어권을 안전하게 이전하는 메커니즘이다
- 대부분 프로그램에서 직접 시스템을 호출하지 않고, high-level API로 접근한다
- Dual-mode operation
- User mode
- 사용자가 정의한 코드
- 권한이 필요한 명령은 OS system call을 통해서만 호출될 수 있다.
- Kernel mode
- OS code, System call → 권한이 필요한 명령이 허용된다.
System Call - OS Relationship
OS는 interrupt driven 프로그램이다
- OS의 system call은 interrupt를 통해 비동기 이벤트를 처리한다.
- system call이 이뤄지면, OS에 interrupt를 전송하여 user mode→kernel mode로 전환하라는 메시지를 표시한다.
- 이를 통해 OS는 요청된 작업을 안전하고 효율적으로 수행하여 하드웨어와 리소스를 낮은 수준에서 관리한 후user mode process로 제어권(control)을 반환한다.
- 이 모델(system call)을 사용하면 OS가 외부 및 내부 이벤트에 계속 반응하여 시스템 성능과 리소스 활용도를 최적화할 수 있다.

프로그래머가 API func (e.g. open())을 실행한다. [user mode]
**System call interface : 각 시스템 호출과 관련된 일련번호가 저장된 테이블을 관리한다 [kernel mode]
System call interface는 open() 함수가 저장된 system call number를 찾아 테이블에서 그 값을 가져와 system call을 호출 후 결과 값을 반환한다. [kernel mode]
RTE(e.g. vc, eclipse)에서 API func (open()) 함수를 실행한다. [user mode]
System Call Implementation (구현)
각 system call에는 숫자가 있다.
System-call interface : 그 숫자를 index한 table

System Call Parameter Passing
- OS에 parameter를 전달하는 데 사용되는 3가지 방법
- parameter를 register에 전달 (간단한 정보)
- parameter를 메모리내의 블록이나 테이블에 저장하고 블록 주소가 register에 저장되는 방법
- parameter를 스택에 저장하는 방법
Types of System Calls
- Process control (프로세스 제어)
- 프로세스 생성 및 종료
- // load 및 실행
- // 속성 획득/설정
- 시간 기다리기
- 이벤트 기다리기/알림
- 메모리 할당 및 해제
- File Management (파일 관리)
- 파일 생성 및 삭제
- 파일 open, close
- 파일 읽기, 쓰기, 위치 변경
- 파일 속성 획득 및 설정
- Device Management (장치 관리)
- 장치 요청 및 해제
- 장치 읽기, 쓰기, 위치변경
- 장치 속성 획득 및 설정
- 논리적으로 장치를 연결 또는 분리
- Information maintenance (정보 유지)
- 시간과 날짜의 설정 및 획득
- 시스템 데이터 설정 및 획득
- 프로세스, 파일, 장치 속성 설정 및 획득
- Communications (통신)
- 통신 연결 생성 및 삭제
- 메시지가 host name이나 process name을 전달하는 경우 메세지 보내기/받기
- 공유-메모리 모델 생성 및 메모리 영역에 대한 엑세스 획득
- 전송 상태 정보
- 원격 장치 연결 및 분리
- Protection (보호)
- 리소스에 대한 접근 제어
- 권한 가져오기 및 설정
- 사용자 접근 허용 및 거부
Why Applications are OS Specific
어플이 OS에 따라 달라지는 이유
: OS type에 따라 system calls도 다르기 때문이다
- 한 OS에서 컴파일된 응용 프로그램은 다른 OS에서 실행할 수 없다
- 앱은 다중OS 일 수 있다
System Programs
system program은 개발하고 실행하기에 편리한 환경을 제공한다.
system program들은 분할된다 :
- file manipulation
- 상태 정보
- 프로그래밍 언어 지원
- 프로그램 로딩 및 실행
- 소통
- 백그라운드 서비스
- 어플 프로그램
사용자가 OS를 보는 시각은 실제 system call이 아니라 대부분 system program에 의해 정의된다.
Operating System Design and Implementation
OS 설계 및 구현
- OS의 설계 및 구현은 “해결가능”하진 않지만 일부 접근 방식은 성공적이다
- 각각의 OS 내부구조는 매우 다양하다
- 하드웨어 선택, 시스템 유형에 따라 영향을 받는다
- 사용자의 목표와 시스템의 목표
- 사용자 : OS는 사용하기 편하고, 배우기 쉽고, 신뢰할 수 있고, 안전하고 빨라야 한다.
- 시스템 : OS는 설계, 구현, 유지관리가 쉬워야 한다. 유연하고 안정적이며 오류가 없고, 효율적이여야 한다.
- separate의 중요한 원칙 Policy : what will be done? Mechanism : How to do it?
- 정책과 메커니즘의 분리는 매우 중요한 원칙으로, 정책이 나중에 변경될 경우 최대의 유연성을 허용한다. (ex. timer)
- OS를 지정하고 설계하는 것은 소프트웨어 엔지니어링의 매우 창의적인 작업이다.
Implementation
- 변동이 많다
- 초기 OS는 어셈블리어 → Algol → C, C++
- 실제로는 여러 언어들이 섞여있다
- 고급언어일수록 다른 하드웨어로 쉽게 이식할 수 있다 → 그러나 느림
Operating System Structure
- 일반적으로 OS는 매우 큰 프로그램이다
- 하나를 구성하는데 다양한 방법이 있다
- Monolithic structure
- Layered approach
- Microkernel
- Modules
- Hybrid systems
1. Monolithic Structure (단조로운 구조)
(+) 뚜렷한 성능 이점 (속도 및 효율성)
(-) 확장이나 구현에 불편함
2. Layered Approach

- 운영체제는 여러 계층으로 나뉘며, 각 계층은 하위 계층의 위에 위치된다.
- 맨 아래 계층(layer 0)은 하드웨어
- 가장 높은 계층(layer N)은 사용자 인터페이스
- 각 계층은 하위 계층을 호출할 수 있다
- level 1은 level 0 호출, level2에 호출당함
(+) 구성 및 디버깅이 단순하다
계층은 하위 계층의 세부 정보를 알 필요가 없다
(-) 계층적 접근의 어려움
여러 계층을 정의하려면 신중한 계획이 필요하다
하위 계층에 대한 호출을 반복함으로써 비효율적이다
3. Microkernel

- smaller kernel
- 중요한 것만 kernel에 남기고, 그 외의 것은 시스템/사용자 레벨 프로그램으로 구현하여 OS를 구성하는 방법
- 프로세스/메모리 관리/통신 시설은 kernel에 있다
- system call은 메세지 전달을 통해 제공된다
- kernel은 client-server 사이의 메세지 전달 기능만 제공
(+) 마이크로커널 확장이 용이하다
(+) 새로운 architecture로 OS를 이식하는 것이 용이하다
(+) 더 안정적(kernel에서 실행되는 코드가 적음)
(+) 더 안전함
(-) 커널 공간 통신에 대한 사용자 공간의 성능 오버헤드가 크다
file system → device driver로 메세지 전달할 때 mode를 2번 스위치해야 함
4. Modules

- 많은 현대 OS는 LKM(loadable kernel modules-로드 가능한 커널 모듈)을 구현한다
- 객체지향 접근방식 사용
- 핵심 구성 요소는 분리되어있다
- 커널은 핵심 서비스를 제공하고, 다른 서비스는 커널이 실행될 때 동적으로 구현된다
(+) 핵심 서비스를 제공
특정 기능을 동적 구현 가능
- 2,3번 방식과 비교
- layered approach와 비슷하지만, 각각의 모듈로 구성되어 있고 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 오버헤드가 발생하지 않는다.
- microkernel과도 유사하지만, 각각 모듈은 커널 모드에서 실행할 수 있다 → 통신하기 위해 메세지 전달을 할 필요가 없기 때문에 더 효율적이다.
5. Hybrid Systems
- 대부분의 현대 운영체제는 하나의 구조만을 선택하지 않는다.
- 다양한 접근 방식을 결합하여 성능, 보안 및 편리성 문제를 해결한다.
- window ⇒ monolithic + microkernel …
- MaxOS ⇒ hybrid + layered + Aqua UI + Cocoa ..
MacOS, iOS

- User experience layer
- 사용자가 컴퓨팅 장치와 상호작용할 수 있는 소프트웨어 인터페이스 제공
- Application frameworks layer
- Objective-C 및 Swift 언어에 대한 API 제공
- Core frameworks
- Kernel 환경 : Darwin (하이브리드 커널)
- Darwin은 주로 Mach 마이크로커널과 BSD UNIX 커널로 구성된 계층화된 시스템이다
Android
![업로드중..]()
- Android 장치의 소프트웨어 설계자는 Java 언어로 응용 프로그램을 개발하지만 일반적으로 표준 Java API를 사용하지 않고 별도의 Android API를 사용한다.
- Java 응용 프로그램은 Android RunTime(ART)에서 실행할 수 있는 형식으로 컴파일된다.
System Boot
- Booting : kernel을 로드하여 컴퓨터를 시작하는 절차
- 부트스트랩 프로그램 (부트스트랩 로더)
- 진단 실행
- 시스템 초기화
- 커널 찾기, 로드, 시작
- 시스템 전원이 초기화되면, 고정된 메모리 위치에서 실행 시작된다
- OS는 OS를 시작할 수 있도록 하드웨어가 사용가능해야 한다.
- 부트 블록
- 전체 OS를 로더하거나
- 부트 스트랩 프로그램의 남아있는 코드와 정보의 일부를 로더한다
- 공통 부트스트랩 로더 GRUB를 사용하면 multiple disks, versions, kernel option로부터 커널을 선택할 수 있다.
- 커널 로드와 시스템은 실행중이다.
(출처)
Operating System Concepts 도서
https://www.booksfree.org/operating-system-concepts-10th-edition-by-abraham-silberschatz-peter-b-galvin-greg-gagne-pdf/