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

情報システム概論 I 

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

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

復習

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

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

目標

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

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

上巻「第1章 UNIXって何」、Unix Super Text 下巻「第42 章 オペレーティン グシステム」、「第43章 デバイス」参考。

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

ソフトウェアは究極的には(有用な)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 [←]
-r-xr-xr-x   1 root  wheel  32460 Aug 22  2005 /bin/ls
% ls /bin [←]
[                       ksh                     rmdir
bash                    launchctl               setup-plt
cat                     link                    sh
chmod                   ln                      slatex
cp                      ls                      sleep
csh                     mkdir                   slideshow
date                    mred                    stty
dd                      mv                      swindle
df                      mzc                     sync
domainname              mzpp                    tcsh
drscheme                mzscheme                test
echo                    mztext                  tex2page
ed                      pax                     unlink
expr                    pdf-slatex              wait4path
games                   planet                  web-server
gmzc                    ps                      web-server-monitor
help-desk               pwd                     web-server-text
hostname                rcp                     zsh
kill                    rm                      zsh-4.2.3
% []
/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個程度の関数。

関連科目

オペレーティングシステムについては、3年生の専門科目「オペレーティング システム I」、「オペレーティングシステム II」、「システムプログラム」で 学ぶ。

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

図? ウインドウシステム、ウインドウ・マネジャ、端末アプリケーション、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() システムコールでキーの情報 を読み出す。

ウインドウ・システムは、ウインドウ・マネジャの指示したアプリケーション にキーの情報を渡す。

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

端末アプリケーション

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

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

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

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

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

疑似端末の「中」

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

getchar()

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

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

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

逆方向

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

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


Last updated: 2008/01/30 15:34:14
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>