본문 바로가기
컴퓨터공학/운영체제

OS 2.운영 체제 구조

by Jinger 2023. 4. 3.

서론

 운영체제를 사용자, 프로그래머, 운영체제 설계자의 관점에서 바라본 운영체제의 세 가지 측면을 살펴보자.

  • 운영체제가 제공하는 서비스에 초점
  • 운영체제가 사용자와 프로그래머에게 제공하는 인터페이스에 초점
  • 시스템의 구성요소와 그들의 상호 연결에 초점

Operating System Services

 운영체제는 사용자에게 제공하는 서비스

  • 사용자 인터페이스
    • 명령줄 인터페이스(Command Line Interface, CLI), 그래픽 사용자 인터페이스(Graphics User Interface, GUI)
  • 프로그램 실행
    • 프로그램을 메모리에 로드하고 실행한 다음 종료한다.
  • I/O 작업
    • 키보드/마우스에서 입력, 모니터/프린터로 출력한다.
  • 파일 시스템 조작
    • 파일 또는 디렉토리 읽기/쓰기, 파일 생성/삭제/검색 등
  • 커뮤니케이션
    • 프로세스 간에 정보를 교환한다.
  • 오류 감지
    • 하드웨어(메모리 오류, 정전)
    • I/O 장치(네트워크 연결 실패, 프린터 용지 부족)
    • 사용자 프로그램(산술 오버플로, 불법 메모리 액세스)

시스템 자체의 효율적인 운영을 위한 OS 기능

  • 자원 할당
    • 다중 사용자 또는 다중 작업용
    • CPU 주기, 메모리, 파일 저장 및 I/O 장치
  • Accounting & Logging
    • 어떤 사용자가 얼마나 많은 리소스를 사용하는지.
    • Accounting: 시스템의 활동을 추적하고 기록하는 것
    • Logging: 시스템 리소스 사용량을 추적하고 기록
  • 보호 및 보안
    • 보호(Protection)
      • 시스템 리소스에 대한 액세스 제어
    • 보안(Security)
      • 사용자 인증
      • 유효하지 않은 액세스 시도에 대한 방어

Operating System User Interface

Command Line interface (CLI)

 CLI는 키보드 기반 인터페이스이다. CLI에서 제공하는 셸(shell)이라는 프로그램이 있다. 사용자는 셸을 통해 키보드로 명령어를 입력하고, 컴퓨터에 명령을 전달할 수 있다. 대표적으로 E.g. bash(Bourne-Again SHell), zsh(Z Shell), ksh(Korn SHell), cmd.exe(Command Prompt), PowerShell 등이 있다. 명령어는 쉘 내 내장 명령이나 별도의 프로그램(ls, vi 등)으로 명령 구현이 가능하다. 단, 사용자는 명령을 기억해야 한다.

Graphic User Interface (GUI)

 GUI는 마우스 기반 인터페이스이다. 사용자 친화적인 창 및 메뉴 시스템 등의 인터페이스를 제공한다. 아이콘은 파일, 프로그램, 작업 등을 나타낸다.

CLI vs GUI

 CLI와 GUI의 선택은 개인 취향이다. 일반적으로 GUI가 접근하기 쉽고 명령어를 기억하지 않아도 되기에 많이 쓰인다. 최신 OS는 두 가지 인터페이스를 모두 제공한다. E.g. Microsoft Windows, Apple Mac OS X, Solaris, Linux


System Calls

 System calls(시스템 호출)이란 OS에 의해 사용 가능하게 된 서비스에 대한 인터페이스이다. 프로그램이 운영 체제에서 서비스를 요청하는 방법으로 하드 디스크에 액세스, 새로운 프로세스 생성 및 실행 등이 있다. System calls은 프로세스와 운영 체제 간의 필수 인터페이스를 제공하고 일반적으로 고급 언어(C 또는 C++)로 작성된다.

Application Program Interface, API

 애플리케이션 프로그램 인터페이스(API)는 애플리케이션 프로그래머가 사용할 수 있는 함수들의 집합을 의미한다. 대표적인 세 가지 API로 Windows용 Win32 API, POSIX 기반 시스템용 POSIX API(UNIX/Linux), Java 가상 머신용 Java API가 있다. System calls이 아닌 API를 사용하는 이유는 사용하기 쉽고 휴대성이 좋기 때문이다. 그뿐만 아니라 프로그래머가 System calls 구현을 알 필요가 없다. API를 준수하고 OS가 수행할 작업을 이해하면 되기에 OS의 세부 사항은 API에 의해 프로그래머에게 숨겨진다.

 API 선호에 대해 더 깊게 알아보자. API를 선호하는 첫 번째 이유는 호환성이다. API를 지원하는 어느 시스템에서건 컴파일되고 실행된다는 것을 기대할 수 있다. 게다가 실제 시스템 콜은 종종 좀 더 자세한 명세가 필요하고 프로그램상에서 작업하기가 API보다 어렵다. 둘째로는 실행 시간 환경(RTE)이 있다. 컴파일러 또는 인터프리터를 포함하여 특정 프로그래밍 언어로 작성된 응용 프로그램을 실행하는 데 필요한 전체 소프트웨어 제품군과 라이브러리 또는 로더와 같은 다른 소프트웨어를 함께 가리킨다. RTE는 운영체제가 제공하는 시스템 콜에 대한 연결고리 역할을 하는 시스템 콜 인터페이스를 제공한다.

System call vs. API

 시스템 콜은 운영 체제 커널의 기능을 호출하는 인터페이스로 사용자 모드에서 실행 중인 프로세스가 커널 모드로 전환되어, 운영 체제가 제공하는 서비스를 호출하고, 실행 결과를 반환한다. 시스템 콜은 운영 체제에서 제공하는 기능을 사용할 수 있는 유일한 방법이다.

 API는 응용 프로그램에서 사용 가능한 라이브러리의 함수와 프로시저의 집합이다. 응용 프로그램은 API를 사용하여 다른 프로그램과 상호작용할 수 있다. API는 시스템 콜을 추상화하여, 보다 쉽게 사용할 수 있도록 만든 것이다.

 시스템 콜과 API는 서로 다른 개념이지만, API는 시스템 콜을 사용하여 구현될 수 있다. 즉, API는 시스템 콜의 추상화된 버전이다.

System Call Parameter Passing

 종종 시스템 호출 식별보다 더 많은 정보가 필요하며 정보의 종류와 양은 OS와 시스템 콜에 따라 다르다. OS에 매개변수를 전달하는 세 가지 일반적인 방법이 있다.

  • 레지스터의 매개변수를 전달한다.
  • 메모리의 테이블에 매개변수를 저장한 다음 테이블의 주소를 레지스터에 전달한다. e.g. Linux and Solaris
  • 프로그램에 의해 스택에 매개변수를 푸시하고 OS에 의해 스택에서 꺼낸다.

Types of System Calls

  • 프로세스 제어(Process control)
    create/terminate, load/execute, wait/signal event
    E.g. fork(), execve(), getpid(), signal(), …
  • 파일 조작(File management)
    create/delete, open/close, read/write
    E.g. open(), read(), write() close(), …
  • 장치 관리(Device management)
    allocate memory
    E.g. brk(), …
  • 정보 유지 보수(Information maintenance)
    get/set timer or date, get/set process, file, or device attributes
    E.g. time()
  • 통신(Communications)
    create/delete connection, send/receive message
    E.g. socket(), bind(), connect(), …

Operating System Design and Implementation

 OS설계는 하드웨어 및 시스템 유형 선택에 의해 영향을 받아 설계가 어렵지만, 근본적으로 사용자 목적과 시스템 목적의 두 가지 기본 그룹으로 나눌 수 있다. 사용자 목적(User’s view)사용하기 편리하고, 쉽고, 신뢰할 수 있고, 안전하고, 빨라야 한다시스템 목적(System’s view)에서는 설계, 구현 및 유지 관리 보수가 쉬워야 하고 신뢰할 수 있으며 오류가 없고 효율적이어야 한다.

Mechanism &  Policy

 OS의 중요한 원칙 중 하나가 기법(mechanism)정책(Policy)을 분리하는 것이다. 기법은 어떤 일을 어떻게 할 것인가를 결정하는 것이고, 정책은 무엇을 할 것인가를 결정하는 것이다. 예를 들어, 타이머 구조는 CPU 보호를 보장하기 위한 기법이지만, 특정 사용자를 위해 타이머를 얼마나 오랫동안 설정할지를 결정하는 것은 정책적 결정이다.

 정책과 기법의 분리는 융통성을 위해 아주 중요하다. 즉, 여러 정책에서 사용되기에 충분한 융통성 있는 일반적인 기법이 더 바람직하다. 그 예로 특정 유형의 프로그램에 우선순위를 부여하는 기법을 지원한다. 만약 기법이 정책으로부터 적절하게 분리되면, I/O 집약적인 프로세스가 CPU 집약적인 프로세스보다 우선순위가 높은 정책을 지원하거나 그 반대 정책을 지원할 수 있다.

구현(Implementation)

 초창기에는 어셈블리 언어로 작성되었다.(MS-DOS -> 인텔 8088 어셈블리 언어) 현재는 주로 C, C++와 같은 고급 언어로 작성된다.(Linux, Windows) 어셈블리어에 비해 속도도 느리고 대용량 저장 공간이 필요하지만, 쓰기 쉽고 휴대성이 높기에 고급언어가 사용된다. 무엇보다 OS 성능에서 어셈블리 언어 구현보다 데이터 구조와 알고리즘이 중요하다.(메모리 관리, CPU 스케줄링 등)


운영 체제 구조

Simple structure(Monolithic Structure)

 운영체제를 구성하는 가장 간단한 구조는 구조가 아예 없는 것이다. 즉, 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것이다. 이 모놀리식 구조는 운영체제를 설계하는 일반적인 기술이다. 이 구조에서는 인터페이스와 기능 수준이 잘 분리되어 있지 않고 애플리케이션은 I/O 루틴에 직접 액세스 할 수 있다. 하지만, 응용 프로그램이 실패하면 전체 시스템 충돌이 발생할 수 있다. E.g. MS-DOS, 초기 유닉스

 이 구조는 커널의 단순성에도 불구하고 구현 및 확장하기 어렵다. 그러나 모놀리식 커널은 성능 면에서 뚜렷한 이점이 있다. 시스템 콜 인터페이스에는 오버헤드가 거의 없고 커널 안에서의 통신 속도가 빠르다. 따라서 이 주고의 단점에도 불구하고, 속도와 효율성은 이 구조를 UNIX, Linux, Windows에서 발견할 수 있다.

Layered structure

 시스템의 한 부분을 변경하면 다른 부분에 광범위한 영향을 줄 수 있으므로 줄 수 있으므로 모놀리식 접근법은 밀접하게 결합된 시스템으로 불린다. 대안으로 느슨하게 결합된 시스템을 설계할 수 있다. 이러한 시스템은 기능이 특정 기능을 가진 개별적이며 작은 구성요소로 나뉜다. 즉, 이러한 방식으로 다양한 모듈화 될 수 있다. 한 가지 방식이 계층적 접근 방식(Layered structure)인데 이 방식에서는 운영체제가 여러 개의 층(layer, level)으로 나누어진다. 맨 아래 계층(계층 0)은 하드웨어, 최상위 계층(계층 N-1)은 사용자 인터페이스이다. 디버그 하기는 쉽지만 레이어를 정의하기 어렵고 효율적이지 않다.

Microkernel structure

 모든 중요치 않은 구성요소를 커널로부터 제거하고, 그들을 별도의 주소 공간에 존재하는 사용자 수준 프로그램으로 구현하여 운영체제를 구성하는 방법이다. 마이크로커널의 주 기능은 사용자 공간에서 수행되는 다양한 서비스 간에 통신을 제공하는 것이다. (E.g. 파일 서버를 통한 파일 액세스 마이크로커널 접근법의 장점은 운영체제를 확장하기 쉽다는 것이다. 마이크로커널은 서비스 대부분이 커널이 아니라 사용자 프로세스로 수행되기 때문에 높은 보안성과 신뢰성을 제공한다. 하지만사용자 모듈과 커널 간의 빈번한 통신으로 인해 성능 저하된다.

 E.g. Mach, QNX, Window NT

Module structure

 대부분의 최신 운영 체제는 커널을 모듈로 구현한다. 객체 지향 접근 방식을 사용한다. 각 핵심 구성 요소는 분리되어 있고 각각은 알려진 인터페이스를 통해 서로 대화한다. 또한, 각각 필요에 따라 커널에 로드된다. E.g. Solaris, Linux, Mac OS X


System boot

 커널을 적재(load)하여 컴퓨터를 시작하는 과정을 시스템 부팅이라고 한다. 시스템 대부분에서 부팅 과정은 다음과 같다. 시스템 진잔 및 초기화를 담당하는 부트스트랩 프로그램 또는 부트 로더가 커널의 위치를 찾는다. 커널이 메모리에 적재되고 시작된다. 커널은 하드웨어를 초기화한다. 루트 파일 시스템이 마운트 된다.

 소규모 시스템에서는 부트로더와 OS를 ROM에 저장한다. 대규모 시스템(예: PC) 부트로더는 ROM에, OS는 디스크에 각각 저장한다. 대규모 시스템은 부트 블록의 단순 부트로더 -> 복잡한 부트로더 -> 커널순으로 접근해 로드한다.


핵심

  • Microsoft Windows, Apple Mac OS 및 Linux와 같은 최신 운영 체제는 CLI(Command Line Interface와 GUI(Graphic User Interface)를 모두 제공한다.
  • System call은 프로세스와 운영 체제 간의 인터페이스이며 프로세스가 운영 체제에서 서비스를 요청하는 방법을 제공한다.
  • 애플리케이션 프로그래머는 시스템 호출보다 API 사용 방법을 이해해야 한다.
  • 최신 운영 체제는 C 또는 C++와 같은 고급 언어로 작성된다.

주섬주섬

 학문적인 부분을 공부하다 보면 특정 용어들이 한국어로 온전히 표현하기 모호한 부분들이 있다. 그렇기에 영어와 한국어를 동시에 사용하거나, 한국어 혹은 영어만을 사용하여 글을 쓰다 보니 읽는 데 거부감이 있겠지만, 익숙해지길 바란다. 깊이 공부하기 위해서는 영어는 불가피하고 실제로 이와 관련한 이야기할 때 누구는 영어를 다른 누구는 한국어로 같은 용어를 말하지만 이해하지 못할 때도 있기 때문이다.

참고

 

Operating System Structure - javatpoint

Operating System Structure with OS Tutorial, Types of OS, Process Management, Attributes of a Process, CPU Scheduling, FCFS with overhead, FCFS Scheduling etc.

www.javatpoint.com

 

반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

OS 6. 동기화 도구(Synchronization Tools)  (0) 2023.04.06
OS 5. CPU 스케줄링  (0) 2023.04.06
OS 4. Threads& Concurrency  (0) 2023.04.05
OS 3. 프로세스 관리  (0) 2023.04.04
OS 1.기본개념  (0) 2023.04.02

댓글