🦖 Operating System Concepts 10th
PART ONE OVERVIEW
Chapter 2 Operating-System Structures
Figure 2.1 A view of operating system services. |
운영체제는 프로그램 실행 환경을 제공한다. 운영체제는 프로그램과 그 프로그램의 사용자에게 특정 서비스를 제공한다.
chmod
)사용자에게 도움을 주는 것이 목적이 아니라 시스템 자체의 효율적인 동작을 보장하기 위한 운영체제 기능들도 존재한다. 다수의 프로세스가 사용하는 시스템에서는 프로세스들 간에 컴퓨터 자원을 공유하게 함으로써 효율성을 얻을 수 있다.
사용자가 운영체제와 접촉(interface)하는 3가지 기본적인 방법이 있다. 한 방식은 명령어 라인 인터페이스(CLI) 또는 명령 인터프리터(command interpreter)를 제공하는 것이다. 이 명령어 라인 인터페이스는 사용자가 운영체제가 수행할 명령어를 직접 입력할 수 있도록 한다. 다른 두 가지 방식은 사용자가 그래픽 기반 사용자 인터페이스를 통하여 운영체제와 접촉하게 하는 것이다.
Command Line Interface(CLI) 또는 Command interpreter는 셸(shell)이라고 불린다.
다양한 셸이 제공되며, sh, bash, csh, zsh, tcsh 등이 있다.
명령 인터프리터의 중요한 기능은 사용자가 지정한 명령을 가져와서 그것을 수행하는 것이다. 이 수준에서 제공된 많은 명령은 파일을 조작한다.
사용자 친화적인 그래픽 기반 사용자 인터페이스 또는 GUI 방식에서는 사용자가 CLI를 통하여 직접 명령어를 입력하는 것이 아니라, 데스크톱의 마우스를 기반으로 하는 윈도 메뉴 시스템을 사용한다.
macOS의 Aqua, Microsoft의 Windows, GNU 프로젝트의 GNOME 등의 GUI 인터페이스가 있다.
스마트폰 및 휴대용 태블릿 컴퓨터는 일반적으로 터치스크린 인터페이스를 사용한다. 사용자는 터치스크린에서 손가락을 누르거나 스와이프 하는 등의 제스처를 취하여 상호 작용한다.
Android UI나 Apple iPhone의 UI 등의 터치스크린 인터페이스가 있다.
시스템 콜은 운영체제에 의해 사용할 수 있는 서비스에 대한 인터페이스를 제공한다.
컴퓨터 시스템이 사용자 애플리케이션을 대신하여 실행 중인 경우 시스템은 사용자 모드(user mode)에 있다. 그러나 사용자 애플리케이션이 (system call을 통해) 운영 체제에 서비스를 요청하면 시스템은 요청을 이행하기 위해 사용자 모드에서 커널 모드(kernel mode)로 전환해야 한다.
Figure 1.13 Transition from user to kernel mode. |
대부분의 애플리케이션 개발자들은 응용 프로그래밍 인터페이스(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.7 Passing of parameters as a table. |
Cf. Linux는 위 두 개 접근법을 조합하여, 매개변수가 5개 이하면 레지스터가 사용되고 5개를 넘으면 블록 방법이 사용된다.
Cf. 블록이나 스택 방법은 전달되는 매개변수들의 개수나 길이를 제한하지 않기에 일부 운영체제에서 선호된다.
시스템 콜은 여섯 가지의 주요 카테고리로 묶을 수 있다.
fork()
, exit()
, wait()
open()
, read()
, write()
, close()
ioctl()
, read()
, write()
getpid()
, alarm()
, sleep()
pipe()
, shm open()
, mmap()
chmod()
, umask()
, chown()