os_chapter2

bells!·2024년 3월 24일

os

목록 보기
3/5

Operating System Services

운영 체제는 프로그램 실행 환경을 제공하고 프로그램 및 사용자에게 다양한 서비스를 제공합니다.

사용자를 위한 서비스

사용자 인터페이스(User Interface): 사용자가 시스템과 상호작용할 수 있게 하는 인터페이스를 제공합니다. 이는 명령 줄 인터페이스(CLI) 또는 그래픽 사용자 인터페이스(GUI) 형태일 수 있습니다. 프로그램 실행(Program Execution): 사용자와 시스템 프로그램을 메모리에 로드하고 실행할 수 있게 합니다. 입출력 작업(I/O Operations): 파일이나 I/O 장치에 대한 입력과 출력을 관리합니다. 파일 시스템 조작(File-System Manipulation): 파일 생성, 삭제, 읽기, 쓰기, 목록 보기 등 파일 시스템에 대한 다양한 작업을 수행할 수 있게 합니다. 통신(Communications): 프로세스 간 통신(IPC)을 통해 데이터의 교환을 지원합니다. 이는 메모리나 네트워크를 통해 이루어질 수 있습니다. 오류 감지(Error Detection): 하드웨어와 소프트웨어 오류를 감지하고, 적절한 조치를 취할 수 있게 합니다.

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

자원 할당(Resource Allocation): CPU 시간, 메모리 공간 등의 컴퓨터 자원을 여러 프로세스나 사용자 간에 효율적으로 할당합니다. 로그 기록(Logging): 시스템 운영에 관한 중요한 정보를 기록하여, 문제 해결이나 성능 모니터링에 활용합니다. 보호 및 보안(Protection and Security): 시스템을 무단 접근이나 공격으로부터 보호하고, 사용자의 데이터와 자원을 안전하게 관리합니다.

운영 체제는 이러한 서비스와 기능을 통해 하드웨어를 추상화하고, 사용자와 애플리케이션에 고수준의 인터페이스를 제공합니다. 이를 통해 사용자는 복잡한 하드웨어 세부 정보에 대해 걱정하지 않고, 컴퓨터 시스템을 보다 쉽고 효율적으로 사용할 수 있습니다.

사용자 인터페이스: CLI(Command Line Interface)

명령 줄 인터페이스 또는 명령 해석기 : 사용자로부터 직접 명령을 입력받아 실행 가능

  • 때로는 커널(kernel)에 구현되기도 하고, 시스템 프로그램(systems program)에 의해 구현되기도 합니다.
  • 때때로 여러 가지 형태(flavors)의 CLI가 구현되기도 하는데, -> shells
  • 주로 사용자로부터 명령을 가져와 실행하는 것이 기본 기능입니다.
  • 명령어는 때로 내장되어 있기도 하고, 때로는 프로그램의 이름일 뿐이기도 합니다.

사용자 인터페이스: GUI(Graphical User Interface)

사용자 친화적인 데스크탑 메타포 인터페이스

  • 일반적으로 마우스, 키보드, 모니터를 사용합니다.
  • 아이콘은 파일, 프로그램, 작업 등을 나타냅니다.
  • 인터페이스 상의 객체들 위에서 다양한 마우스 버튼을 사용하면 다양한 작업이 실행됩니다(정보 제공, 옵션 제공, 기능 실행, 디렉토리(폴더라고도 함) 열기).

GUI는 사용자가 시스템과 상호작용할 수 있게 하는 직관적이고 시각적인 방법을 제공합니다. 사용자는 텍스트 명령어를 직접 입력하는 대신, 마우스나 다른 포인팅 장치를 사용하여 아이콘, 버튼, 메뉴 등의 그래픽 요소를 클릭하거나 선택함으로써 작업을 수행할 수 있습니다. 이는 컴퓨터를 사용하는 데 있어서의 학습 곡선을 낮추고, 더 폭넓은 사용자층이 컴퓨터와 상호작용할 수 있게 만들어줍니다.

사용자 인터페이스: 터치스크린 인터페이스

터치스크린 장치는 새로운 형태의 인터페이스를 요구합니다.
마우스 사용이 불가능하거나 원치 않는 경우가 많습니다.
동작 및 선택은 제스처 기반으로 이루어집니다.
텍스트 입력을 위한 가상 키보드가 제공됩니다.
음성 명령(+AI) 기능이 있습니다.


System Calls

System Calls : 운영 체제가 제공하는 서비스에 대한 인터페이스를 제공

  • "인터럽트를 통해 OS 커널에 가능한 함수 호출"로 설명될 수 있습니다.
  • 일반적으로 C/C++ 또는 어셈블리로 작성된 인터럽트 핸들러로 제공됩니다.
  • 더 낮은 권한 모드에서 더 높은 권한 모드로 안전하게 제어를 전달하는 메커니즘입니다.
  • 대부분의 프로그램은 직접적인 시스템 호출 사용보다는 고수준의 애플리케이션 프로그래밍 인터페이스(API)를 통해 접근합니다.

시스템 호출은 사용자 모드에서 실행되는 응용 프로그램이 운영 체제의 커널 모드 기능을 안전하게 사용할 수 있도록 하는 중요한 인터페이스입니다. 이는 파일 시스템 조작, 프로세스 관리, 네트워크 통신 등 운영 체제의 핵심 기능에 접근할 수 있게 해줍니다.

시스템 호출의 사용은 운영 체제의 보안과 안정성을 유지하는 데 중요한 역할을 합니다. 운영 체제는 시스템 호출을 통해 요청된 작업이 유효하고 안전한지 검사할 수 있으며, 필요한 권한이 있는지 확인할 수 있습니다. 이를 통해 무분별한 자원 접근이나 잘못된 작업 요청으로부터 시스템을 보호할 수 있습니다.
-> 간단히 말해서, System Calls는 interrupt를 발생한 경우, kernel mode로 바꿔주는 것

Dual-mode operation

  • 이중 모드 운영은 운영 체제의 보안과 안정성을 유지하기 위한 중요한 메커니즘입니다. 이는 사용자 모드(User Mode)와 커널 모드(Kernel Mode)의 두 가지 모드로 구분됩니다.

User Mode

- 사용자 정의 코드(애플리케이션)가 실행됩니다. - 시스템에 해를 끼칠 수 있는 특권 명령(Privileged Instructions)의 사용이 금지됩니다. - 특권 명령은 운영 체제의 시스템 호출을 통해서만 호출될 수 있습니다. 이는 애플리케이션 코드가 직접적으로 시스템의 핵심 부분에 접근하거나 변경하는 것을 방지합니다.

Kernel Mode

- 운영 체제 코드가 실행됩니다. 시스템 호출이 이루어질 때, 운영 체제는 커널 모드로 전환됩니다. - 특권 명령이 허용됩니다. 커널 모드에서는 운영 체제가 시스템의 핵심 자원에 접근하고 관리할 수 있으며, 필요한 시스템 작업을 수행할 수 있습니다. - 이러한 이중 모드 운영의 목적은 시스템의 안전과 보안을 유지하는 것입니다.

정리) 사용자 모드에서는 제한된 권한으로 코드가 실행되어, 시스템 전체에 영향을 미칠 수 있는 위험한 작업을 방지합니다. 반면, 커널 모드에서는 운영 체제가 시스템의 전반적인 관리와 제어를 할 수 있으며, 이를 통해 하드웨어와 시스템 자원을 효율적으로 관리할 수 있습니다.

시스템 호출은 이 두 모드 사이의 중요한 다리 역할을 하며, 사용자 애플리케이션이 필요한 시스템 자원과 서비스에 안전하게 접근할 수 있게 해줍니다. 운영 체제는 시스템 호출을 통해 전달된 요청을 검증하고, 적절한 작업을 수행한 후 결과를 애플리케이션에 반환합니다.

밑의 그림은 중요!

시스템 호출 구현 (System Call Implementation)

시스템 호출 구현은 운영 체제(OS)의 핵심적인 부분
-> 사용자 프로그램이 커널 모드에서 실행되는 운영 체제의 기능을 안전하게 이용할 수 있게 해줌.

과정

  1. 시스템 호출 식별
  • 각 시스템 호출은 고유 번호로 식별됩니다. 이 번호는 시스템 호출 인터페이스가 관리하는 테이블에 인덱스로 사용됩니다.
  1. 시스템 호출 인터페이스
  • 시스템 호출 인터페이스는 시스템 호출의 식별 번호를 사용하여 해당 시스템 호출을 찾고, OS 커널에서 실행시킨 후, 시스템 호출의 상태와 반환 값(있는 경우)을 반환합니다.
  1. 커널 모드로의 전환
  • 시스템 호출이 실행되기 위해서는, 사용자 모드에서 실행 중인 프로세스가 커널 모드로 전환되어야 합니다. 이를 위해, 인터럽트나 트랩 같은 메커니즘이 사용됩니다.
  1. 데이터 전달
  • 시스템 호출에 필요한 정보는 커널 모드로 전달됩니다. 이 정보는 시스템 호출의 매개변수로 전달되며, 커널이 이를 이용하여 요청된 작업을 수행합니다.
  1. 실행 및 반환
  • 커널 모드에서 시스템 호출에 대한 데이터 처리와 실행 준비가 완료되면, 실제 시스템 호출이 실행됩니다. 실행이 완료되면, 결과가 사용자 모드로 반환되며, 프로세스는 사용자 모드로 다시 전환됩니다.

프로그래머는 시스템 호출이 어떻게 구현되어 있는지 알 필요가 없습니다. 대신, 프로그래머는 시스템 호출 API를 사용하는 방법과 OS가 시스템 호출 결과로 무엇을 할 것인지를 이해해야 합니다. 대부분의 OS 인터페이스 세부 사항은 프로그래머로부터 API에 의해 숨겨져 있습니다. 이러한 추상화는 프로그래머가 복잡한 내부 메커니즘에 대해 걱정하지 않고 OS 기능을 쉽게 사용할 수 있게 해줍니다.

시스템 호출과 프로그래밍 언어의 I/O 함수의 차이점

-> 두 가지 예시(write() vs. printf() 그리고 read() vs. fread())를 통해 설명

  1. write() vs. printf()
  • write()는 운영 체제에 의해 제공되는 시스템 호출입니다. 이 함수는 파일 기술자, 버퍼의 주소, 그리고 쓸 바이트의 수를 매개변수로 받아 해당 데이터를 파일이나 다른 출력 스트림에 직접 씁니다. write()는 낮은 수준의 출력 기능을 제공하며, 버퍼에 저장된 데이터를 변경하지 않고 그대로 출력합니다.
  • printf()는 C 언어에서 정의된 표준 함수입니다. 이 함수는 형식 지정자를 사용하여 변수의 값을 문자열로 변환하고, 변환된 문자열을 표준 출력(stdout)에 출력합니다. printf()는 내부적으로 write() 시스템 호출을 사용하여 데이터를 출력합니다. 하지만 printf()는 사용자에게 보다 고수준의 인터페이스를 제공하며, 데이터를 형식화하고 문자열을 조작하는 추가적인 기능을 가집니다.
  1. read() vs. fread()
  • read()는 파일 기술자를 통해 데이터를 읽는 운영 체제의 시스템 호출입니다. 이 함수는 지정된 파일 기술자로부터 최대 지정된 바이트 수만큼 데이터를 읽어서 주어진 버퍼에 저장합니다. read()는 낮은 수준의 입력 기능을 제공하며, 파일로부터 직접 데이터를 읽습니다.

  • fread()는 C 언어의 표준 입출력 라이브러리에 정의된 함수입니다. 이 함수는 파일 스트림으로부터 데이터를 읽으며, read() 시스템 호출을 내부적으로 사용합니다. fread()는 사용자에게 보다 고수준의 인터페이스를 제공하며, 데이터를 읽을 때 추가적인 버퍼링과 처리를 수행합니다.

결론적으로, 시스템 호출(write(), read())은 운영 체제가 제공하는 낮은 수준의 기능을 직접 사용하는 반면, 프로그래밍 언어의 I/O 함수(printf(), fread())는 이러한 시스템 호출을 기반으로 하면서도 보다 사용하기 쉬운 고수준의 인터페이스를 제공합니다. 프로그래머는 작업의 요구 사항에 따라 적절한 수준의 함수를 선택하여 사용할 수 있습니다.

System Call Parameter Passing

Parameter passing methods

  1. 레지스터를 사용한 전달 (간단한 정보)
    가장 기본적이고 빠른 방법 중 하나입니다. 시스템 호출에 필요한 매개변수가 간단하거나 소량일 때, 이들 매개변수를 직접 CPU의 레지스터에 저장하여 전달할 수 있습니다. 이 방식의 장점은 매개변수 접근 속도가 매우 빠르다는 것입니다. 하지만, 한정된 수의 레지스터로 인해 전달할 수 있는 매개변수의 수가 제한됩니다.

  2. 블록 주소를 사용한 전달 (대량의 정보)
    매개변수의 양이 많거나 구조가 복잡할 때는, 이 매개변수들을 메모리 내의 블록이나 테이블에 저장하고, 해당 블록의 주소만을 레지스터를 통해 전달합니다. 시스템 호출이 실행될 때, 커널은 이 주소를 참조하여 필요한 모든 매개변수를 얻습니다. 이 방법은 많은 양의 데이터를 전달할 수 있지만, 메모리 접근에 따른 추가적인 오버헤드가 발생할 수 있습니다.

  3. 시스템 스택을 사용한 전달
    매개변수를 시스템 스택에 넣거나(push) 스택에 배치하여 전달하는 방법입니다. 이 방식은 함수 호출 시 매개변수를 전달하는 전통적인 방법과 유사합니다. 프로세스의 스택 영역을 사용하여 매개변수를 저장하고, 시스템 호출 시 이들 매개변수를 스택에서 읽어들입니다. 스택을 사용하는 방법은 매개변수의 수가 가변적이거나 매우 많을 때 유용할 수 있으며, 레지스터만을 사용하는 방법보다 더 유연합니다. 하지만, 스택을 통한 접근은 레지스터 접근보다 느릴 수 있습니다.

블록 주소를 사용한 전달이나 시스템 스택을 사용한 전달 모두 정보량이 많을 때 사용하는데, 구지 차이를 두어야 할까?
: 두 방법은 모두 대량의 데이터를 전달할 때 사용되지만, 데이터를 저장하고 접근하는 메커니즘에서 차이가 있습니다. 블록 주소 방식은 메모리 내의 임의의 위치에 데이터를 유연하게 배치할 수 있는 반면, 시스템 스택 방식은 프로세스의 스택 영역을 사용하여 데이터를 순차적으로 관리합니다.


Types of System Calls and System Programs

System Programs

시스템 프로그램은 프로그램 개발과 실행을 위한 편리한 환경을 제공합니다. 이 프로그램들은 사용자와 운영 체제 간의 인터페이스 역할을 하며, 운영 체제의 기능을 보다 쉽게 사용할 수 있도록 도와줍니다. 시스템 프로그램은 다음과 같이 여러 범주로 나눌 수 있습니다:

  1. 파일 조작
  • 파일 및 디렉토리 생성, 삭제, 복사, 이름 변경, 출력, 덤프(dump), 목록화 등 일반적인 파일 조작 작업을 수행합니다. -> 사용자가 데이터를 효율적으로 관리할 수 있도록 도와줌.
  1. 상태 정보
  • 날짜, 시간, 시스템 정보, 성능 등의 시스템 상태 정보를 제공합니다. 이 정보는 시스템의 현재 상태를 이해하고, 문제 해결 및 성능 최적화에 도움을 줍니다.
  1. 프로그래밍 언어 지원
  • 컴파일러, 어셈블러, 디버거, 인터프리터 등 프로그래밍 언어의 사용을 지원하는 도구들입니다. 이 프로그램들은 개발자가 소프트웨어를 효과적으로 개발하고, 오류를 찾아 수정할 수 있도록 도와줍니다.
  1. 프로그램 로딩 및 실행
  • 로더, 링커지 에디터(linkage editors) 등 프로그램을 메모리에 로드하고 실행하는 데 필요한 도구들입니다. 이러한 프로그램은 실행 파일을 메모리에 올리고, 필요한 라이브러리나 모듈을 연결하는 과정을 관리합니다.
  1. 통신
  • 네트워크와 관련된 프로그램으로, 데이터 전송 및 통신 프로토콜을 관리합니다. 이를 통해 컴퓨터 간의 데이터 교환과 리소스 공유가 가능해집니다.

6.백그라운드 서비스

  • 부팅 시에 시작되며, 프로세스 스케줄링, 로깅 등 시스템의 배경에서 실행되는 서비스들입니다. 이러한 서비스는 시스템의 안정성과 효율성을 유지하는 데 중요한 역할을 합니다.
  1. 응용 프로그램
  • 사용자가 직접 실행하는 프로그램입니다. 이 범주는 텍스트 편집기, 웹 브라우저, 게임 등 다양한 사용자 지향 응용 프로그램을 포함합니다.

대부분의 사용자는 시스템 호출이 아닌 시스템 프로그램을 통해 운영 체제와 상호 작용합니다. 시스템 프로그램은 사용자에게 보다 직관적이고 친숙한 인터페이스를 제공하며, 복잡한 시스템 호출을 추상화하여 사용자의 작업을 단순화합니다. 따라서, 시스템 프로그램은 운영 체제의 사용성과 접근성을 크게 향상시키는 중요한 역할을 합니다.

응용 프로그램 바이너리 인터페이스(ABI)

ABI는 API의 아키텍처적 동등물로, 다른 구성 요소의 바이너리 코드가 주어진 운영 체제와 아키텍처, CPU 등에서 어떻게 상호 작용할지를 정의합니다. ABI는 응용 프로그램이 특정 운영 체제에서 올바르게 실행되기 위해 준수해야 하는 규칙과 규약을 제공합니다.

응용 프로그램이 운영 체제별로 특정되는 이유 : 기본적으로 운영 체제의 구현 차이 때문입니다. 그러나 다중 운영 체제를 지원하는 방법을 통해 이러한 문제를 해결하고 다양한 환경에서 응용 프로그램을 사용할 수 있게 할 수 있습니다. 이러한 접근법들은 소프트웨어 개발자들이 다양한 사용자 기반에 서비스를 제공할 수 있게 하며, 운영 체제 간의 호환성 문제를 최소화합니다.


Operating System Design and Implementation

운영 체제를 설계하고 구현하는 과정은 다음과 같은 단계들이 있다.

목표와 사양 정의
설계 과정은 운영 체제가 달성해야 할 목표와 사양을 명확히 정의하는 것으로 시작합니다. 이 목표는 시스템의 유형(예: 일반 목적, 실시간 시스템, 임베디드 시스템 등)과 선택된 하드웨어에 의해 영향을 받습니다.

사용자 목표와 시스템 목표
사용자 목표: 사용자는 운영 체제가 사용하기 편리하고, 배우기 쉽고, 신뢰할 수 있으며, 안전하고, 빠른 성능을 제공하기를 원합니다.
시스템 목표: 시스템 관점에서는 운영 체제가 설계, 구현, 유지 관리하기 쉽고, 유연하며, 신뢰할 수 있고, 오류가 없으며, 효율적인 시스템이 되어야 합니다.

설계 과정
설계 과정에서는 운영 체제의 주요 구성 요소와 그들 사이의 상호 작용을 결정합니다. 이 과정에서는 추상화, 캡슐화, 모듈화와 같은 소프트웨어 공학 원칙이 중요한 역할을 합니다.

구현
설계 단계 후, 구현 단계에서는 선택된 프로그래밍 언어를 사용하여 운영 체제의 구성 요소를 실제 코드로 변환합니다. 이 단계는 성능 최적화와 오류 검출을 포함한 다양한 시험을 필요로 합니다.

유지 관리
운영 체제는 출시 후에도 지속적인 유지 관리가 필요합니다. 이는 버그 수정, 성능 개선, 새로운 하드웨어 지원 추가 등을 포함합니다.
운영 체제의 설계와 구현은 복잡하고 계속 발전하는 과정입니다. 성공적인 운영 체제는 사용자와 시스템의 목표를 모두 만족시킬 수 있는 유연성과 확장성을 갖추고 있어야 합니다.

Policy: What to do it? , Mechanism: How to do it?


Operating System Structure

General-purpose OS is very large program

◼ Monolithic structure

◼ Layered approach

◼ Microkernel

◼ Modules

◼ Hybrid systems


System Boot

Booting

부팅 : 커널로 로딩됨으로써 컴퓨터가 실행되는 절차

Bootstrap program (bootstrap loader)

시스템 부팅 과정은 부트스트랩 프로그램, 또는 부트스트랩 로더로 시작됩니다. 이는 하드웨어가 가장 먼저 실행하는 작은 프로그램으로, 컴퓨터의 전원이 켜지면 ROM(읽기 전용 메모리)에 저장된 초기화 코드(POST, Power-On Self Test 등)를 실행한 후, 부트스트랩 로더가 실행됩니다.

과정

  1. 진단 실행
  • 부트스트랩 로더는 시스템의 기본적인 하드웨어 구성 요소들에 대한 자가 진단을 수행합니다. 이 과정에서 CPU, 메모리, 입력/출력 장치 등의 기본 하드웨어가 제대로 작동하는지 확인합니다.
  1. 시스템 초기화
  • 시스템의 주요 구성 요소들을 초기화합니다. 이에는 CPU 레지스터 설정, 장치 컨트롤러 초기화, 메모리의 일부 내용을 설정하는 작업이 포함됩니다.
  1. 커널 위치, 로드 및 시작
  • 부트스트랩 로더는 저장 장치(하드 드라이브, SSD 등)에서 운영 체제의 핵심 부분인 커널을 찾아 메모리로 로드합니다. 커널이 메모리에 성공적으로 로드되면, 컴퓨터의 제어를 커널에 넘겨 운영 체제가 시작됩니다.

<세부적>

  • 전원 초기화 시 고정 메모리 위치에서 실행 시작

    • 컴퓨터의 전원이 켜지면, CPU는 사전에 정의된 고정 메모리 위치에서 실행을 시작합니다. 이 위치는 펌웨어 ROM에 저장된 초기 부트 코드가 위치하는 곳입니다.
  • 펌웨어 ROM과 초기 부트 코드

    • 펌웨어 ROM은 부팅 과정을 시작하기 위한 초기 코드를 저장하고 있습니다. 이 초기 부트 코드는 시스템을 초기화하고, 운영 체제를 로드하기 위한 다음 단계로 넘어가기 위한 기본적인 작업을 수행합니다.
  • 운영 체제를 하드웨어에 사용 가능하게 만들기

    • 하드웨어가 운영 체제를 시작할 수 있도록, 운영 체제는 하드웨어에서 접근 가능한 방식으로 제공되어야 합니다. 이는 펌웨어에 의해 운영 체제의 부트 블록을 로드하는 과정을 통해 이루어집니다.
  • 부트스트랩 로더와 OS의 부트 블록

    • 펌웨어 내의 부트스트랩 로더는 운영 체제의 부트 블록을 로드합니다. 부트 블록은 운영 체제를 전체적으로 로드하는 데 필요한 복잡한 부트 프로그램이거나, 부트스트랩 프로그램의 나머지 부분에 대한 간단한 코드와 정보를 포함할 수 있습니다.
  • GRUB과 같은 일반적인 부트스트랩 로더

    • GRUB(GRand Unified Bootloader)와 같은 일반적인 부트스트랩 로더는 여러 디스크, 버전, 커널 옵션 중에서 커널을 선택할 수 있는 기능을 제공합니다. 이를 통해 사용자는 다양한 운영 체제 환경 중에서 원하는 환경을 선택할 수 있습니다.
  • 커널 로드와 시스템 실행

    • 선택된 커널이 로드되면, 시스템은 운영 체제의 제어 하에 들어가게 되며 이때부터 시스템이 작동 상태에 있게 됩니다. 커널은 시스템의 모든 하드웨어와 소프트웨어 리소스를 관리하며, 사용자 및 애플리케이션과의 인터페이스 역할을 합니다.

profile
bell!

0개의 댓글