OCW「データベース」(上智大学)

大学の公開している日本語の講義はいろいろあるのだが、内容が一部だけではなく役に立つものと言うと、あまりないように思える。 また、そのような講義がまとめられている物も見つけられない。

上智大学理工学部「データベース」は、 データベースとSQLについて全く知らなかった時期に、SQL ゼロからはじめるデータベース操作を 読むのと同時に視聴して大変役に立った。

スウェーデンとElsevier

Sweden ends contract with science publisher Elsevier, moving for open access for scientific articlesによると、 2018年6月30日から、スウェーデンの研究者は、Elsevierの学術雑誌に投稿したり、論文を閲覧したりできなくなるらしい。 商業的な学術雑誌ももう少しリーズナブルな価格になって欲しい。 オープンアクセスであれば、確かに私は助かるが、継続性があるのか良く分からないので。

Windowsマシンのuptimeを知る方法

どうやら、uptime(1)コマンドにそっくりなものは、Windowsの標準機能にははないようだ。 その代わり、以下のようにすると、起動時刻を知ることができる。


> net statistics server
\\client1 のサーバー統計情報


統計情報の開始日時 2018/05/15 6:43:10


受け付けたセッション           1
タイムアウトしたセッション     0
エラーが発生したセッション     0

送信バイト数 (KB)              0
受信バイト数 (KB)              0

平均応答時間 (ミリ秒)          0

システム エラー                0
アクセス許可違反               0
パスワード違反                 0

アクセスしたファイル           0
アクセスした COM デバイス      0
スプールした印刷ジョブ         0

バッファーのオーバーフロー回数

  ビッグ バッファー            0
  リクエスト バッファー        0

コマンドは正常に終了しました。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#7

セマフォ

前節の排他制御の方式は、現実のシステムには適用しにくい。また適用するにしてもビジーウェイティングを使っているので、ごく短いクリティカルセクションへの利用に限定されるべきである。

より一般的な排他制御として、セマフォを導入する。

セマフォはプロセス間通信の伝達に使われる整数型の変数である。

セマフォは、0と1以外の値も取ることができ、より多くの情報を伝達できる。

セマフォは一般に、イベント変数と呼ばれるプロセス間の共通変数の一種である。

セマフォの変数へのアクセスも排他制御が必要である。

プロセス間で伝達されるイベントには以下が含まれる。
(1) プロセスがクリティカルセクションに入った。
(2) プロセスがクリティカルセクションから出た。
(3) 新しいプロセスが始まった。
(4) 入出力操作が始まった。
(5) 入出力操作が完了した。
(6) メッセージを受け取った。
(7) リソースを受け取った。
(8) リソースを開放した。

イベント変数は、
(1) イベントの履歴を記録するデータ構造(整数型の変数)。
(2) イベント変数の待ち条件が満たされるのを待っているプロセスの待ち行列。
からなる。

セマフォにはP命令(wait命令)とV命令(signal命令)が定義される。

P命令は、引数SについてS≧1が満たされるまでプロセスを一時停止させるのが役割である。もし、S≧が満たされていればSを1減らしてプロセスは継続する。

V命令は、引数Sのセマフォの待ち行列で待っているプロセスの中から1つが選ばれ、実行可能状態に移行させる。ディスパッチャーは実行可能プロセスから1つを選び実行する。もし、Sのセマフォの待ち行列が空であった場合には、Sは1増加させられVを実行したプロセスは続行される。

P命令とV命令は、セマフォを提唱したダイクストラの母語であるオランダ後のPasseren(パスを許す)とVerhoog(起こす)に由来する。

P命令とV命令はそれぞれ分割不可能でなくてはならない。つまり、ひとときにはある1つのセマフォに対して、1つのPまたはVしか実行できない。

P、V、ディスパッチャーは、いずれも共通データである待ち行列を操作するので、排他制御を必要とする。

pkgsrc/www/firefoxがNetBSDではすぐにクラッシュする件について

multiprocess windowの有効なpkgsrc/www/firefoxがすぐにクラッシュのは、 そださんの報告されている PR 53273 が原因とのこと。

Chromiumも同じような問題があったように思うので、どうにかして直して欲しい。

browser.tabs.remote.autostartを無効化しておけば(falseにしておけば)、multiprocess windowは無効にできる。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#6

並列プロセス

プロセスがCPUディスパッチャーにより同時実行されると、互いに作用し干渉し合う。例えば主記憶やI/Oを取り合うかもしれないし、同一のファイルに同時に書き込もうとするかもしれない。

相互作用や干渉は、意図的/偶発的、協調的/競合的に起こり得る。

プロセス間の相互干渉は、正しい制御化におかないと好ましくない状況を招く。

プロセス間の相互干渉は、
* プロセス間通信
* プロセス同期
* プロセス統合
などとして研究されている。

プロセス間の相互交渉は3種に分類できる。
(1) 協調
    複数のプロセスが相互に情報交換を行いながら、共通の目的のために処理を進める。
(2) 競合
    リソースを取り合うといったように互いに他のプロセスの存在を意識しなくてはいけないが、自分の処理のためには他のプロセスは不要な場合。
(3) 干渉
    相手のプロセスの中断など、はっきりと他のプロセスに影響を与える場合。

例えば、整合性を保ってクリティカルセクションまたはクリティカルリージョンは、分割不可能にする必要がある。

クリティカルセクションは混合して実行されることがないようにする。これにより、共通変数の読み書きは1つのプロセスしか実行できないようになる。

共通変数へのアクセスを同時に1つのプロセスに限ることを排他制御または相互排除と言う。

2つのプロセスがメッセージをやりとりする機構を、メッセージ転送またはメッセージ交換と言う。

タイムシェアリングシステムでもマルチプログラミングシステムでも、他のプロセスを一時停止させる必要が生じることがある。例えばメモリーコンパクション(主記憶内の小さな空き領域を大きな空き領域にするために、主記憶内でプログラムを動かすこと)や、スワップアウトする場合である。

排他制御はプロセスの競合を正しく行うのに必要であり、次の3つの要求を満たさなくてはならない。
(1) クリティカルセクションを実行しているプロセスが1つもない時、クリティカルセクションに入る要求をしたプロセスは、ただちに許可を与えられなければならない。
(2) 2つ以上のプロセスがクリティカルセクションに入ろうと争っているR時、その選択は無期限に延期されてはならない(デッドロック防止)。
(3) いかなるプロセスも、あるプロセスがそのクリティカルセクションに入るのを無期限に妨げることはできない。すなわち、プロセスは皆クリティカルセクションに入る機会を公平に与えられるべきである(公平条件)。

排他制御を実現する方法は、ハードウェアに依存する。

排他制御を実現する方法の1つは、誰からクリティカルセクションに入っているというフラグを用意する方法であるが、フラグの上げ下げが共通変数の読み書きと同じ排他制御を必要としうまく行かない。

このような排他制御が再帰的に必要になるのは、ハードウェアが提供する基本的な排他制御の仕組みがないと解決しない。

基本的な排他制御を得るためのDekkerのアルゴリズムは、2つのプロセッサー上で2つのプロセスが動いている場合だけではなく、同一プロセッサー上で動く2つのプロセスでもラウンドロビン的に切り替えられていれば利用できる。またn個のプロセスに拡張することもできる。これは、STORE命令は割り込まれなく完了することが保証されていることに依存している。

Dekkerのアルゴリズムは、優先度やCPU数を考慮すると、アルゴリズムがかなり複雑になる問題がある。

Dekkerのアルゴリズムは、ビジーウェイティングでクリティカルセクションに入るのを待つのがCPU時間を浪費するので大きな問題となる。

よってDekkerのアルゴリズムやその変型・拡張は、実際には利用されない。実際には違う排他制御の方法がとられる。

ユニプロセッサーシステムの場合には、プログラムの実行が中断されるのは、割り込みが生じた時だけである。よってクリティカルセクションを割り込み禁止にすれば良い。割り込み禁止中に生じた割り込みは、禁止の解除後まで待たされる。

マルチプロセッサーシステムの場合には、割り込み禁止だけでは、排他制御を実現できない。

Test and Set (TS)またはSwap (SW)と言うハードウェア命令が必要となる。

TS命令もSW命令も実行は分割不可能でなくてはいならない。つまり、TSもSWも同時に1個のCPUでしか実行されないと、ハードウェアとして保証されなくてはならない。

TSもSWも他の命令の組み合わせで実現することができない。

TSまたはSWにより、再帰的に必要となる排他制御を止められる。

TS M, Rは、主記憶の番地Mの内容をレジスターRに入れ、Mに1を入れる。これでフラグを上げたことになり、STORE ZERO MでMに0を入れフラグを下げる。

SW M, Rは、主記憶の番地Mの内容をレジスターRに、Rの内容をMに入れる。これで、M≠0ならばフラグを上げていることになる。

フラグを上げる前に割り込みを禁止し、クリティカルセクションを実行して、フラグを下げた後に割り込み禁止を解除するのは、疑似デッドロックを防止するためである。

疑似デッドロックとは。CPUの数がプロセスの数よりも小さいとき、CPUがクリティカルセクション内にいる優先度の低い優先度のプロセスから取り上げられて、優先度の高いプロセスの排他制御待ちのループに割り当てられるが、低い優先度のプロセスがクリティカルセクションを出てMを0にしない限り、優先度の高いプロセスの待ちのループは終了せず、永久に待ちが解消しない現象のことである。

階層的に排他制御を利用すると、最も小さな(最も短い時間間隔の)排他制御を用いて、より長い時間間隔の排他制御を実現することで、最も小さな排他制御以外では、ビジーウェイティングを必要としないようにできる。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#5

CPUスケジューリングとオペレーティングシステム

CPUスケジューリングは、ハードウェアに一番近いレベルの仮想化である。

CPUスケジューリングより上のレベルでは、CPUを獲得したり開放したりといったことを考慮する必要はなく、各プロセスが仮想CPUを独占しているように振る舞うと考えて良い。

CPUスケジューリングはショートタームスケジューリングとも呼ばれる。

コンピューターシステムは、循環型待ち行列システムとみなせる。

ロングタームスケジューリングは、ジョブの起動やスワッピングを行い、どのジョブが主記憶に入るのを許されるか、つまり、循環型待ち行列システムでショートタームスケジューリングによりCPUを割り当てられるようになるかを決める。

ミディアムタームスケジューリングは、ページングのレベルのもので、ページフォルトを生じたジョブは、循環型待ち行列システムのI/O待ち行列に入れられる。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#4

スケジューリング方式

基本的なスケジューリング方式
(1) 到着順(FCFS))
(2) 処理時間順(SPT)、残っている処理時間の短い順(SRPT)
(3) 優先度順
(4) アラウンドロビン
(5) フィードバック待ち行列(フォアグラウンド・バックグラウンド待ち行列)(FB)

プロセスとジョブを基本的に同一視する。

性能評価基準
(1) 応答時間
    タイムシェアリングシステムや対話型システムではレスポンスタイムと言い、バッチシステムではターンアラウンドタイムと呼ぶ。
(2) スループット
    単位時間に処理するジョブの数で、CPUなどのデバイスの利用効率に比例する。


ラウンドロビン方式では、かかる時間の短いジョブが優先されることとなる。

SRPT方式はSPT方式の変形である。

SPT・SRPT方式は、平均応答時間を最小にする。

スケジューリング方式によって、応答時間は大きな影響を受ける。

一般に、応答時間を短くするという要求と、利用効率を改善するという要求は相反する。

自分でスケジューリングをやってみた。
同一のスケジューリング方式の下では、応答時間と利用効率は、ほぼ反比例の関係にある(単一サーバーシステムでも、マルチサーバーシステムでも)

単一サーバーシステムとは、CPUやI/Oなどの能動的な入出力機器が1個のシステムを言う。

マルチサーバーシステムとは、複数個のサーバーを持つシステムを言う。

マルチサーバーシステムでは、サーバー間で干渉が起こる(1つのサーバーにジョブが集中してしまい、他のサーバーが遊んでしまう)ことにより、無駄な待ち時間が生じてしまう。この待ち時間をスケジューリング方式によって減少させられれば、応答時間の減少と利用効率の向上を同時に実現できる。

マルチプログラミングの主要な目的は、リソース利用の向上またはジョブのスループットの増加である。

一般に、マルチプログラミングは利用効率(ジョブのスループットと比例する)を最大にすることを目的とする。

一般にタイムシェアリングシステムは応答時間を最小にすることを目的としている。

利用効率と応答時間以外の性能評価基準
(1) 予測性
    平均としては短いがばらつきの大きな応答時間より、安定した応答時間が好まれることもある。
(2) 公平性
    あるジョブが無期限に塩基されるのは不公平である。しかし一般に、システム全体の性能を向上させることと、個々のジョブを公平に扱うことは相容れない。
(3) グレイスフルな終了(段階的な終了)
    過負荷になったとき、突然動かなくなるのではなく、段階的に性能を落とすべきである。

FCFS方式

公平で単純であるが、応答時間が非常に大きくなるため、タイムシェアリングシステムには適さない。

プリエンプションのない方式である。


SPT方式

平均応答時間を最小にする方式である。利用効率を向上させることも多い。

しかし一般に、そもそも前もってジョブの処理時間を知ることはできない。

プリエンプションと組み合わせると良い。これはSRPT方式である。SRPT方式は、新しいジョブが到着するたびに、実行中のジョブも含め、全てのジョブにSPT方式を適用する。

プリエンプションは、CPUの場合にはコンテクストスイッチングのオーバーヘッドを伴う。I/Oの場合には、実際には中断はできない。つまりプリエンプションは適用できない。

入出力処理は処理時間の予測ができることが多く、これについてはSPT方式を適用できる。

プリエンプションとは、実行を一時中断し、他のジョブを実行する方式である。


優先度順方式

各プロセスに優先度を与え、その優先度の順に実行する方式である。

良く使われる優先度の付け方は、リアルタイム・プロセス、オペレーティングシステム・プロセス、対話型ジョブのプロセス、バッチジョブの順に優先度を割り当てる。

いったん設定されら優先度が変化しない静的優先度順方式と、実行中に優先度を変える動的優先度順方式がある。

動的優先度順方式は、システムの性能向上のために用いられる。

動的優先度順方式には、SPT方式が含まれる。これは短いジョブに高い優先度を与える。

優先度の低いジョブは、無期延期(スタベーション)の状態に陥ることがある。これに対してエージング(ジョブの待ち時間の長さに比例して優先度を上げる方式)が対策としてある。


ラウンドロビン方式

クオンタムを無限に大きくすれば、FCFS方式となり、クオンタムを小さくすれば、処理時間も短いプロセスが優先される。

クオンタムを非常に小さくすると、実行可能な各プロセスは、みな平等に扱われるようになり、処理時間は、要求されたCPUサービス時間に比例するようになる。このような状態は、プロセッサー分割方式と呼ばれる。

ラウンドロビン方式は、対話型ジョブの応答時間を短くするために開発された。

クオンタムを適切に選べば、適度な応答時間を保証できる。


FB方式

多段のラウンドロビン方式である。」

FB方式は短いジョブをラウンドロビン方式よりさらに優先して扱う。

スタベーションの問題も存在するので、エージング等で対応する。

FB方式、ラウンドロビン方式は、タイムシェアリングシステムだけでなく、マルチプログラミングシステムにも有効である。

統計的には、CPU処理時間はCPU処理の実行が長引けば長引くほど、完了するまでに多くの時間を必要とする。つまり、新しいCPU処理は高い確率ですぐに終了する。これを考慮するのがFB方式である。


入出力ジョブ優先方式

あるPCU処理が非常に長くかかると、他のジョブがCPUサービスを受けられない状態が生じる(ブロッキング現象)

これに対して、CPU処理の短い、つまり、I/O処理の割合の大きいジョブ(入出力ジョブ)を優先することで対応する。

入出力ジョブを優先する理由
(1) CPU処理によるブロッキングを避ける。
(2) 入出力ジョブの多くは、ユーザーがジョブを準備するためのものであるため、優先して実行する必要がある。

実質的に、入出力ジョブ優先方式は、CPU利用効率を高める。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#3

CPUスケジューリング

プロセスは、
(1) 実行中
(2) 実行可能
(3) 待ち状態
のいずれかの状態になっている。

CPUスケジューラー = ディスパッチャーである。

あるプロセスに割り当てられた時間をクオンタムと言い、クオンタムが終了すると、実行中から実行可能状態に移行させられる。

クオンタムは、タイムクオンタム、タイムスライス、量子時間とも言う。

待ち状態は、ある条件(I/Oや他のリソースが空くのを待つなど)が成立していないといけない時にとる状態を指す。

実行可能状態から待ち状態への移行は、プロセス自身によってなされる。

待ち状態から実行可能状態へは、他のプロセスからのSIGNAL命令によって移行させられる。

SIGNAL命令とは、他のプロセスを起動させる(実行可能状態にする)命令である。

プロセスは3つの状態それぞれのキューに入っている。

プロセッサーの数に依らず、この考えは適用できる。

CPUをあるプロセスから別のプロセスに切り替える方式は2つある。
(1) イベントドリブン
(2) タイムスライシング

イベントドリブンとは、システムの状態が変化したのを、割り込み機構により切り替える方式である。

割り込みで割り込まれたプロセスは、割り込まれたことを感知しない。

タイムスライシングは、時分割とも言う。

タイムスライシングでは、システムの状態変化とは無関係にプロセスを切り替える。

タイムシェアリングシステムの実現には、タイムスライシングが必要である。

タイムスライシングでは、インターバルタイマーにより、ウオンタムが終わったら割り込みを発生させる。

マルチプログラミングシステムの性能を向上させるためには、イベントドリブンにタイムスライシングを組み合わせることが効果的である。

マルチプログラミングは、イベントドリブンのみで実現できる。

マルチプログラミングにタイムスライシングを導入すると、性能が向上する。

タイムシェアリングシステムにイベントドリブンを導入すると、リソース利用効率を向上できる。

各プロセスは見た目上はCPUを独占しているようであり、このようなCPUを仮想CPUと呼ぶ。

仮想CPUは、実際のCPUよりも実行速度は遅いが、独自のレジスターを持ち全ての命令を実行できるCPUととらえて良い。

システムコールは、I/Oを要求する等のために呼ばれるもので、スーパーバイザーコール(SVC)によって行われる。

スーパーバイザーコールは、割り込みを発生させる特別の命令である。

プログラムステータスワード(PSW)は、プログラムカウンターを含んでいる。

システムコールや割り込みが発生すると、割り込み処理ルーチンが実行され、割り込み処理ルーチンは、CPUレジスターの内容を保存し、プログラムステータスワードの内容はハードウェアにより自動的に保存される。

元のプロセスに戻すことは、レジスターの内容とプログラムステータスワードを元の状態に戻すことにより可能である。

オペレーティングシステムの各(ニュークリアスまたはスーパーバイザー)は、マスターモードまたはスーパーバイザーモードで実行される部分を言うことが多く、CPUディスパッチャー、プロセス間通信機能、入出力スーパーバイザー(入出力機器等のモニター)、割り込み処理ルーチンなどを含む。

マスターモードとは、全てのリソースにアクセスできるCPUの実行モードであり、スレーブモードはリソースへのアクセスが制限される。

割り込み処理ルーチンは、割り込みの種類ごとに用意されることが多い。

プログラムステータスワードは、CPUレジスターの一種であり、プログラムカウンター、割り込みコード(割り込みの理由)、割り込みマスク(各割り込みの種類に対して、その割り込みを禁止すべきか否かを指定するビット列)、実行モードを含む。

プログラムステータスワードは、いくつかのうレジスターに分散していることもある。

割り込みの種類
(1) スーパーバイザーコール割り込み
    スレーブモードで実行されるプログラムが、核のサービスを利用する時は、スーパーバイザーコール命令により要求する。スーパーバイザーコールで割り込みを発生させると、割り込み処理ルーチンを経由して、核に制御が移る。
(2) 入出力割り込み
    I/O操作が完了すると発生する。割り込みコードとして正常終了か否かと、エラーの場合にはエラーの種類を記録する。
(3) プログラムチェック割り込み
    オーバーフロー、ゼロによる除算、特権命令のスレーブモードでの実行、記憶保護違反などプログラムの様々なエラーにより発生する。
(4) マシンチェック割り込み
    ハードウェアの障害で発生する。
(5) 外部割り込み
    インターバルタイマーの終了、他のプロセッサーや外部センサーからの信号などから発生する。
(6) リスタート割り込み
    リスタートボタン押下や他のプロセッサーからのリスタート信号により発生する。

各割り込みに対して、割り込み処理ルーチンの開始番地とその実行に必要な情報を保持した、プログラムステータスワードの内容な用意されている。

コンテクストスイッチングとは、スレーブモードのプログラムがスーパーバイザーコールを実行した時に、プログラムステータスワードが入れ替わって、スレーブモードのプログラムから、スーパーバイザーコール割り込み処理ルーチンに、CPUの動作が切り替わりこと、または、逆の操作をして、スーパーバイザーコール割り込み処理ルーチンからスレーブモードのプログラムに戻ることを言う。

プログラムステータスワードは割り込みの種類ごとに用意されているので、1つの割り込みの処理中に、別の種類の割り込みが発生しても良い。

プロセスを実行するのに重要で、頻繁に参照されたり、変更したりする情報は、主記憶内のデータ構造に保持される。これをプロセス制御ブロック(PCB)またはプロセス状態ブロックと呼ぶ。

プロセス制御ブロックに通常含まれるものは以下の通り。
* CPUレジスターの内容(プロセスが実行中でない時)
* プログラムカウンターの内容(プロセスが実行中でない時)
* 現在のプロセスの状態(実行中、実行可能、待ち状態)
* プロテクションの状態(主記憶のアクセス制御に関する情報)
* プロセスの名前
* プロセスの優先度
* 実行時間(CPU時間)
* 仮想記憶についての情報(仮想記憶の位置など)

プロセス制御ブロックは、オペレーティングシステムが必要とする全ての情報が保持され、常駐領域に置かれる。

常駐領域とは、オペレーティングシステムの核が永久的に占めている主記憶内の領域を言う。

実行中、実行可能、待ち状態の各キューは、プロセス制御ブロックを要素とする行列として管理する。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#2

第1章 オペレーティングシステムとは

コンピューターの分類をしている箇所があり、その中の一つとして「実時間処理用コンピューター」と言うのが挙げられている。 今の状況で考えると組み込み用のコンピューターのことを指していておかしくないのだが、なんとなく、ここでは違うものを指している ような気がする。しかしプロセス制御用コンピューター(process computer)と言うのも別に挙げられているため、 これとは違うと考えると、やはり組み込み用途のものを指していると考えるべきかもしれない。

バッチ処理、オンライン処理(リアルタイム処理とも言うと書かれている)、タイムシェアリング処理、分散処理というように、 ジョブの処理形態を分類してる箇所がある。 そこで、オンライン処理では「保安性」に細心の注意を払う必要があると書かれている。 保安性という用語は、少なくとも現在では一般的な用語ではないように思われる。 システムの運営に、信頼性と並んで必要なものとして挙げられているため、可用性を指しているのかもしれない。

「プロセス」の定義を「ユーザーの代理」として、これが現代のオペレーティングシステムを考える上では最も適切であるとしている。 「実行中のプログラム」と言う定義は、歴史の初期のものとされている。 プロセスを「ユーザーの代理」とする定義が現在主流であるような気がしないのだが、この書籍ではこのような定義であることをきちんと覚えておきたい。 ちなみに「オペレーティングシステムの基礎」大久保 英嗣 著(1997年刊)という書籍が手元にあるが、プロセスは「特定の仕事を遂行するために一連の操作系列を実行する活動のこと」としている。

オペレーティングシステムの定義として「ハードウェア資源であるCPU、主記憶、二次記憶、入出力機器をユーザーが必要とするだけ仮想的に作り出し、 しかも場合によってはそれをハードウェアそのものよりも使いやすい形で提供する」ものとしている。 そして、これを「仮想化」と呼びこととしている。この書籍はこの仮想化について述べているとしている。

岩波講座 ソフトウエア科学6「オペレーティングシステム」#1

最初にコンピューターを使ったのはFujitsu Micro 8 (FM-8)だった気がする。 F-BASICしか使わなかった。 次にはエプソンQC-10IIというCP/Mか何かが動くマシンを使った記憶もある。 私が最初にOSとして独立したものを使ったのは、このCP/M風のものだったのだろう。
あれから30年以上、コンピューターとオペレーティングシステムを使っている訳だが、 コンピューターについても、オペレーティングシステムについても、 良く理解しているとは言えないように感じている。 コンピューターサイエンスについてもちゃんと体系的に学ぶ機会はなかった。 だが、オペレーティングシステムについて、学びたいとは長く思っていた。
今、手元に「岩波講座 ソフトウエア科学6『オペレーティングシステム』前川 守 著」と言う 35mmほどの厚さの書籍がある。 これの全てを理解することを目標に、読んでいきたい。

「まえがき」について

一般のユーザーの言うオペレーティングシステムは、以下ようなものが含まれているらしい。
  • ユーザーインターフェイス
  • ウィンドウシステム
  • ネットワーク機能
  • リアルタイムシステム機能
  • エディター
  • 文書処理機能
  • コンパイラー

ここで、分からないのは「リアルタイムシステム機能」である。 「エディター」と「文書処理機能」は、UNIXを意識したものであろう。 UNIXにはedやviといったエディターがあるし、 文書処理ソフトウエアであるroffはUNIX V7にも含まれていたはずである。
リアルタイムと言うと、最近の文脈で言えば、リアルタイムオペレーティングシステムというのがある。FreeRTOSやRTEMS、eCosなどである。 思い出すと、UNIXにもUNIX-RTやUNIX-RTRというのがあったので、それを意識してのことかもしれない。
だが、少なくとも現在では、RT-LinuxやINTimeなどはあるものの、汎用オペレーティングシステムにリアルタイムオペレーティングシステムの機能は含まれないと言って良いように思う。INTimeは使われている製品を使ったことはあるが、Windowsとどう統合されているか分かっていないので、的外れかもしれないが。
一方で、NetBSDでもlibrt (POSIX Real-time Library)というのはあって、 sem_init(3)などはここで実装されているのである。 もしかしたら、ここでのリアルタイムシステム機能とは、 librtのことを言うのかもしれない。
「(オペレーティングシステムの構築の)各となる技術は、 実用的なシステムを大きな誤りをおかさず構築できるようになった、 と言う意味で、一定の水準に達したと言うべきであろう」 とも書かれている。 また「ただし、その技術は飽和点に達したということではなく、 実用的な意味で一定水準に達したというこである。 今後、画期的な技術が出現し、オペレーティングシステムの構築法が 根本的に変わることを否定するものではない。」とも書かれている。 この書籍に書かれた概念が変わるような画期的な方法が既に出現している のであれば、この書籍を読む意味はあまりないのかもしれない。 それが分かった時に読むのを止めれば良いだけであるので、気にするのは 止めておこう。
「並列処理とその制御が基本となっている。この並列処理は通常のプログラミング ではあまり出現しないものであり、オペレーティングシステムのむずかしさの 主たる原因にもなっている。」という記述もある。 まず、並列処理とは何であろうか。 ここで気になるのは、ここでは登場していないが「並行処理」という用語も 存在していると言うことである。この書籍の目次には、「並行プロセス」「コンカレントプログラミング」「マルチプログラミング」という用語も登場している。
並行処理から並列処理へというウェブページによると、 「並行処理の目標は…CPU使用率を上げてパフォーマンスを向上させること」とある。 また、「単一コア・システムの時代、並行処理は非同期処理に関連して理解されて」 いたとの記述もある。 今は知識が乏しくここで出現した「並列処理」と言う用語を明確には把握できない。 読み進めて行くにあたっては注意することにしよう。 いずれにしても、現在はマルチプロセッサーが当然の時代であり、マルチタスクで複数のプロセスを実行するのも、複数スレッドも使用するのが当然になっているように思う。 私にはスレッドはうまく理解できていないが、それは別の話である。 もし、複数プロセス、複数スレッドが理解の障害になるのだとしたら、それを解説する書籍は、現在は数多く存在するはずである。
そして、この書籍は「核技術」を扱い、 ユーザーインターフェイスやウィンドウシステム、 エディター、文書処理などは含まないそうである。 いわゆるオペレーティングシステムのカーネルの実現する機能のうち、 ネットワーク機能を除いたものを説明して行くようだ。
分からなかった箇所について、調べたこと、理解したことを書いて行くことにしよう。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...