情報システム概論 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/
- ハードウェアの構成要素
- 情報の符合化
- 記憶のための部品の種類・性質

図? ハードウェアの構成要素
キーボードからの入力がプロセスに届くまでどのような要素動くのか理解する。
上巻「第1章 UNIXって何」、Unix Super Text 下巻「第42 章 オペレーティン
グシステム」、「第43章 デバイス」参考。
- ハードウェア
- CPU, メモリ, ハードディスク、キーボード、マウス、ディスプレイ、ネットワーク
- ソフトウェア
- アプリケーション・ソフトウェア
- WWWブラウザ
- 電子メール・リーダ
- ワードプロセッサ
- ゲーム
- システム・ソフトウェア
- オペレーティング・システム
- プログラミング言語処理系
- ネットワーク・プロトコル通信プログラム
- データベース
ソフトウェアは究極的には(有用な)0101のビット並び。
目に見えない。
ハードウェアとアプリケーション・ソフトウェアの間の橋渡しをする
システムソフトウェア。
オペレーティング・システムの機能。
- ユーザやアプリケーション・ソフトウェアから見て、ハードウェアを直
接操作するよりも、便利な実行環境を提供する。
- もともとのハードウェアにはそのような機能はないが、コンピュータを
操作する時に有用な、ファイルやプロセスといった基本的なもの(オブジェク
ト)やプロセス間通信機能があたかも存在するかのごとくみせかせる。
- ユーザ間やアプリケーション・ソフトウェア間のデータの交換や協調動
作を助ける。
- ハードウェアを効率的に動作させる。ユーザ間やアプリケーション間で
ハードウェアを共有させる。
- プログラマに、開発用の便利な道具を提供する。
オペレーティング・システムの種類
- Unix
- Solaris, Irix, HPUX, AIX
- Linux
- FreeBSD, NetBSD, OpenBSD, ...
- MacOSX
- MS-DOS, MS-Windows 95/98/2000/XP/Vista
- MacOS9
- OS/360
- Simbian
- Tron
コンピュータが使える==オペレーティング・システムが使える。
同じハードウェアに違うOSが動いていたら・・・。
- 基本的なユーザ・インタフェースの提供
- 実行環境の提供
- 開発環境の提供
- コミュニティの形成: 助け合いの輪
- (哲学)
- 文字によるコマンド(キーボードと文字端末)
- グラフィカル・ユーザ・インタフェース(graphical user interface)
アプリケーション・ソフトウェアが動作するための基本的な仕組み。
- ハードウェアの抽象化・仮想化、間接的な提供
- 自分以外の他のプログラム
機能
- ファイル・システム
- 仮想記憶:
実際に積んでいるメモリよりも大きなプログラムを利用するための仕掛け
- プログラムが協調して動作する仕組み、プロセス間通信、ネットワーク通信
- ユーザの識別
- 保護:
バグを含むプログラムや悪意を持ったプログラムが動作していても、システム
全体が動き続けるたり、他のプログラムが実行し続けることができる。
- 構成要素の置き換え、拡張可能性
新しいソフトウェアを作るための道具の集合。
- コンパイラ
- デバッガ
- makeコマンド
- Eclipse
- カーネル
- サーバ
- シェル
- コマンド群
- 各種ライブラリ関数

図? オペレーティング・システムの構成要素
- ハードウェアを制御するオペレーティング・システムの中心部。
ハードディスク、キーボード、ネットワーク。
- 基本的なオブジェクト、機能の提供
カーネルを取り囲んでいる殻。

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

図? シェルの位置づけ(層)
シェルの種類
- Unixのコマンドインタプリタ (sh, csh, tsh, bash, zsh)
- MacOSX Finder
- Windows Explore
- Xウインドウのウインドウマネジャ
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) とも言う。
システムコールの例:
- open(), close(), read(), write()
ライブラリの例:
- fopen(), fclose(), fread(), fwrite()
- printf(), fgets(), getchar()
システムコールとライブラリの見分け方(Unix編)
- マニュアルの2章にあればシステムコール。例: READ(2)
- マニュアルの3章にあればライブラリ関数。例: PRINTF(3)
システム・コールは、トラップ命令(trap instruction)を含む。
その部分は、アセンブリ言語。
ライブラリ関数は、大部分はC言語で書かれている。
printf() のソース・プログラムがある。
C言語で記述したプログラムは、文法さえあっていれば
コンパイルはできる。
ライブラリ関数やシステムコールがないと動作しない。
ライブラリやシステム・コールは、コンパイルされて
オブジェクト・コードの形で保存されている。
実行形式を作る時に取り出され、
アプリケーション・プログラマから作成した
オブジェクト・コード(main()関数など)と結合(リンク)される。
- 静的リンク(static link)
-
プログラム実行する前(実行形式を作成する時点)で、ライブラリ関数の呼出し
をすべて機械語の手続き呼び出し命令に変換する。データへの参照を絶対番地
に変換する。
- 動的リンク(dynamic link)
- プログラム実行中に必要に応じてリンクを行う。
動的リンクを行う時には、共有ライブラリ(shared library)
を使い、メモリの節約をする。
Microsoft Windows では、システムコールとライブラリの区別が希薄。
Win32 API。3000以上。
Unix のシステムコールは、200程度。
本来はオペレーティング・システムで提供すべき機能を、
カーネルやシェルではなく独立したプログラムとして提供する。
コマンドとサーバの違い
- サーバは、一般にシステムが起動時に実行開始したら終了しない。
- 複数のユーザの仕事を1つのプログラムでこなす。
Unix 用語では、デーモン(daemon)。
GUI(Graphical User Interface)
を提供するためのプログラム群。
オペレーティング・システムとは独立した存在として扱わることもあるが、目
的や役割を考えるとオペレーティング・システムと共通。
例
- X Window System
- MacOSX Aqua
プログラムとプロセスの違い。
- プログラム
- 動いてなくてもプログラム。
ハードディスクや CD-ROM に入っていていることもある。
- プロセス
- カーネルの働きによりメモリに読み込まれている。
CPU が割り当てられたら実行できる。
1つのプログラムから複数のプロセスが作られることもある。
1度に1つのプログラムだけをメモリに入れて実行していた時代もある。
- CPUのスケジューリング
- 実行可能なプロセスの中で、どのプロセスを実行するかを決める。
- スケジューラ
- スケジューリングを行うカーネルのモジュール
- プロセス切換え、コンテキスト切換え
- 実行するプロセスを切り換える
- 優先順位式スケジューリング(priority scheduling)
- 実行可能なプロセスの中で、一番優先順位が高いプロセスを実行する
- 巡回スケジューリング
-
プロセスは、決められた
時間刻み(time slice)の間、CPUを使い、
その時間を使い果たすと、次のプロセスを実行する。
一巡したら、最初のプロセスにもどる。
- 時分割システム(Time Sharing System,TSS)
-
一度に多くのユーザが利用しているが、ある特定のユーザから見ると、常に自
分一人でシステムを専有しているように見える。
Unix では、ps コマンド、top コマンドでプロセスの一覧が表示できる。
優先順位式スケジューリングでは、優先順位の決め方が重要。例。
- 対話的なプログラムを優先
- マルチメディア系(音、ビデオ)を優先
主記憶(main storage, メイン・メモリ)をどのようにプロセスに配分
するかを決めること。
プロセスが要求する分を全て満たすことができない時にどうするか。
- ページング(paging)
-
仮想記憶を実現するための1つの方法。
- 主記憶をページと呼ばれる固定長のブロックに分割する。
- メモリが足りなくなると、
プロセスが利用するデータの一部を二次記憶(ディスク)に追い出し(page out)、場所を確保する。
空いた場所に、現在必要なデータを二次記憶から読み込む(page in)。
- スワッピング(swapping)
-
- メモリが足りなくなると、プロセス全体を二次記憶に追い出す
スワップ・アウト(swap out)。
- メモリに余裕ができるか、他のプロセスをスワップアウトして
空きを作り、スワップインする。

図 仮想記憶によるプログラム(プロセス)の実行
ディスク上に「ファイル」というデータを格納するソフトウェア的な入れ物を
作ること。
ディレクトリ:ファイル名を保存するための特殊なファイル。
ディレクトリの中に、さらにディレクトリを登録できる。
全体では木構造の名前空間(name space)が作られる。
階層化ディレクトリ構造とも言う。
プロセスとプロセスがデータをやり取りする。
ディスクやキーボード等のデバイス(周辺装置)を管理し、入出力を制御する
モジュール。
ハードウェアのメーカが供給するのが普通。
カーネルは、プロセスからのファイル入出力要求をディスク装置の入出力に、
プロセスからのネットワーク通信の要求をネットワーク・インタフェース・カー
ドの入出力要求に変換する。この時、ハードウェアを直接操作するのではく
デバイス・ドライバと呼ばれるモジュールを呼び出して行う。
デバイス・ドライバの外部仕様は、オペレーティング・システムごとにきめて
ある。その仕様に従ったデバイス・ドライバが用意されていれば、そのハード
ウェアが利用可能になる。
デバイス・ドライバの実体は、5個程度の関数。
オペレーティングシステムについては、3年生の専門科目「オペレーティング
システム I」、「オペレーティングシステム II」、「システムプログラム」で
学ぶ。

図? キーボードから readkey プロセスまで
注意: この図で、次のものは、オペレーティング・システムの要素ではない。
- キーボード
- コントローラ
- 端末アプリケーション
- readkey の本体
バッファは、データを溜めるためのメモリ。
標準入力から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 コード
- 時刻
- 修飾キーの状態
- ウインドウの ID
- キーが押された時のマウス・ポインタの位置
端末アプリケーションは、ウインドウ・システムからキーの情報を得る。
ウインドウのライブラリの働きにより、ASCII コードを得る。
カーネルの「疑似端末(pseudo tty)」という機能を通じて、キーの ASCII コー
ドだけを端末の中で動いているプロセスに届ける。
疑似端末を使うと、1組の(ソフトウェアの働きにによる)デバイスでプロセ
ス間の通信を行える。
片方のデバイスに、write() システム・コールで書き込むと、組になっている
別のデバイスから read() システム・コールで読み出せる。
プロセスが現在利用している(疑似)端末は、tty コマンドで表示できる。
疑似端末の中では、次のプロセスが動いている。
シェルは、普段は疑似端末からキーボードの入力を読みこみ、解釈している。
readkey というプログラムを実行する時には、疑似端末からの入力を、自分で
はなく、readkey が読み込むべきだと設定する。この設定により、キーは、
readkey のプロセスに送り届けられる。
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>