본 자료 정리는 'Operating System Concepts'(Tenth Edition) - Abraham Silberschatz 원서에 출처합니다.
Copyright © 2020 John Wiley & Sons, Inc.
운영 체제는 프로그램 및 사용자가 사용할 수 있는 특정 서비스 및 프로그램 실행을 위한 환경을 제공한다.
사용자 인터페이스(UI)
프로그램 실행, 입출력 연산, 파일 시스템 관리, 통신, 오류 감지
자원할당, 기록, 보호&보안 (각 프로그램이 자원을 얼마나 사용하는지 추적하여 기록-자원 할당에 활용하기 위함)
CLI or Command Interpreters
GUI (그래픽 기반 사용자 인터페이스)
터치스크린
간단한 프로그램 (파일 복사, 이동)의 경우도 많은 System Call을 수행한다.
API(Application Programming Interface)는 애플리케이션 프로그래머를 대신하여 실제 시스템 호출을 호출한다.
대부분의 어플리케이션 개발자들은 API에 따라 프로그램을 설계하며 API는 각 함수에 전달되어야할 매개변수들과 프로그래머가 기대할 수 있는 반환 값을 포함하여 어플리케이션 프로그래머가 사용 가능한 함수의 집합을 명시한다.
가장 흔한 API (Windows API, POSIX API, Java API)
시스템 콜을 위한 API 세부정보 - parameter(파일 정보, 파일 저장 버퍼 읽는 사이즈)
RTE(Run-time environment)는 운영체제가 제공하는 시스템 콜에 대한 연결고리 역할을 하는 시스템 콜 인터페이스를 제공한다.
(* System call interface: 사용자가 프로그램을 실행할 때 api 실행을 위해 운영체제의 system call 과 연결해준다.)
프로그래머가 API func (e.g. open())을 실행한다. [user mode]
** System call interface에서는 각 시스템 호출과 관련된 일련번호가 저장되어 있는 테이블을 관리한다. [kernel mode]
System call interface는 open() 함수가 저장되어 있는 system call number를 찾아 테이블에서 그 값을 가져와 system call을 호출 후 결과 값을 반환한다. [kernel mode]
RTE에서 API func (open()) 함수를 실행한다. [user mode]
프로그래머는 시스템 콜이 어떻게 구현되고 실행 중 무슨 작업을 하는지 아무것도 알 필요가 없다. 단지 API를 준수하고 사용법을 익히며 시스템 콜의 결과로써 운영체제가 무엇을 할 것인지만 알면 된다
대부분의 경우, 원하는 system call을 단순히 식별하는 것보다 더 많은 정보가 필요하다. (e.g. 정확한 정보의 종류, 양)
OS에 매개변수를 전달하는 데 사용되는 3가지 일반적인 방법
매개변수를 메모리내의 블록이나 테이블에 저장하고 블록 주소가 레지스터 내에 저장되는 방법
매개변수를 블록이나 스택에 저장하는 방법
테이블을 통해 매개변수를 전달하는 방법
Process control (프로세스 제어)
File Management (파일 관리)
Device Management (장치 관리)
Information maintenance (정보 유지)
Communications (통신)
- 통신 연결 생성, 삭제
메세지가 호스트 이름 또는 프로세스 이름으로 모델을 전달하는 경우 메세지 보내기, 받기
공유 메모리 모델 생성 및 메모리 영역에 대한 엑세스 획득
전송 상태 정보
원격 장치 연결 및 분리
Protection (보호)
- 리소스에 대한 엑세스 제어
System service(=system utilities)는 프로그램 개발 및 실행을 위한 편리한 환경을 제공한다.
파일 관리: (e.g. 파일 및 디렉토리 생성, 삭제, 복사, 이름 변경. 인쇄..)
상태 정보: (e.g. 날짜, 시간, 사용 가능한 메모리 양,디스크 공간, 사용자 수, 성능, 디버깅 정보 제공)
파일 수정: (e.g. 파일 생성 및 수정을 위한 텍스트 편집기)
프로그래밍 언어 지원: (e.g. 컴파일러, 어셈블러, 디버거 및 인터프리터)
프로그램 로딩 및 실행: (e.g. absoulute loaders, linkage editors, overlay-loaders, 상위 레벨 및 기계어 용 디버깅 시스템)
통신: 프로세스, 사용자 및 컴퓨터 시스템 간의 가상 연결을 생성하기 위한 메커니즘 제공 (e.g. 사용자가 서로에게 메시지를 보내고, 웹 페이지를 탐색하고, 전자 메일 메시지를 보내고, 원격으로 로그인하고, 한 시스템에서 다른 시스템으로 파일을 전송하도록 허용)
백그라운드 서비스: 부팅 시 시작 (e.g. 디스크 검사, 프로세스 스케줄링, 오류 로깅, 인쇄와 같은 기능 제공 [kernel context에서 실행])
응용 프로그램
고급언어로 작성된 소스 파일을 컴파일하면 기계어로 작성된 오브젝트 파일로 변환되는데 이를 재배치 가능 오브젝트 파일(relocatable object files) 이라고 한다.
Linker(링커)는 재배치 가능한 개체 파일을 단일 바이너리 실행 파일로 결합한다. 즉, 각각의 source 파일들을 묶어 하나의 실행가능한 file로 만든다. (e.g. C언어 컴파일 과정)
Loader(로더)는 바이너리 실행파일을 메모리에 로드하여 CPU 코어에서 실행한다.
reloacation(재배치, linking+loading)는 프로그램 부분에 최종 주소를 할당하고 해당 주소와 일치하도록 프로그램의 코드와 데이터를 조정한다.
실제 시스템 대부분에서는 프로그램이 적재될 때 라이브러리를 동적으로 링크할 수 있는 기능을 지원한다.
__ 어플리케이션이 OS에 따라 달라지는 이유
한 OS에서 컴파일된 응용 프로그램은 다른 운영 체제에서 실행할 수 없다.
(e.g. iOS에서 사용 가능한 한 세트의 API를 호출하도록 설계된 앱은 해당 API를 제공하지 않는 Android에서 작동하지 않는다.)
응용 프로그램이 운영체제마다 다른 이유
OS는 header, command 및 변수 등의 배치를 강제하는 형식이 있다. 즉, 이러한 component는 반드시 특정 위치에 존재해야 하는데 이것이 OS마다 다를 수 있다.
CPU는 다양한 명령어 집합을 가지며 해당 명령어가 포함된 응용 프로그램만 올바르게 실행시킬 수 있다.
OS마다 같은 기능을 하는 system call이라 하더라도 이름, 매개변수 의미 등이 다를 수 있다.
(-) 확장이나 구현에 불편함
(+) 뚜렷한 성능 이점 (속도 및 효율성)
-- (system-call interface에서 매우 적은 오버헤드, 커널 내에서 소통이 빠르다.)
(유닉스에서 파생됨)
(+) 한 구성요소의 변경은 해당 구성요소에만 영향을 미친다.
(+) 계층이 나눠져 있으니 구성 및 디버깅이 단순하다.
(-) OS 서비스를 얻기 위해 사용자 프로그램이 여러 계층을 통과해야 하는 오버헤드로 인해 전반적인 성능이 저하된다.
Microkernel(마이크로커널)은 중요한 것들만 커널에 남기고 그 외의 것들은 별도의 사용자 레벨 프로그램으로 구현하여 운영체제를 구성하는 방법이다. (e.g. Mach 운영체제 - MacOS, iOS의 Darwin 커널은 부분적으로 Mach를 기반으로 한다.)
마이크로커널의 주 기능은 클라이언트 프로그램과 사용자 공간에서 수행되는 다양한 서비스 간에 통신을 제공하는 것이다. 통신은 메시지 전달에 의해 제공된다.
(+) 마이크로커널 확장 용이
(+) 새로운 아키텍처로의 운영 체제 이식 용이
(+) 더 안정적(커널 모드에서 실행되는 코드가 적음)
(+) 더 안전함
(-) 커널 공간 통신에 대한 사용자 공간의 성능 오버헤드가 크다.
많은 최신 운영 체제는 로드 가능한 커널 모듈(LKM, loadable kernel modules)을 구현한다.
LKM에서 커널은 핵심적인 구성요소의 집합을 가지고 있고 부팅 또는 실행 중에 동적으로 부가적인 서비스들을 모듈을 통하여 실행하도록 한다.
커널은 핵심 서비스를 제공하고 다른 서비스는 커널이 실행될 때 동적으로 구현된다.
계층적 접근 (Layered Approach)과 유사하지만 각각의 모듈로 구성되어 있고 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 오버헤드가 발생하지 않는다.
마이크로 커널과도 유사하지만 통신하기 위해 메시지 전달을 할 필요가 없기 때문에 더 효율적이다.
대부분의 현대 운영체제는 하나의 구조만을 선택하지 않는다. 다양한 접근 방법을 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용구조로 구성된다.
다양한 계층
macOS, iOS: Darwin이라고 불리는 하이브리드 커널 환경을 사용.
Android 장치의 소프트웨어 설계자는 Java 언어로 응용 프로그램을 개발하지만 일반적으로 표준 Java API를 사용하지 않고 별도의 Android API를 사용한다.
Java 응용 프로그램은 Android RunTime(ART)에서 실행할 수 있는 형식으로 컴파일된다.
수정해야될 사항이 있거나 잘못 번역된 문장이 있을경우 댓글로 알려주세요 :)
운영체제 시험 12시간 전 최고의 선택