Computer Science/운영체제

[운영체제] 02. Operating System Structures

lumana 2024. 6. 18. 16:34

운영체제 서비스 (Operating System Services)

운영체제는 사용자에게 다음과 같은 서비스를 제공

  • 사용자 인터페이스(User Interface)
    • 명령어 인터페이스 (CLI), 그래픽 사용자 인터페이스 (GUI)
  • 프로그램 실행(Program execution)
    • 프로그램을 메모리에 로드, 실행, 종료
  • I/O 작업(I/O operation)
    • 키보드/마우스 입력, 모니터/프린터 출력
  • 파일 시스템 조작(File system manipulation)
    • 파일 또는 디렉토리 읽기/쓰기, 생성/삭제/검색 등
  • 통신(Communications)
    • 프로세스 간 정보 교환
  • 오류 검출(Error detection)
    • 하드웨어 (메모리 오류, power failure)
    • I/O 장치 (네트워크 연결 실패, 프린터 용지 부족)
    • 사용자 프로그램 (산술 오버플로우, 불법 메모리 접근)

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

  • 자원 할당(Resource allocation)
    • 다중 사용자(multi-users) 또는 다중 작업(multi-tasking)을 위한
    • CPU 사이클, 메모리, 파일 저장소, I/O 장치
  • Accounting
    • 어떤 사용자가 얼마나 많은 자원을 사용하는지
  • 보호 및 보안(Protection and security)
    • 보호(Protection)
      • 시스템 자원(system resource) 접근 제어
    • 보안(security)
      • 사용자 인증(user authentication)
      • 잘못된 접근 시도로부터 방어

운영체제 사용자 인터페이스 (Operating System User Interface)

명령어 인터페이스 (CLI)

  • 키보드 기반 인터페이스
    • 사용자로부터 명령을 가져와 실행
    • 명령 해석기(command interpreter)라고도 함
    • 예: bash, csh 등
  • 명령어 구현
    • 쉘 내의 내장 명령어
      • 예: cd, alias 등
    • 별도 프로그램
      • 예: ls, vi 등
  • 사용자는 명령어를 암기해야 함

그래픽 사용자 인터페이스 (GUI)

  • 마우스 기반 인터페이스
  • 사용자 친화적인 인터페이스 제공
    • 창 및 메뉴 시스템
    • 아이콘이 파일, 프로그램, 동작 등을 나타냄

CLI vs. GUI

  • 선택은 개인 취향에 따라 다름
  • 현대 운영체제는 두 인터페이스를 모두 제공
    • Microsoft Windows
    • Apple Mac OS X
    • Solaris
    • Linux

System Calls

System call

  • 운영체제에서 제공하는 인터페이스
  • 프로그램이 운영체제로부터 서비스를 요청하는 방법
    • 예: 하드 디스크 접근
    • 예: 새로운 프로세스 생성 및 실행
  • 프로세스와 운영체제 간의 중요한 인터페이스 제공
  • 일반적으로 고급 언어(C 또는 C++)로 작성됨

 

 

ex) 한 파일의 내용을 다른 파일로 복사

  • input 파일 이름 획득
    • 화면에 프롬프트 작성
    • input 수락
  • output 파일 이름 획득
    • 화면에 프롬프트 작성
    • input 수락
  • input 파일 열기
    • 파일이 존재하지 않으면 중단
  • output 파일 생성
    • 파일이 존재하면 중단
  • 루프
    • input 파일에서 읽기
    • output 파일에 쓰기
    • 읽기 실패 시까지 반복
  • output 파일 닫기
  • 화면에 완료 메시지 작성
  • 정상 종료

API (Application Program Interface)

  • 애플리케이션 프로그램 인터페이스 (API)
    • 애플리케이션 프로그래머에게 제공되는 함수 집합
    • 세 가지 주요 API
      • Windows용 Win32 API
      • POSIX 기반 시스템(UNIX/Linux)용 POSIX API
      • Java 가상 머신용 Java API
    • System call 대신 API를 사용하는 이유?
      • 이식성(Portability)
      • 사용 용이성(Easy to use)
  •  프로그래머는 system call 구현을 알 필요가 없음
    • API를 따르고 운영체제가 무엇을 할지 이해하기만 하면 됨
    • 운영체제의 세부 사항은 API에 의해 프로그래머로부터 숨겨짐

시스템 호출 vs. API

 

 

System call handling

ex) fork() 시스템 콜 호출 (i386-linux system)

 

System Call Parameter Passing(System Call 매개변수 전달)

System Call identification보다 더 많은 정보가 종종 필요합니다.

  • 예: open("/etc/passwd", O_RDONLY);
  • 예: read(3, buf, 4096);
  • OS와 시스템 호출에 따라 정보의 유형과 양이 다릅니다.

OS에 매개변수를 전달하는 세 가지 방법

  • 레지스터(register)에 매개변수를 전달합니다.
  • 매개변수를 메모리의 테이블에 저장한 다음 레지스터에 테이블 주소를 전달합니다.
    • 예: 리눅스와 솔라리스(Linux and Solaris)
  • 프로그램이 매개변수를 스택(stack)에 푸시(push)하고 OS가 스택에서 팝(pop)합니다.

매개변수를 테이블을 통해서 전달

Types of System Calls

  • 프로세스 제어 (Process control)
    • 생성/종료, 로드/실행, 대기/신호 이벤트
    • 예: fork(), execve(), getpid(), signal(), ...
  • 파일 관리 (File management)
    • 생성/삭제, 열기/닫기, 읽기/쓰기
    • 예: open(), read(), write(), close(), ...
  • 메모리 관리 (Memory management)
    • 메모리 할당
    • 예: brk(), ...
  • 정보 유지 (Information maintenance)
    • 타이머 또는 날짜 설정/획득, 프로세스, 파일, 또는 장치 속성 설정/획득
    • 예: time()
  • 통신 (Communications)
    • 연결 생성/삭제, 메시지 송수신
    • 예: socket(), bind(), connect(), ...

Operating System Design and Implementation(운영 체제 설계 및 구현)

설계 목표 (Design goals)

  • 하드웨어와 시스템 유형 선택
    • batch, time sharing, 단일/다중 사용자, 분산, real-time
  • 요구 사항
    • 사용자 관점
      • 사용하기 편리하고, 쉽고, 신뢰할 수 있으며, 안전하고, 빠름
    • 시스템 관점
      • 설계, 구현 및 유지 관리가 쉬움
      • 유연하고, 신뢰할 수 있으며, 오류가 없고, 효율적임

정책(policy)과 메커니즘(mechanism)의 분리

  • 메커니즘 (Mechanism): 어떻게 할 것인가?
    • CPU 보호를 위한 타이머 구성
    • 세금을 통한 사회 갈등 해소
  • 정책 (Policy): 무엇을 할 것인가?
    • 타이머를 얼마나 오랫동안 설정해야 하는지?
    • 빈민층에 세금 감면, 고소득자에게 특별세금 부과
  • 또 다른 예
    • 특정 프로그램 유형에 우선순위(priority)를 부여하는 메커니즘
    • I/O 집약적인 프로세스(I/O intensive process)가 CPU 집약적인 프로세스(CPU Intensive process)보다 우선 순위가 높은 정책

구현 (Implementation)

  • 초기에는 어셈블리 언어로 작성되었습니다.
    • MS-DOS -> 인텔 8088 어셈블리 언어
  • 현재는 C, C++와 같은 고급 언어로 작성됩니다.
    • 리눅스, 윈도우
    • 속도 감소, 큰 저장 공간 요구, 작성하기 쉬움, 높은 이식성
  • 운영 체제의 성능
    • 어셈블리 언어 구현보다 자료 구조와 알고리즘이 중요합니다.
      • 메모리 관리, CPU 스케줄링 등

Operating System Structures

단순 구조 (Simple structure)

  • Interface와 levels of functionality가 잘 분리되지 않았음
  • 애플리케이션이 I/O 루틴에 직접 접근할 수 있음
  • 애플리케이션 실패 시 시스템 전체가 충돌할 수 있음
    • 예: MS-DOS, 초기 유닉스

계층 구조 (Layered structure)

  • OS는 여러 Layer로 나뉩니다.
    • 가장 낮은 layer (layer 0)는 하드웨어입니다.
    • 가장 높은 layer (layer N-1)는 사용자 인터페이스입니다.
    • 디버깅이 쉽지만 Layer 정의가 어렵고 비효율적입니다.

마이크로커널 구조 (Microkernel structure)

  • 커널에서 "사용자" 공간으로 가능한 많은 것을 이동합니다.
  • 사용자 모듈 간 메시지 전달을 통한 통신
    • 예: 파일 서버를 통한 파일 접근
  • 확장 및 포팅이 쉬움
  • 신뢰할 수 있고 보안이 높음 (커널 모드에서 실행되는 코드가 적음)
  • 성능 저하
    • 사용자 모듈과 커널 간의 빈번한 통신 때문이다.
    • 예: Mach, QNX, Windows NT

모듈 구조 (Module structure)

  • 대부분의 현대 운영 체제는 커널을 모듈로 구현합니다.
  • 객체 지향 접근 방식을 사용합니다.
  • 각 핵심 구성 요소는 분리되어 있습니다.
  • 각 구성 요소는 알려진 인터페이스를 통해 서로 통신합니다.
  • 필요에 따라 커널에 로드됩니다.
    • 예: 솔라리스, 리눅스, 맥 OS X

시스템 부팅(System boot)

  • 커널을 어떻게 로드하나요?
    • 부트로더(Bootloader)
      • 진단 실행, 시스템 초기화.
      • 커널을 찾아 메모리에 로드하고 시작합니다.
    • Small system
      • 부트로더와 운영 체제를 ROM에 저장합니다.
    • Large system (예: PC)
      • 부트로더를 ROM에, 운영 체제를 디스크에 각각 저장합니다.
      • boot block에 간단한 bootloader ➔ 복잡한 bootloader ➔ kernel

System Boot in Linux

  • 리눅스 기반 PC 부팅 과정