情報システム概論 I
システム情報工学研究科CS専攻、電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/compsys1-2006/2007-02-19
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
永続的なメモリを仮想化して使いやすくしたものが、 ファイルやデータベース。
もしも、ファイルに名前がつけられなかったら・・・・。
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の連想配列。「{}」で空の連想配列が作られる。その後は、普通の配 列と同様に代入できる。 [ruby-assoc.rb]
#!/usr/bin/ruby
aa = {};
aa["apple"] = 100;
aa["orange"] = 120;
printf("apple == %d\n", aa["apple"] );
printf("orange == %d\n", aa["orange"] );
実行例:
% ./ruby-assoc.rb連想配列のことを、プログラミング言語によっては、ハッシュ表(Hash table) ということもある。apple == 100 orange == 120 %
![]()
int x;
f()
{
int y ;
static int z ;
}
| 種類 | スコープ | 寿命 |
|---|---|---|
| 外部変数 | 全プログラム | プログラムの実行開始から終了まで |
| 普通の局所変数 | 関数内 | その関数の実行中とそこから別の関数を呼んでいる間 |
| staticな局所変数 | 関数内 | プログラムの実行開始から終了まで |
| static変数(関数の外に定義) | 同一ファイル内 | プログラムの実行開始から終了まで |
| (C言語にはない) | (いろいろ) | プログラムの終了後も残る |
プログラムの実行開始前にも有効で、終了後にも有効な変数を 考えてみる。これを永続的な変数という。
プログラミング言語で永続的な変数を支援しているものがある。
一般の言語からは、ライブラリ関数で「永続的なハッシュ表(連想配列)」と して扱うことが多い。
保存するプログラム [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 | 幹事 |
% sqlite3 company1.db挿入したデータは、消す(delete)まで使える。SQLite version 3.1.3 Enter ".help" for instructions sqlite> create table circles( name char(20), room char(3), phone char(4));
sqlite> insert into circles values('ukouken', '123', '4444');
sqlite> select * from circles where room='123';
ukouken|123|4444 sqlite> .quit
% ls -l company1.db
-rw-r--r-- 1 yas prof 2048 Feb 15 16:36 company1.db %
![]()
% sqlite3 company1.dbSQLite version 3.1.3 Enter ".help" for instructions sqlite> select * from circles where phone='4444';
ukouken|123|4444 sqlite> .quit %
![]()
lock(); 相互排除したい部分。 unlock();あるファイルや関係データベースの表を、1人で、かつ、一度に1つのプログ ラムでしか操作しないなら、ロックは不用。それ以外の時には、必要。
歴史:1960年代、テープの時代。 失敗したら、巻き戻す(rollback)。
銀行口座間の預金の移動。
注意:Javaの serializable とは意味が全く違う。
複数のトランザクションは、並行に実行可能。しかし、その複数のトランザク ションの最終結果は、それらを「ある順序」で「逐次的に」実行した時と同じ結果 になる。
逆に、トランザクションは、直列化可能なスケジュールが存在するなら、並行 に実行してもよい。直列化可能でないなら、トランザクションは、開始を遅ら せるか、アボートする。
Begin_Transaction();
reserve("NRT-SFO");
reserve("SFO-JFK");
Commit();
プログラムの記述としては、これだけ。どこにもロックは出てこない。内部的
には、ロックは行われる(ことがある)。
途中の reserve() が失敗したら、トランザクション全体を abort() する。