Section Next | Prev | Index | 凡例
*例によって、当時の作者の思い違いがあるかもしれないので 鵜呑みにしないように
そこでファイルの最初の一文字目がコメント(#)の場合は、csh とし、
何も実行しない命令 : コロン、NOP(No Operation) は bsh とするよう
csh に修正が加えられました。
言い替えると得に指定しない場合は bsh を正とする運用となりました。
さらにシェルのバリエーションが増えてきたため、コメントを拡張し #! に続けて 実行すべきシェルプログラムのパス名を指定するという現在の仕様になりました。
なお、コメント(#)とNOP(:)は見た目は何も実行されませんが、コメントが読み飛ばさ れるのに対し、NOPは構文解析を行うため若干オーバーヘッドが発生します。
シェル | (a)#の結果 | (b):の結果 | (b)/(a) | 備考 |
---|---|---|---|---|
ash(bsh) | 0.32s | 4.06s | 12.68 | (a)はコメント(#)だけを100万行用意したスクリプト。 (b)はNOP(:)を同じく用意したスクリプト。 各シェルで time を使い時間を測定、それを5回繰り返した平均を採用。 |
bash | 2.89s | 21.90s | 7.57 | |
ksh | 1.80s | 6.76s | 3.75 | |
tcsh | 9.37s | 23.26s | 2.48 |
つまり伝統的な UNIX では、利用できるメモリの過半数を使用するようなプロセスが、 分裂しようとすると、メモリ不足で分裂できないとう致命的な欠陥がありました。 現在では、ヒープ領域やテキストエリア(プログラムそのもののイメージ)は複写せずに 新しいプロセスを生む方法や、そもそもプロセスではなくその中でプロセスコンテキストや CPUリソースだけを複写するといった、スレッドの概念を導入することで性能を上げて います。
実際にOSが持つべき機能と、サブシステムやAPIが持つべき機能をどう分割するか? という議論はコンピュータ創造期から存在しています。 FORTRAN-III はモニターと呼ばれる必要最小限のBIOS相当の機能を持っていましたし、 MULTICS は PL/1 とあいまって、何でも万能にとりこうもと肥大化しました。 それをうけて UNIX(当時は UNICS) は必要最小限、Simple is best で発展しましたが、 BSD でネットワーク部分をカーネルに取込んでしまい、 その後 NFS が一般化されると多機能なカーネルの問題が露呈し、 より小さなカーネルが求められていました。 その頃から開発が始まった GNU Hurd OS が、30年近くたってもなお、正式リリースされている無いことから、非常に難しい問題だと言えます。
$ cat max.c #include <sys/types.h> #include <unistd.h> main() { printf("Max groups:%d\n", sysconf(_SC_NGROUPS_MAX) ); printf("UID size:%d\n", sizeof(uid_t) ); } $ make max cc max.c -o max $ ./max Max groups:65536 UID size:4
Section Next
| Prev | Index | 凡例