운영체제 구조

Hee Suh·2024년 11월 5일
0

[CS] OS

목록 보기
2/2
post-thumbnail

🦖 Operating System Concepts 10th

PART ONE OVERVIEW
Chapter 2 Operating-System Structures

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

Figure 2.1** A view of operating system services.
Figure 2.1 A view of operating system services.

운영체제는 프로그램 실행 환경을 제공한다. 운영체제는 프로그램과 그 프로그램의 사용자에게 특정 서비스를 제공한다.

  • 사용자 인터페이스(user interface): 거의 모든 운영체제는 사용자 인터페이스(UI)를 제공한다. 가장 일반적인 형태는 그래픽 사용자 인터페이스(GUI)이며, 터치 스크린 인터페이스, 명령러 라인 인터페이스(CLI)가 있다.
  • 프로그램 수행(program execution): 시스템은 프로그램을 메모리에 적재해 실행한다.
  • 입출력 연산(I/O operation): 수행 중인 프로그램은 입출력을 요구할 수 있다. 효율과 보호를 위해, 사용자들은 통상 입출력 장치를 직접 제어할 수 없으며, 운영체제가 입출력 수행의 수단을 제공한다.
  • 파일 시스템 조작(file system manipulation): 프로그램은 파일을 읽고 쓰고, 이름에 의해 생성, 삭제, 검색을 할 수 있어야 하고, 파일의 정보를 열거할 수 있어야 한다. 또한 몇몇 프로그램은 파일 소유권에 기반을 둔 권한 관리를 이용하여 파일이나 디렉터리의 접근을 허가하거나 거부할 수 있게 한다. (e.g. chmod)
  • 통신(communication): 한 프로세스가 다른 프로세스와 정보를 교환해야 할 필요가 있는 여러 상황이 있다. 1) 동일한 컴퓨터에서 수행되고 있는 프로세스들 사이에서 통신을 하거나 2) 네트워크에 의해 함께 묶여 있는 서로 다른 컴퓨터 시스템상에서 수행되는 프로세스들 사이에서 통신이 수행된다. 통신은 공유 메모리(shared memory)를 통해서 구현될 수도 있고, 메시지 전달(message passing) 기법을 사용하여 구현될 수 있는데, 후자의 경우 정보의 패킷들이 운영체제에 의해 프로세스들 사이를 이동한다.
  • 오류 탐지(error detection): 운영체제는 모든 가능한 오류를 항상 감지하고 고칠 수 있어야 한다. CPU 및 메모리 하드웨어, I/O 장치 또는 사용자 프로그램에서 에러가 발생한다.

사용자에게 도움을 주는 것이 목적이 아니라 시스템 자체의 효율적인 동작을 보장하기 위한 운영체제 기능들도 존재한다. 다수의 프로세스가 사용하는 시스템에서는 프로세스들 간에 컴퓨터 자원을 공유하게 함으로써 효율성을 얻을 수 있다.

  • 자원 할당(resource allocation): 다수의 프로세스나 다수의 작업이 동시에 실행될 때, 그들 각각에 자원을 할당해 줘야 한다.
  • 기록 작성(logging): 어떤 프로그램이 어떤 종류의 컴퓨터 자원을 얼마나 많이 사용하는지를 추적할 수 있는 기록 관리는 회계(accounting, 사용자에게 청구서 요청) 또는 단순히 통계를 내기 위해 사용된다. 사용 통계는 컴퓨팅 서비스를 개선하기 위해 시스템을 재구성하고자 하는 시스템 관리자가 유용하게 사용할 수 있다.
  • 보호(protection)와 보안(security): 다중 사용자 컴퓨터 시스템 또는 네트워크로 연결된 컴퓨터 시스템에 저장된 정보의 소유자는 그 정보의 사용을 통제하길 원한다. 또한 서로 다른 여러 프로세스가 동시에 수행될 때, 한 프로세스가 다른 프로세스나 운영체제 자체를 방해해서는 안 된다. 보호는 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것을 필요로 한다. 보안은 네트워크 어댑터 등과 같은 외부 입출력 장치들을 부적합한 접근 시도로부터 지키고, 침입을 탐지하기 위해 모든 저복을 기록하는 것으로 범위를 넓힌다. 시스템이 보호되고 보안이 유지되려면, 시스템 전체에 걸쳐 예방책(precuation)이 제정되어야 한다.

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

사용자가 운영체제와 접촉(interface)하는 3가지 기본적인 방법이 있다. 한 방식은 명령어 라인 인터페이스(CLI) 또는 명령 인터프리터(command interpreter)를 제공하는 것이다. 이 명령어 라인 인터페이스는 사용자가 운영체제가 수행할 명령어를 직접 입력할 수 있도록 한다. 다른 두 가지 방식은 사용자가 그래픽 기반 사용자 인터페이스를 통하여 운영체제와 접촉하게 하는 것이다.

명령 인터프리터 (Command interpreter)

Command Line Interface(CLI) 또는 Command interpreter는 (shell)이라고 불린다.

다양한 셸이 제공되며, sh, bash, csh, zsh, tcsh 등이 있다.

명령 인터프리터의 중요한 기능은 사용자가 지정한 명령을 가져와서 그것을 수행하는 것이다. 이 수준에서 제공된 많은 명령은 파일을 조작한다.

그래픽 기반 사용자 인터페이스 (Graphical User Interface)

사용자 친화적인 그래픽 기반 사용자 인터페이스 또는 GUI 방식에서는 사용자가 CLI를 통하여 직접 명령어를 입력하는 것이 아니라, 데스크톱의 마우스를 기반으로 하는 윈도 메뉴 시스템을 사용한다.

macOS의 Aqua, Microsoft의 Windows, GNU 프로젝트의 GNOME 등의 GUI 인터페이스가 있다.

터치스크린 인터페이스 (Touch Screen Interface)

스마트폰 및 휴대용 태블릿 컴퓨터는 일반적으로 터치스크린 인터페이스를 사용한다. 사용자는 터치스크린에서 손가락을 누르거나 스와이프 하는 등의 제스처를 취하여 상호 작용한다.

Android UI나 Apple iPhone의 UI 등의 터치스크린 인터페이스가 있다.

시스템 호출 (System Calls)

시스템 콜은 운영체제에 의해 사용할 수 있는 서비스에 대한 인터페이스를 제공한다.

컴퓨터 시스템이 사용자 애플리케이션을 대신하여 실행 중인 경우 시스템은 사용자 모드(user mode)에 있다. 그러나 사용자 애플리케이션이 (system call을 통해) 운영 체제에 서비스를 요청하면 시스템은 요청을 이행하기 위해 사용자 모드에서 커널 모드(kernel mode)로 전환해야 한다.

**Figure 1.13** Transition from user to kernel mode.
Figure 1.13 Transition from user to kernel mode.

응용 프로그래밍 인터페이스 (Application Programming Interface)

대부분의 애플리케이션 개발자들은 응용 프로그래밍 인터페이스(application programming interface, API)에 따라 프로그램을 설계한다. API는 각 함수에 전달되어야 할 매개변수들과 프로그래머가 기대할 수 있는 반환 값을 포함하여 프로그래머가 사용 가능한 함수의 집합을 명시한다. 애플리케이션 프로그래머가 사용 가능한 가장 흔한 세 가지 API는 Windows API, POSIX API, Java API다. UNIX와 Linux 시스템에서 C 언어로 작성된 프로그램을 위해서 제공되는 라이브러리는 libc로 불린다.

API를 구성하는 함수들은 통상 애플리케이션 개발자를 대신하여 실제 시스템 콜을 호출한다. (e.g. UNIX wait()) 대부분의 POSIX와 Windows API는 UNIX, Linux 및 Windows 운영체제가 제공하는 고유의 시스템 콜과 유사하다.

// 표준 API의 예
#include <unistd.h>

// return value(ssize_t), function name(read), parameters(fd, buf, count)
ssize_t read(int fd, void *buf, size_t count)

실행시간 환경(run-time environement, RTE)은 시스템 콜을 처리하는 데 있어 중요한 요소다. RTE는 운영체제가 제공하는 시스템 콜에 대한 연결고리 역할을 하는 시스템 콜 인터페이스를 제공한다. 이 시스템 콜 인터페이스는 API 함수의 호출을 가로채어 필요한 운영체제 시스템 콜을 부른다.

운영체제 인터페이스에 대한 대부분의 자세한 내용은 API에 의해 프로그래머로부터 숨겨지고 RTE에 의해 관리된다.

**Figure 2.6** The handling of a user application invoking the open() system call.
Figure 2.6 The handling of a user application invoking the open() system call.

운영체제에 매개변수를 전달할 때 사용하는 세 가지 일반적인 방법이 있다.

  • 가장 간단한 방법은 매개변수를 레지스터 내에 전달하는 것이다.
  • 레지스터보다 더 많은 매개변수가 있는 경우에 매개변수는 메모리 내의 블록이나 테이블에 저장되고, 블록의 주소가 레지스터 내에 매개변수로 전달된다.
**Figure 2.7** Passing of parameters as a table.
Figure 2.7 Passing of parameters as a table.
  • 매개변수는 프로그램에 의해 스택(stack)에 넣어질(push) 수 있고, 운영체제에 의해 꺼내진다(pop off).

Cf. Linux는 위 두 개 접근법을 조합하여, 매개변수가 5개 이하면 레지스터가 사용되고 5개를 넘으면 블록 방법이 사용된다.

Cf. 블록이나 스택 방법은 전달되는 매개변수들의 개수나 길이를 제한하지 않기에 일부 운영체제에서 선호된다.

시스템 콜의 유형 (Types of System Calls)

시스템 콜은 여섯 가지의 주요 카테고리로 묶을 수 있다.

  • 프로세스 제어 (Process Control) fork(), exit(), wait()
    • create process, terminate process
    • load, execute
    • get process attributes, set process attributes
    • wait event, signal event
    • allocate and free memory
  • 파일 조작 (File management) open(), read(), write(), close()
    • create file, delete file
    • open, close
    • read, write, reposition
    • get file attributes, set file attributes
  • 장치 조작 (Device management) ioctl(), read(), write()
    • request device, release device
    • read, write, reposition
    • get device attributes, set device attributes
    • logically attach or detach devices
  • 정보 유지보수 (Information maintenance) getpid(), alarm(), sleep()
    • get time or date, set time or date
    • get system data, set system data
    • get process, file, or device attributes
    • set process, file, or device attributes
  • 통신 (Communications) pipe(), shm open(), mmap()
    • create, delete communication connection
    • send, receive messages
    • transfer status information
    • attach or detach remote devices
  • 보호 (Protection) chmod(), umask(), chown()
    • get file permissions
    • set file permissions

References

profile
원리를 파헤치는 것을 좋아하는 프론트엔드 개발자입니다 🏃🏻‍♀️

0개의 댓글