情報システム概論 I
電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2005/2006-02-20
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
メインメモリは、IC(Integrated Circuit、シリコンという元素による半導 体で作られた電気回路)でできている。その他に、ハードディスクやフロッピ・ ディスクも重要な記憶のための部品である。
メモリには、数字で番地(アドレス)が付いている。番地を指定して、データ を保存する。番地を指定すると、データが取り出せる。
| ハードウェア | 時間 |
|---|---|
| プロセッサレジスタ | 1クロック |
| L1キャッシュ | 数クロック |
| L2キャッシュ | 10クロック |
| メインメモリ | 数十クロック |
| ハードディスク | 数百万クロック |
仮想記憶(仮想メモリ、virtual memory)とは、オペレーティングシステムの働きにより、実際に備えているメ
モリ容量よりも大きなプログラムを動かすための仕組みである。
図 仮想記憶によるプログラム(プロセス)の実行
仮想記憶を使うと、メモリが100Mバイトしかないコンピュータで、200 Mバイトのメモリを使うプログラムを実行することができるようになる。
もともとは、1つのプログラムで実際のメモリ容量以上のものを使うための仕 組みである。最近では、複数のプログラムが使うメモリの総量で考えることも ある。
仮想記憶の基本的なアイディアは、すぐに使うところだけを速いメモリ(IC) に、当分使わない所を、遅いハードディスクに置き、ディスクとメモリの内容 を入れ替えながら仕事を進めることである。この時、速いメモリを主記憶 (main memory, primary storage)、遅いハードディスクを二次記憶(secondary storage)とう。
永続的なメモリを仮想化して使いやすくしたものが、 ファイルやデータベース。
もしも、ファイルに名前がつけられなかったら・・・・。
FOPEN(3) BSD Library Functions Manual FOPEN(3)
NAME
fopen, fdopen, freopen -- stream open functions
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <stdio.h>
FILE *
fopen(const char * restrict path, const char * restrict mode);
FILE *
fdopen(int fildes, const char *mode);
FILE *
freopen(const char *path, const char *mode, FILE *stream);
DESCRIPTION
The fopen() function opens the file whose name is the string pointed to
by path and associates a stream with it.
なぜ、先頭から順にアクセスするのか。
ハードディスク上に作られたファイルは、(テープ上に作られたファイルと違っ て)、先頭から順にアクセスだけでなく、メインメモリと同様に、任意の順番 に配列のようにアクセスすることができる。
API
| もの | 指すもの | 内容 |
|---|---|---|
| メインメモリ | 番地(数) | バイト単位 |
| 配列 | 添字(index)(数) | 任意のデータ単位 |
例:Rubyの連想配列。
aa = {};
aa["apple"] = 100;
aa["orange"] = 120;
printf("%d\n", aa["apple"] );
連想配列のことを、プログラミング言語によっては、ハッシュ表ということも
ある。
int x;
f()
{
int y ;
static int z ;
}
種類 スコープ 寿命
外部変数 全プログラム プログラムの実行開始から終了まで
普通の局所変数 関数内 その関数の実行中とそこから別関数に飛んでいる間
staticな局所変数 関数内 プログラムの実行開始から終了まで
static変数(関数の外に定義) 同一ファイル内 プログラムの実行開始から終了まで
| 種類 | スコープ | 寿命 |
| 外部変数 | 全プログラム | プログラムの実行開始から終了まで |
| 普通の局所変数 | 関数内 | その関数の実行中とそこから別関数に飛んでいる間 |
| staticな局所変数 | 関数内 | プログラムの実行開始から終了まで |
| static変数(関数の外に定義) | 同一ファイル内 | プログラムの実行開始から終了まで |
プログラムの実行開始前にも有効で、終了後にも有効な変数を 考えてみる。これを永続的な変数という。
プログラミング言語で永続的な変数を支援しているものがある。
一般の言語からは、ライブラリ関数で「永続的なハッシュ表(連想配列)」と して扱うことが多い。
保存するプログラム [ruby-dbm-store.rb]
#!/usr/local3/bin/ruby
require 'dbm';
db = DBM::open("fruits",0666);
db["apple"] = 100;
db["orange"] = 120;
db.close();
保存されたデータを利用するプログラム
[ruby-dbm-print.rb]
#!/usr/local3/bin/ruby
require 'dbm';
db = DBM::open("fruits");
printf("%d\n", db["apple"] );
db.close();
実行例:
% ls fruits.dbls: fruits.db: No such file or directory % ./ruby-dbm-store.rb
% ls fruits.db
fruits.db % file fruits.db
fruits.db: Berkeley DB (Hash, version 7, native byte-order) % ./ruby-dbm-print.rb
100 %
![]()
ファイルと同様に、 永続的な記憶媒体を 仮想化して使いやすくしたもの。
ファイルと違い
「関係」とは、2次元の表。 関係データモデルでは、表の集合としてデータベースを構築する。
| サークル名 | 部屋番号 | 電話番号 |
|---|---|---|
| テニス | 101 | 1011 |
| サッカー | 203 | 4423 |
| 社員番号 | 氏名 | 基本給与 | 住所 |
|---|---|---|---|
| 001 | 筑波太郎 | 400 | つくば市××× |
| 002 | 土浦次郎 | 450 | 土浦市△△△ |
| 003 | 水戸三郎 | 450 | 水戸市○○○ |
| サークル名 | 社員番号 | 役職 |
|---|---|---|
| テニス | 001 | 代表 |
| テニス | 002 | 会計 |
| サッカー | 001 | 一般部員 |
| サッカー | 003 | 幹事 |
CREATE TABLE サークル (サークル名 CHAR(20) NOT NULL, 部屋番号 CHAR(3) NOT NULL, 電話番号 CHAR(4) NOT NULL)例:データベースの検索
SELECT 電話番号 FROM サークル WHERE 部屋番号='101'
lock(); 相互排除したい部分。 unlock();あるファイルや関係データベースの表を、1人で、かつ、一度に1つのプログ ラムでしか操作しないなら、ロックは不用。それ以外の時には、必要。
歴史:1960年代、テープの時代。 失敗したら、巻き戻す(rollback)。
銀行口座間の預金の移動。
注意:Javaの serializable とは意味が全く違う。
複数のトランザクションは、並行に実行可能。しかし、その複数のトランザク ションの最終結果は、それらを「ある順序」で「逐次的に」実行した時と同じ結果 になる。
逆に、トランザクションは、直列化可能なスケジュールが存在するなら、並行 に実行してもよい。直列化可能でないなら、トランザクションは、開始を遅ら せるか、アボートする。
Begin_Transaction();
reserve("NRT-SFO");
reserve("SFO-JFK");
Commit();
プログラムの記述としては、これだけ。どこにもロックは出てこない。内部的
には、ロックは行われる(ことがある)。
途中の reserve() が失敗したら、トランザクション全体を abort() する。