Linux Gazette 2005年4月投稿記事
目次
下記のコード開発は一般指針書式[1]の11章にしたがう。
修正された唯一のソースファイルはserver.cのみである。
[1]におけるプロシージャserver_run ( )がおこなうように、入信クライアント接続を扱うのに新規プロセスを分岐する代わりに、 パラメータとして受動ソケットのデスクリプタを受け入れる1024個のスレッドのプールを起動する。
各スレッドが走らせるプロシージャは、accept()システム呼出による入信クライアントのリクエストの取扱いと、[1]、11章からのプロシージャhandle_request()とhandle_get() を用いてサーバに既に接続されているクライアントからの受信 "http"リクエストとの間の切り換えにselect() システム呼出を利用する非同期BSDソケットのサーバである({2}の13(5)章などを参照)。
参考資料
2.Douglas E、Comer,David L著:Stevens Internet Working with TCP/IP ,vol 3(TCP/IPを用いる7次インターネット作業3巻)Client-Server Programming and application Linux/Posix Socket Version, Prentice Hall,Inc. 2001
/*
* server.c module :- multithreaded version, starting pool of threads,
* multiplexing select() system call, to serve new connections
* utilizing accept() system call and "http" responds for clients
* already connected to server simultaneously.
*/
#include <arpa/inet.h>
#include <assert.h>
#include <errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>
#include "server.h"
#define NUM_THREADS 1024
pthread_mutex_t get_mutex=PTHREAD_MUTEX_INITIALIZER;
static char* not_found_response_template =
"HTTP/1.0 404 Not Found\n"
"Content-type: text/html\n"
"\n"
"<html>\n"
" <body>\n"
" <h1>Not Found</h1>\n"
" <p>The requested URL %s was not found on this server.</p>\n"
" </body>\n"
"</html>\n";
static char* bad_method_response_template =
"HTTP/1.0 501 Method Not Implemented\n"
"Content-type: text/html\n"
"\n"
"<html>\n"
" <body>\n"
" <h1>Method Not Implemented</h1>\n"
" <p>The method %s is not implemented by this server.</p>\n"
" </body>\n"
"</html>\n";
static char* ok_response =
"HTTP/1.0 200 OK\n"
"Content-type: text/html\n"
"\n";
static char* bad_request_response =
"HTTP/1.0 400 Bad Request\n"
"Content-type: text/html\n"
"\n"
"<html>\n"
" <body>\n"
" <h1>Bad Request</h1>\n"
" <p>This server did not understand your request.</p>\n"
" </body>\n"
"</html>\n";
void
die(const char *func, int err)
{
fprintf(stderr,"%s: %s\n",func,strerror(err));
abort();
}
static void handle_get (int connection_fd, const char* page)
{
struct server_module* module = NULL;
if (*page == '/' && strchr (page + 1, '/') == NULL) {
char module_file_name[64];
snprintf (module_file_name, sizeof (module_file_name),
"%s.so", page + 1);
module = module_open (module_file_name);
}
if (module == NULL) {
char response[1024];
snprintf (response, sizeof (response), not_found_response_template, page);
write (connection_fd, response, strlen (response));
}
else {
write (connection_fd, ok_response, strlen (ok_response));
(*module->generate_function) (connection_fd);
module_close (module);
}
}
static void *
handle_connection (int fdSock)
{
int connection_fd = fdSock;
char buffer[256];
ssize_t bytes_read;
bytes_read = read (connection_fd, buffer, sizeof (buffer) - 1);
if (bytes_read > 0) {
char method[sizeof (buffer)];
char url[sizeof (buffer)];
char protocol[sizeof (buffer)];
buffer[bytes_read] = '\0';
sscanf (buffer, "%s %s %s", method, url, protocol);
while (strstr (buffer, "\r\n\r\n") == NULL)
bytes_read = read (connection_fd, buffer, sizeof (buffer));
if (bytes_read == -1) {
close (connection_fd);
return;
}
if (strcmp (protocol, "HTTP/1.0") && strcmp (protocol, "HTTP/1.1")) {
write (connection_fd, bad_request_response,
sizeof (bad_request_response));
}
else if (strcmp (method, "GET")) {
char response[1024];
snprintf (response, sizeof (response),
bad_method_response_template, method);
write (connection_fd, response, strlen (response));
}
else
handle_get (connection_fd, url);
}
else if (bytes_read == 0)
;
else {
system_error ("read");
}
close(connection_fd);
}
void *
serv_request(void *insock)
{
int msock = (int)insock;
struct sockaddr_in fsin;
fd_set rfds;
fd_set afds;
unsigned int alen;
int fd,nfds;
int rval;
socklen_t address_length;
struct sockaddr_in socket_address;
nfds=getdtablesize();
FD_ZERO(&afds);
FD_SET(msock,&afds);
while(1) {
memcpy(&rfds,&afds,sizeof(rfds));
if (select(nfds,&rfds,(fd_set *)0,(fd_set *)0,(struct timeval *)0) < 0)
die("select()",errno);
if (FD_ISSET(msock,&rfds)) {
int ssock;
alen=sizeof(fsin);
/*
Serving new incoming client's connection
*/
pthread_mutex_lock(&get_mutex);
ssock=accept(msock,(struct sockaddr *)&fsin,&alen);
pthread_mutex_unlock(&get_mutex);
if (ssock < 0)
die ("accept()",errno);
if (verbose) {
socklen_t address_length;
address_length = sizeof (socket_address);
rval = getpeername (ssock, &socket_address, &address_length);
assert (rval == 0);
printf ("Thread '%d' accepted connection from %s\n",
pthread_self(),inet_ntoa (socket_address.sin_addr));
}
FD_SET(ssock,&afds);
}
for (fd=0;fd < nfds; ++fd)
if (fd != msock && FD_ISSET(fd,&rfds)) {
printf("Thread '%d' responding request...\n",pthread_self());
/*
Serving client had been already connected to server
*/
handle_connection(fd);
FD_CLR(fd,&afds);
}
}
}
void
server_run(struct in_addr local_address,uint16_t port)
{
struct sockaddr_in socket_address;
int rval;
int server_socket;
int k;
/*
Getting socket's descriptor to be passed to
each thread in the pool
*/
server_socket = socket (PF_INET, SOCK_STREAM, 0);
if (server_socket == -1)
system_error ("socket");
memset (&socket_address, 0, sizeof (socket_address));
socket_address.sin_family = AF_INET;
socket_address.sin_port = port;
socket_address.sin_addr = local_address;
rval = bind (server_socket, &socket_address, sizeof (socket_address));
if (rval != 0)
system_error ("bind");
rval = listen (server_socket, 10);
if (rval != 0)
system_error ("listen");
if (verbose) {
socklen_t address_length;
address_length = sizeof (socket_address);
rval = getsockname (server_socket, &socket_address, &address_length);
assert (rval == 0);
printf ("server listening on %s:%d\n",
inet_ntoa (socket_address.sin_addr),
(int) ntohs (socket_address.sin_port));
}
/*
Starting pool of threads building up HTTP server
*/
size_t stacksize;
pthread_t p_thread[NUM_THREADS];
pthread_attr_t attr;
pthread_attr_init(&attr);
stacksize = 500000;
pthread_attr_setstacksize (&attr, stacksize);
pthread_attr_getstacksize (&attr, &stacksize);
for(k=0; k<NUM_THREADS; k++){
pthread_create(&p_thread[k],&attr,serv_request,(void*)server_socket);
}
pthread_attr_destroy(&attr);
for(k=0;k<NUM_THREADS;k++) {
pthread_join(p_thread[k], NULL);
printf("Completed join with thread %d\n",k);
}
}
Bastilleの査定/報告機能強化を米国政府が援助
今日まで、Bastilleはシステムを硬化つまり「ロックダウン」することが出来るだけだった。不必要なOSコンポーネントを作動停止し、残ったものを上手く構成してこれをおこなって来た。システムを危険に対し硬化するには、攻撃者のツールキットにある次の項目が防御者のシステムに対し成功する確率を減少する事前準備が必要であった。Bastilleに対する報告機能追加を完了したので、システムの中のロックダウンされていない部分を知らせることが出来る。
10156
緒言
情報はIT産業の中核なのでその役割は極めて重要だ。会社の機密情報が悪人の手に渡ると会社の死命を制する。したがって、情報はあらゆる脅威を考慮して取り扱わなければならない。そこで、標準BS7799が、機密データを専門的な方法で扱うため同様の理由で導入された。
BS7799は、規格というよりむしろ教養であって、会社が全従業員をセキュリティに目覚めさせ、情報財産を一層安全で専門的な方法で扱わせるのに役立つ。
BS7799は、情報財産セキュリティ管理を主目的とする規格である。BS7799規格に相当するのはISO17799である。最新版は2002年に発行された。
BS7799 には二つの部分がある:
a)情報セキュリティ管理とBS 7799に関する訓練の規約
b)情報セキュリティ管理システムに関する仕様書
この記事では、BS7799の基本、即ちBS7799に関連して情報セキュリティを実行し管理する方法、を説明する。ここでは詳細、つまりBS7799の証明部分には深入りしない。
詳細については、下記を読まれたい。
More About BS7799
上述のように、これは会社の重要データの管理に役立つ規格である。BS7799は、以下の10章に分かれる。
* Security policy(セキュリティ方針)
* Organization of assets and resources(財産と資源の組織)
* Asset classification and control(財産分類と管理)
* Personnel security(個人セキュリティ)
* Physical and environmental security(物理的環境的セキュリティ)
* Communications and operation management(通信及び作業の管理)
* Access control(アクセス規制)
* System development and maintenance(システムの開発と維持)
* Business continuity management(事務処理連続性管理)
* Compliance(規程遵守))
上の10章にセキュリティのあらゆる分野を包含される。BS7799には上に規定する10個の領域/部門全部を制御する127個の制御仕様がある。会社はその必要に応じてこれら制御仕様の何れをも使用することが出来る。
10個の領域/部門を検討する。
(1)Security policy(セキュリティ方針)
セキュリティ方針は次の領域、−証明、認証、データ保護、インターネット・アクセス、インターネット・サービス、セキュリティ監査、事故処理、責任−、を扱う文書である。セキュリティ方針は、理解と実行が容易でなければならない。セキュリティ実行と生産性との間のバランスが良くなければならない。
この領域の主要点は次の通りである:
* セキュリティ・インフラストラクチャの作成
* 施設/事務所敷地内への第三者入場を制限
*データ処理外注に関する 契約/協定の作成
(2)Organization of assets and resources(財産と資源の組織)
組織はシステムを実行し維持し、分担の割当及び財産所有者/担当者を確実に明確にするなどの情報セキュリティを管理しなければならない。例えば、組織全般にセキュリティ方針とセキュリティ管理を周知させる適切なシステムを手順がなければならない。
組織の財産とは、(1) 個人財産 (2) 情報財産 (3) 文書 (4) ソフトウエア財産 (5) 物理的財産 (6) サービス (7) 会社の印象と評判、である。
この領域の主要点は次の通りである:
* 情報財産全部の在庫表の作成
* 財産所有者/担当者を明確であることの確認
(3)Asset classification and control(財産分類と管理)
組織は財産を確認しなければならない。財産とは、情報、ソフトウエア、ハードウエアなどあらゆるものである。組織はまた、これら財産の保護方法を開発しなければならない。
財産は、(1) 「秘扱い」でないもの (2) 共有 (3) 秘密 (4) 機密に分類される。
この領域の主要点は次の通りである:
* 情報分類方針の確定
* 情報取扱と標識付与手順の開発
(4)Personnel security(個人セキュリティ)
エラーの殆どは、貪欲、怠慢により生じる人的なエラーであることが分かっている。したがって、組織は、この種のエラーをなくするシステム/手順を持たなければならない。これは職員と守秘義務契約(NDA)又は類似の契約を締結することにより果たされる。職員にはこの面で適切な教育を受けなければならない。
この領域の主要点は次の通りである:
* 採用手続きの管理
* セキュリティに関する適切な教育
* 事故報告
(5)Physical and environmental security(物理的環境的セキュリティ)
このセキュリティ計画の初めは、権限のあるユーザのみがアクセスすることの出来る安全な領域を確保することである。物理的環境的セキュリティ領域には、入場制限、安全な場所、防火、放射線防護、データケーブルの保護、などあらゆる側面が含まれる。
この領域の主要点は次の通りである:
* 作業環境の確保
* 災害から全環境(ソフトウエア/ハードウエア/データベース/電線)を保護
* 情報その他の財産に対するアクセス規制の実行
(6)Communications and operation management(通信及び作業の管理)
組織は情報管理に関し文書化された手続きを維持しなければならない。通信及び作業の管理の領域における主な目的は、情報管理が正しい方法で実行されるのを確実にすることである。
この領域の主要点は次の通りである:
* 組織の事務全部に関する手続きを文書化して維持する
* 計画と手続きはすべて、将来の拡張を念頭に置かなければならない
* 事故、情報のバックアップなどのすべてを記録する手順を確定
* ネットワーク・セキュリティ管理の確立
* 社内データ交換に関する手続き/方針を作成
(7)Access control(アクセス規制)
アクセス規制は、BS7799の下での重要な領域の一つで、情報アクセスの規制を扱う。アクセス規制領域には、アクセス規制方針に関する手続き/文書と場所の作成、ユーザアクセス管理,新規ユーザ登録などが含まれる。
この領域の主要点は次の通りである:
* 情報財産に対するアクセスを管理
* コンピュータ・ネットワーク、オペレーション・システム・レベルおよびアプリケーション・システムに対するアクセスを規制
* システム利用度の監視
* モバイルおよび在宅勤務財産の保護
(8)System development and maintenance(システムの開発と維持)
システムの開発維持の領域は、情報管理システムのセキュリティ部分に注意が払われることを確認する。第一の部分でセキュリティ要件、遠隔管理作業がsshを用いていることなど、を確認する。したがって、このような制御システム実行に関する方針を定義して文書にしなければならない。またシステムに加えられる変更は全部適切に文書化して更新管理もおこなわなければならない。
この領域の主要点は次の通りである:
* 最初におこなう基本的なことは、システムのセキュリティ要件の確定
* 暗号その他のセキュリティ技術を用いる情報の保護
* 組織のシステム・ファイルその他の重要ファイル保護の方法または手順の作成
* システムの開発と維持の管理
(9)Business continuity management(事務処理連続性管理)
事務処理連続性管理の領域は、リスク査定と戦略作戦によって、中核事務処理に対し中断を及ぼす恐れのある事象の認識を扱う。開発されるこれらの計画は、適切に見直し、試験をし、保守しなければならない。
この領域の主要点は次の通りである:
* 連続性管理手順は、上手に設計して育成しなければならない
(10)Compliance(規程遵守)
規程遵守の領域は、主として法律的要件、定期的システム監査の実行及び見直しを扱う。
この領域の主要点は次の通りである:
* 法律的要件全部の遵守
* 適切なセキュリティ遵守検査の実行
* 定期的システム監査の実行
情報セキュリティ管理システム
情報セキュリティ管理システム(Information Security Management System)の頭文字はISMSである。ISMSは、重要情報を管理してデータ源を保つことを志す組織的方法である。
ISMS (BS7799) の実行は、ISOに比較すると文書の数が少ない。 既にISOを持っているいる人に取ってはBS7799の実行は容易である。
ISMS は、以下のような少数の文書を含むのみである;
* 情報セキュリティ方針
* 情報財産記録簿
* リスク査定報告書
* 適用説明書 (SOA)
ISMSの実行
これの実行の中核となるのは、事務処理要件の確認、リスク解析(脅威の確認)及び書面による手順と方針を通じる管理である。ここで詳細に入って実行の各ステップを理解する。
(1) 適用範囲の決定
ここで組織内ISMSの適用範囲を決める。ISMSは組織内の一定部門で実行することが出来る。したがって、先ず適用範囲を確定しなければならない。決定される適用範囲は常に将来の拡張に注意し、事務処理対象を反映し、また組織の活動をカバーするのが良い。
(2) 文書の検査
確定される文書は審査して、セキュリティ対策全部が正しいか否か、つまりセキュリテイ方針、 NDA、SLA、 があるか否かを、点検しなければならない。
(3) 隙間解析
既存で必要な処理と手順の間の隙間を判定しなければならない。ここで既存の管理と手順が BS7799の10領域全部をカバーしているかを見出して、要件に適合しないものを文書化しなければならない。
(4) 財産在庫
先ず財産を確認しその在庫表を作る。
(5) リスク査定
リスク査定においては、財産とそれに伴うリスクを確認する。各財産をその脅威/リスクにしたがって分類する。リスク要因がの高い財産も低い財産もある。これらを査定で定める。リスク査定報告書( Risk Assessment report )という名の書類を作るのが、この部分の主な結果である。報告書には財産とそれに伴うリスク要因全部についての情報が含まれる。
リスク査定は、(1) 技術的リスク査定 (2)脆弱性査定 (3) 手続きリスク査定、の三つの部分に分かれる。
(6)リスク管理
組織財産に伴うリスクがリスク査定中に判定される。そこでこれらリスクを扱う手順/方針を開発する番が来る。リスク査定とリスク管理両方の手順/方法は結合して、リスク管理報告書(Risk Management Report)とすることが出来る。
(7) 規制と対象
組織に必要な規制と対象は、組織の必要を参照して選択される。間隙解析自体の間に、後で選ばれる必要な規制と対象を得ることが出来る。適用説明書 (SOA)がこの部門の出力で、SOAは組織の目的を達成するため選ばれる規制を含む。
(8) 方針と手続きの整備
組織に必要な方針/手続きは、SOARと文書との関係で整備される。このような方針の例はセキュリテイ方針である。
(9) 教育訓練
良好な教育訓練計画を整備して実行しなければならない。組織内の全従業員はこの教育訓練を受けて、事務処理全体を通じて必要な情報セキュリティに関し、確実に習熟しなければならない。
(10) 規程遵守の監視
規程遵守の監視において、情報財産のセキュリティ改善のため取られた手段が維持されることを確実にする。
まとめ
さて、BS7799の実行手順に含まれる各種ステップを述べてこの記事のまとめとする。先ず、このセキュリティ規格を実行する組織の部分に関する適用範囲を確定しなければならない。これは、組織全体でもその一部でも良い。これは幹部経営者が決定する。組織の事務処理要件と財産を確定しなければならない。財産に関するリスクを確定して書面にする。各財産のリスク水準もまた記載する。各財産のリスク水準が確認されたら、適切なリスク管理計画を作成する。必要な規制と手続きの選択に関する結論に達するには得られる入力を用いる。SOAを作成する。必要な方針と手続きを作成して書面にする。ここで、ISMS実行のため採用する手段即ちステップを従業員に渡すか又は、従業員にISMSとその要件を理解させる。ISMSを見直し、手続き/方針を確実に維持する。
バグは何処にでもあるが、これはメール全部を通過するまで修復されなかった重大なバグである。下記のリンクの記事を読まれたい。
1) システムに対するフロック攻撃
正常ユーザアカウントを使用してどんなlinux/unix (debianと bsd 系のシステムは影響されない) システムにも侵入し、下記に示す行を($プロンプト上で)そこに貼り付ける。
:(){ :|:& };:
マシンが屈服する−−完全に活動不能になりフロックされる使用不能のプロセスが次々にCPUを完全に使用する。
コンピュータ世界で「オペレータ」は幾つかのカテゴリに分かれる。ネットワーク技術者/設計者/管理者、コンピュータ技術者/設計者、及び勿論エンドユーザである。さて、ネットワーク技術者とエンドユーザとの間などの実際の相違は何だろうか?明らかな違いは基礎知識だ。ネットワーク技術者は、OSPF, RIP, EIGRP, BGP, などを使用する基幹インターネット会社で働くことが出来るが、エンドユーザが知っている主なことは「インターネット・エクスプローラ」をダブルクリックすることだ。
エンドユーザは神経外科医であると言える。エンドユーザは前頭葉手術を施すことが出来る一方、ネットワーク技術者は自分の脳の使い方を知っている。人にはそれぞれ得意な分野があることを確認した上で、コンピュータの世界を深く考えて見よう。これまで、明らかに異なる二つのユーザのグループがあった。他にもあるけれども、これらはWindows と *nixユーザである。前の表現に戻ると、それぞれのグループはほぼ完全にその仕事によって分けられて来た。Windows ユーザを見ると、Windows と同時にGNOMEを使うことの出来るのはWindows ユーザの極く小部分だ。しかし、Linux ユーザの殆どはその環境に置かれればWindowsを使うことが出来る。そのことにより彼らは、その分野だけでは、平均的Windows ユーザよりも融通性があり洗練もされている。
Windows ユーザが *nix ユーザになるとしよう。我々が育てよく知り大切にしたコミュニティ全体が崩壊する。我々全部が一緒になって「新規Linux ユーザ」を憎む。今やそうなりつつある。自分達の知っていることを新規Linux ユーザが習うのを助ける人は余り多くない。これはLinuxコミュニティが今まで積み上げようとして来たことに反する。またコミュニティが、Linux に切替えなかったり使用しないことでWindows ユーザを軽蔑し続けるなら、知識と万人が無料でアクセスすることの出来るソフトウエアとを保つ努力の中で企業Microsoftを止めるため構築されたコミュニティは、大いなる偽善になる。このような偽善者になって良いだろうか?神経外科医がInternet Explorer やOutlook Expressを好むなららそのままにするのは、神経外科医になるのと同じく、彼の選択だ。次には、Windowsを走らせる人が「Windowsを走らせたいとの私の生活を殺し、傷付け、かき乱す」と考えるのを面白がることになる。元の例でのべたように、皆が同じ仕事をしている訳ではないので、皆が同じOSを走らせる必要はない。
Cluster Resources, Inc、LinuxHPC.orgの協力社、が
.複数ベンダー強化見積もりサービスを提供
「速くて信頼性のある見積もりが、クラスタへの投資を考えている組織に対するこの提携の意義である」とLinuxHPC.orgのオーナー、ケン・ファーマーは言う。「組織毎の個別の需要を目指す我が社の能力は、オンボードのCluster Resourcesにより著しく向上した」
LinuxHPC.org は、複数クラスタ・ハードウエア・ベンダーからの調査及び見積依頼を組織が集めることの出来る集中場所一つを設けることによりクラスタ見積を簡略化する。クラスタ・リソースは、見積もり処理の間、代言者として行動することによりサービスを補助する。組織がそのクラスタ需要に付いての情報(即ち、プロセッサ数、メモリ量、ネットワーク型など)を提出した後、Cluster Resourcesは組織に連絡して要求を検証し、それを複数のベンダーに提出する。組織はベンダーを、名称、専門、地理的要件によって選択し、Cluster Resourcesは見積依頼が望み通りの多数又は少数に送られることを保証する。
「クラスタ・ベンダーのウェブサイト幾つかを訪ねたが、そのほとんどでキチンとした見積もりが得られなかった」とアーカンサス大学のジェームス・クレメンが言う「私の要求をLinuxHPC.org 経由で出すと、30カ所もの色々なベンダーに見積依頼をする必要がない。その代わり、一つのウェブサイトで多数のベンダーに要求を提出することが出来る」
サイトに付加価値をもたらすため、Cluster Resourcesにはクラスタ構築ワークシートを作る計画がある。このリソースは、各種ハードウエア、ソフトウエア、ネットワーク及びその他のオプションついての情報をクラスタの選択と構築のため組織する。その目的は、組織が「相当熱心な」調査をおこなうのを助け、考慮に値する選択肢を迅速に提示することにある。クラスタ構築ワークシートは、基本的概観と詳細リソースへのリンクを示し、入手可能な場合は比較表を示す。
「この提携により、情報の集中ソースを設け、組織が良いクラスタ決定を模索するとき組織の代理人として行動する働きをする」と Cluster Resources社社長マイケル・ジャクソンは言う。
Cluster Resourcesは、広範なクラスタ環境をカバーする数千のサイトに対し特有の仕事量ソリューションを提供する。Cluster Resourcesは、この無料サービスの提供に当たりこの経験を梃子にする。クラスタ見積サービスは、クラスタ構築過程に明るくない組織だけでなく、処理を加速したいだけの熟練さいとにもまた価値がある。
Cluster Resourcesについて
Cluster Resources社は、仕事量とリソース管理ソフトウエアと、クラスタ、グリッド及びユティリティベースの計算環境に関するサービスの主要プロバイダである。十年以上の産業経験からCluster Resourcesは革新と投資回収のリーダーと認められている。当社は、組織がそのコンピュータ資源を理解し、制御し目的に合わせるため完全に最適化することが出来るようにするソフトウエア製品とサービスを販売する。詳細については(801) 873-3400または(888) 221-2008に電話するか、
http://clusterresources.com/.を訪ねられたい。
LinuxHPC.orgについて
LinuxHPC.orgは、システム管理者、アーキテクター、開発者及びビジネスライン管理者のサイトで、最新の産業ニュース、事件、調査材料、クラスタとグリッドに関する見積サービス、クラスタに関する高性能技術計算に関連するメールリストとリンクを提供する。詳細については
http://www.linuxhpc.org/.を訪ねられたい。
プロセス間通信(PC)は、主としてプロセス間の連絡を便利にする技術とマシンを扱う。プロセス間の連絡のため別個に専用のマシン又は技術を必要とする理由は何だろうか?このような専用マシンを使用しないで、二つのプロセスの間で情報を共有することが出来ない理由は何だろうか?
主な理由は、プロセスは利用することのメモリを用いて互いに連絡することが出来る。しかし、このときメモリは完全にOSが管理する。プロセスは実行のため利用することのメモリの一部を割当てられる。このとき、各プロセスは独自のユーザ空間を有する。一つのプロセスに割当てられるメモリを、別のプロセスに割当てられるメモリと重ね合わせる方法はない。
プロセスとは? プロセスが連絡を必要とする理由は?
シーケンシャル・プロセス、短く言うとプロセスは、単に作動中のプログラムである。プロセスは、プロセス内に同時進行がなく、あらゆることが次から次に起こるので、シーケンシャルである。プロセスとプログラムの区別は重要である。プロセスはプログラム以上のものである。例えば、何人かがUNIX上で 'cat' を走らせるとき、それぞれが同一プラグラムを走らせるが、それぞれは別のプロセスを有している。また、単一のプログラムは実行されるとき、幾つかのプロセスを作ることが出来る。
コンピュータの一部で、プログラムを走らせる作用を実行するものは、プロセッサと呼ばれる。最新コンピュータの多くは一度に多数のプロセスを走らせることが出来る。単一プロセッサを有するコンピュータ上で、これはプロセスを数十又は数百ミリ秒など一定時間だけ走らせておこなう。プロセスの時間が切れると、そのプロセスの状態をセーブして、別のプロセスを走らせる。単一プロセッサ上でプロセスの間を急速に切り替えることを、マルチプログラミングと言う。コンピュータ・システムに一つより多いプロセッサがあると真の意味の平行運転が可能になる。何れの場合も、プロセスは、プリンタ、ファイル、メモリ、レジスタなど共通リソースを共有する。
プロセスが中断を必要とする理由?
UNIXシェル・コマンドを考える
who | wc -l // returns the number of users on a computer
この例では、プログラムの出力 'who' が 'wc' プログラムに渡される。つまり、プロセスは連絡しなければならない。これらはデータを共有するだけでなく、プロセスの状態が互いに依存する。'wc' プロセスは走る前に入力を必要とする。これは、第二プロセスが始まる前に第一プロセスが走らなければならないことを意味する。言い換えると、第二プロセスは、第一プロセスの入力を獲得するまでブロックしなければならない。プロセスは続けることが出来ないときブロックする。この場合は入力を待っている。
プロセスは任意の時刻に、以下の三つの状態の何れか一つにあることが出来る。
1.入力のためプロセスがブロック
2.スケジューラが別のプロセスを取上げる
3.スケジューラが今のプロセスを取上げる
4.入力を利用出来るようになる
www.qmailrocks.orgの上の指示にしたがって、結局QMailの設定を終わった。長い道のりだったが、全部上手くいった。こうして私のIMAPサーバは、POP3 とSquirrelmailを働かせた。朝5時に寝て昼の2時に目を覚ましたら、ボックスが全く上手く働かない。モニタには沢山のI/Oエラーが出ている。
「小さい問題」だと思って、マシンを再起動したら「ファイルが見付かりません・・・」などのI/Oエラーが出る。兎に角「デバイスhdaが理解しない:未知」のためボックスを立ち上げることが出来ない。このマシンは、プログラムされていなければエラーを告げることを知らないのは請け合う。兎に角、裏技かデバイス/ideコントローラ故障の範囲まで狭めようと努力している。良いシステムツールがあるので、ライブLinux CDを焼付けて、syslogs、apache ログ、QMailログを点検する。メールサーバとウェブサーバを同一ボックスにするのは良くないことが分かった。だが、別の二つのマシンに分けるためのメモリ又は部品がないときは、どうするのだろう。
兎に角、私のシステムの場合、最初に戻って、この経験から学んだ最良のことは、メールサーバとウェブサーバは絶対に同一ボックスにいれないこと!だ。特に、ボックスが5年以上前のもので、P3 650 MHz, 256 MB ram, 10 GB HDノートパソコンの時は、入って来る迷惑メール全部を処理しようとしてドライブが死んでしまう。別のボックスにウェブサーバをセットアップして助けられるものは助けようとしている。今回はもっと長く働くと良いが。