운영체제(OS)

Operating Systems 2. Operating System Structures

아뵹젼 2021. 10. 10.

 

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. 시스템 콜 테이블에서 해당 인자에 맞는 시스템 콜 함수를 찾아 실행하고, 실행이 완료되면 다시 커널 모드에서 사용자 모드로 변경하게 된다.

 

 

system call 함수 예시

 

 

 

위와 같은 경우에는 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 에 접근할 수 있는 인터페이스를 만들어 정의한다.

UNIX

 

Layered - 기능별로 OS 를 구분하였으며 각 기능은 독립적으로 작동한다.

모듈화를 통해 각 계층은 바로 아래 계층에서 제공하는 기능과 서비스만 사용 가능하다.

구축과 디버깅이 단순하지만 각 계층의 기능을 명확히 정의하기 어렵고 효율성이 떨어진다.

Layered

 

Microkernel - 커널이 없어도 할 수 있는 일들이 남겨져있으며 monolithic 과 반대되는 개념이다. 즉, 최소한의 기능만 커널에서 제공하고, 많은 기능들이 유저 모드에서 제공된다.

따라서 가벼우며 확장성이 크고 폐쇄형 OS 에 적합하다. 많은 Darwin 의 일부가 마이크로커널 Mach 를 기반으로 만들어졌다.

Microkernel

 

Modules - monolithic 이지만 기능별로 모듈화 한다. kernel 에 집어넣지만 필요할 때만 로드할 수 있다.

 

Mac OS X Structure - 커널 환경은 주로 Mach 마이크로 커널과 BSD UNIX 커널이다. -> Darwin 커널

 

하이브리드 구조 - Darwin 은 Mach 시스템 콜과 BSD UNIX 시스템 콜 두개의 인터페이스를 지원한다.

하이브리드 구조

 

IOS - Mac os X 에 기반에 기능을 추가한 구조이다. 즉, Mach + BSD 인 Darwin 커널을 기반으로 만들어졌다.

 

Android - 제일 하위 계층은 Linux 커널이다

 

댓글