オペレーティングシステム

情報システム概論 I 

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2005/2006-01-30
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

復習

CPU、メモリ、ディスプレイ、ディスク、キーボード、ネットワーク

図? ハードウェアの構成要素

目標

キーボードからの入力がプロセスに届くまでどのような要素動くのか理解する。

オペレーティングシステムとは

コンピュータを構成する「もの」

ソフトウェアは究極的には(有用な)0101のビット並び。 目に見えない。

オペレーティング・システム(operating system)とは

ハードウェアとアプリケーション・ソフトウェアの間の橋渡しをする システムソフトウェア。

オペレーティング・システムの機能。

オペレーティング・システムの種類 コンピュータが使える==オペレーティング・システムが使える。 同じハードウェアに違うOSが動いていたら・・・。

オペレーティング・システム役割

基本的なユーザ・インタフェースの提供

実行環境

アプリケーション・ソフトウェアが動作するための基本的な仕組み。

機能

開発環境

新しいソフトウェアを作るための道具の集合。

コミュニティ

助け合いの輪。

哲学

話すと長い。

オペレーティング・システムの構成要素

図? カーネル、サーバ、シェル、コマンド群

図? オペレーティング・システムの構成要素

カーネル

シェル

カーネルを取り囲んでいる殻。

図? アプリケーション、シェル、カーネル、ハードウェアがリング状になっている。

図? シェルの位置づけ(リング)

図? アプリケーション、シェル、カーネル、ハードウェアが層状になっている。

図? シェルの位置づけ(層)

シェルの種類

Unix のコマンド用のシェルは、簡単なプログラミングにも使える。 キーボードから打った命令をファイルに入れて置く。 シェル・スクリプト。

Unix のシェルの特徴

人間との対話で、キーボードやマウスの入力を交通整理する。 複数のプログラムが同時にキーボードからの入力を求めたらどうなるか。

基本コマンド群

本来はオペレーティング・システムで提供すべき機能を、カーネルやシェルで はなく独立したプログラム(コマンド)として提供する。
組み込みコマンド(built-in command)
シェル自身が実行する。cd, exit, set, umask など。
外部コマンド(external command)
独立した実行型式ファイルがある。
Unixでは、ディレクトリの一覧表、ファイルのコピー、ファイル名変更といっ た基本的な仕事も、ls, cp, mv といった外部コマンドにより実行される。
% which cd [←]
cd: shell built-in command.
% which ls [←]
/bin/ls
% ls -l /bin/ls [←]
-rwxr-xr-x    1 root     root        44892 Oct 29  2003 /bin/ls
% ls /bin [←]
arch           date           gunzip    mv             sort
ash            dd             gzip      netstat        stty
ash.static     df             hostname  nice           su
aumix-minimal  dmesg          igawk     nisdomainname  sync
awk            dnsdomainname  ipcalc    ping           tar
basename       doexec         kill      ps             tcsh
bash           domainname     ksh       pwd            touch
bash2          echo           ln        red            true
bsh            ed             loadkeys  rm             umount
cat            egrep          login     rmdir          uname
chgrp          ex             ls        rpm            usleep
chmod          false          mail      rvi            vi
chown          fgrep          mkdir     rview          view
consolechars   gawk           mknod     sed            ypdomainname
cp             gawk-3.0.6     mktemp    setserial      zcat
cpio           gettext        more      sfxload        zsh
csh            grep           mount     sh             zsh-3.0.8
cut            gtar           mt        sleep
% []
/bin の他にも、コマンドを置く場所がある。PATH 環境変数に設定しておくと、 シェルが自動的に探してくれる。

システム・コールとライブラリ

プログラマにとってのオペレーティング・システム。

システム・コール(system call)
カーネル(システム)のプログラムを直接的に利用する。
ライブラリ(library)
カーネルの機能を使わないもの、 または、最終的にはカーネルの機能を使うが、 より使いやすく便利にしたもの。
両方とも、C言語からは、関数呼出しの形で使える。 API (Application Programming Interface) とも言う。

システムコールの例:

ライブラリの例:

システムコールとライブラリの見分け方(Unix編)

システム・コールは、トラップ命令(trap instruction)を含む。 その部分は、アセンブリ言語。

ライブラリ関数は、大部分はC言語で書かれている。 printf() のソース・プログラムがある。

C言語で記述したプログラムは、文法さえあっていれば コンパイルはできる。 ライブラリ関数やシステムコールがないと動作しない。

ライブラリやシステム・コールは、コンパイルされて オブジェクト・コードの形で保存されている。 実行形式を作る時に取り出され、 アプリケーション・プログラマから作成した オブジェクト・コード(main()関数など)と結合(リンク)される。

静的リンク(static link)
プログラム実行する前(実行形式を作成する時点)で、ライブラリ関数の呼出し をすべて機械語の手続き呼び出し命令に変換する。データへの参照を絶対番地 に変換する。
動的リンク(dynamic link)
プログラム実行中に必要に応じてリンクを行う。

動的リンクを行う時には、共有ライブラリ(shared library) を使い、メモリの節約をする。

Microsoft Windows では、システムコールとライブラリの区別が希薄。 Win32 API。3000以上。 Unix のシステムコールは、200程度。

サーバ

本来はオペレーティング・システムで提供すべき機能を、 カーネルやシェルではなく独立したプログラムとして提供する。

コマンドとサーバの違い

Unix 用語では、デーモン(daemon)。

ウィンドウ・システム

GUI(Graphical User Interface) を提供するためのプログラム群。 オペレーティング・システムとは独立した存在として扱わることもあるが、目 的や役割を考えるとオペレーティング・システムと共通。

カーネルの仕事

「プロセス」という考え方の提供

プログラムとプロセスの違い。

プログラム
動いてなくてもプログラム。 ハードディスクや CD-ROM に入っていていることもある。
プロセス
カーネルの働きによりメモリに読み込まれている。 CPU が割り当てられたら実行できる。
1つのプログラムから複数のプロセスが作られることもある。 1度に1つのプログラムだけをメモリに入れて実行していた時代もある。

CPUのスケジューリング
実行可能なプロセスの中で、どのプロセスを実行するかを決める。
スケジューラ
スケジューリングを行うカーネルのモジュール
プロセス切換え、コンテキスト切換え
実行するプロセスを切り換える
優先順位式スケジューリング(priority scheduling)
実行可能なプロセスの中で、一番優先順位が高いプロセスを実行する
巡回スケジューリング
プロセスは、決められた 時間刻み(time slice)の間、CPUを使い、 その時間を使い果たすと、次のプロセスを実行する。 一巡したら、最初のプロセスにもどる。
時分割システム(Time Sharing System,TSS)
一度に多くのユーザが利用しているが、ある特定のユーザから見ると、常に自 分一人でシステムを専有しているように見える。
Unix では、ps コマンド、top コマンドでプロセスの一覧が表示できる。

優先順位式スケジューリングでは、優先順位の決め方が重要。例。

メモリ管理

主記憶(main storage, メイン・メモリ)をどのようにプロセスに配分 するかを決めること。

プロセスが要求する分を全て満たすことができない時にどうするか。

ページング(paging)
仮想記憶を実現するための1つの方法。
スワッピング(swapping)

ファイル・システム

ディスク上に「ファイル」というデータを格納するソフトウェア的な入れ物を 作ること。

ディレクトリ:ファイル名を保存するための特殊なファイル。 ディレクトリの中に、さらにディレクトリを登録できる。 全体では木構造の名前空間(name space)が作られる。 階層化ディレクトリ構造とも言う。

プロセス間通信

プロセスとプロセスがデータをやり取りする。

デバイス・ドライバ(device driver)

ディスクやキーボード等のデバイス(周辺装置)を管理し、入出力を制御する モジュール。 ハードウェアのメーカが供給するのが普通。

カーネルは、プロセスからのファイル入出力要求をディスク装置の入出力に、 プロセスからのネットワーク通信の要求をネットワーク・インタフェース・カー ドの入出力要求に変換する。この時、ハードウェアを直接操作するのではく デバイス・ドライバと呼ばれるモジュールを呼び出して行う。

デバイス・ドライバの外部仕様は、オペレーティング・システムごとにきめて ある。その仕様に従ったデバイス・ドライバが用意されていれば、そのハード ウェアが利用可能になる。

デバイス・ドライバの実体は、5個程度の関数。

キーボードからの入力がプロセスに届くまで

図? ウインドウシステム、ウインドウ・マネジャ、端末アプリケーション、readkey

図? キーボードから readkey プロセスまで

keyin.c

標準入力から1文字読み出すプログラム。 [readkey.c]
main()
{
    int c ;
    	c = getchar();
	printf("c == %d == 0x%x == [%c]\n",c,c,c );
}
実行例:「a(小文字)」と打ち、リターンを打った時。
% make readkey [←]
cc     readkey.c   -o readkey
% ./readkey [←]
a[←]
c == 97 == 0x61 == [a]
% []
c には、キーの ASCII コードが入る。 (キートップに印刷された文字が魔法の力で入るのではない。)

キーボード・ハードウェア

キーボードを押すと、電気回路の働きでデバイスのコントローラに信号が現れ る。 修飾キーは、control, shift, alt など。他のキーといっしょに使う。

カーネルのデバイス・ドライバ

キーボードのデバイス・ドライバは、キーボードのコントローラからキーの情 報を得る。カーネル内のメモリに保存する。

ウインドウ・システム

ウインドウ・システムは、カーネルからread() システムコールでキーの情報 を読み出す。

ウインドウ・システムは、ウインドウ・マネジャの指示したアプリケーション にキーの情報を渡す。この時、X Window では、プロセス間通信機能(socket) が使われる。

この時、次のような情報を付加することがある。

X Window ならは、xev というプログラムで表示できる。
KeyPress event, serial 21, synthetic NO, window 0x1600001,
    root 0x57, subw 0x0, time 1113814436, (47,91), root:(171,255),
    state 0x0, keycode 8 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 characters:  "a"

KeyRelease event, serial 21, synthetic NO, window 0x1600001,
    root 0x57, subw 0x0, time 1113814522, (47,91), root:(171,255),
    state 0x0, keycode 8 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 characters:  "a"

端末アプリケーション

端末アプリケーションは、ウインドウ・システムからキーの情報を得る。 ウインドウのライブラリの働きにより、ASCII コードを得る。

カーネルの「疑似端末(pseudo tty)」という機能を通じて、キーの ASCII コー ドだけを端末の中で動いているプロセスに届ける。

疑似端末を使うと、1組の(ソフトウェアの働きにによる)デバイスでプロセ ス間の通信を行える。

片方のデバイスに、write() システム・コールで書き込むと、組になっている 別のデバイスから read() システム・コールで読み出せる。

プロセスが現在利用している(疑似)端末は、tty コマンドで表示できる。

疑似端末の「中」

疑似端末の中では、次のプロセスが動いている。 シェルは、普段は疑似端末からキーボードの入力を読みこみ、解釈している。 readkey というプログラムを実行する時には、疑似端末からの入力を、自分で はなく、readkey が読み込むべきだと設定する。この設定により、キーは、 readkey のプロセスに送り届けられる。

getchar()

readkey は、main() 関数の中から getchar() ライブラリ関数を 呼び出している。getchar() ライブラリ関数は、 read() システムコールを実行してとまっている。

端末アプリケーションが疑似端末に write() システム・コールでデータを書 き込むと、read() システム・コールからリターンしてくる。

read() システム・コールでは複数のキーのデータが同時に取れることがある。 getchar() は、そのうちの1文字だけを返す。

逆方向

画面に出るのは、ほとんど逆順にデータが流れる。最期のハードウェアは、キー ボードではなく、グラフィック・コントローラ。

カーネルではなく、ウインドウ・システムが直接コントローラを操作できるよ うになっている場合もある。


Last updated: 2006/01/30 18:39:03
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>