top of page
2024年08月25日
おはようございます。
・・・
間もなく実質的な講義を開始いたします。
最初に「リアルタイムOS」分野から始めます。
「リアルタイムOS」の仕組みは極めて複雑です。
「何も、こんな複雑なコトから始める必要なんてないじゃないか!」というお話が聞こえてくるように感じます。
「リアルタイムOS」の中でも「μiTron」と呼ばれるモノを最初に使用致します。
次に、AzureRTOS、FreeRTOSについて解説を行います。
何故「μiTron」から始めるのかと言えば、お話が長くなります。
しかし、このOSを理解することができれば、WindowsやLinux、その他のリアルタイムOSを比較的容易に理解できるようになるためです。
どのように、WindowsやLinuxの内部が構成されているのか理解できるという意味です。
これさえ分かれば、この上に存在するアプリケーションも比較的容易に理解できるようになります。
「急がば回れ」なんです。
今回、テキストとして「図解μiTronによる組込みシステム入門」及び「基礎から学ぶ組込みμT-Kernelプログラミング」と言う書籍を使用したします。
しかし皆さんは、これらテキストを必ず用意する必要はありません。
必要な情報は、本講義内でお伝えいたします。
いきなり上記書籍を読んだとしても、まず間違いなく理解不能です。
これらの書籍は、題目が入門、基礎と書かれてありますが、ある程度マイコンプログラムを知っている、或いはOSというモノの中身を知っている人でなければ理解できないのです。
・・・
「リアルタイムOS」は特殊なOSです。
ナノ秒、マイクロ秒単位で、プログラムの制御ができます。
しかも、多くのタスクと呼ばれる仕事を同時に行うことが可能です。
しかし、これはOSの中身を知っていなければ本来の力を発揮させることができません。
・・・
一番重要なのは「タスク(仕事)の優先度」です。
これは、一般的な仕事の進め方と同じなのです。
スケジューリングの問題なのです。
すべてのタスクには優先度が与えられています。
そして、OSは実行可能なタスクの中で最も優先度が高いタスクを実行致します。
同じ優先度のタスクが複数ある場合は、先に実行可能となったタスクから実行致します。
これはOSとアプリケーションとの関係だけではありません。
OSの中身の中でも同じようにタスクが多く存在しています。
そして、このOSの中のタスクも優先度の高いタスクから実行されます。
また、同じ優先度が複数ある場合は、先に実行可能となったタスクから実行されます。
いいですか。
優先度スケジューリングでは、各タスクに与えられる実行時間は定まっていません。
そしてタスクが実行される順番は優先度に従っているために、先に実行可能となった順番に実行されるわけではありません。
いま、ものすごく難しいお話をしています。
誰でも、先に実行できるもの(やさしいこと)から実行しようと考えます。
しかし、この優先度スケジューリングと言うモノでは、優先度が高いものが最優先で実行されます。
それが難しい問題だとしてもです。
どうしても、先に優先度が低いタスクを実行したい場合には、優先度とスケジューリングの再設定が必要となるのです。
・・・
では、どのようにして、これら機能は実現できるのでしょうか。
ここでは一つの例を挙げてみます。
「タスクA」と「タスクB」があるとします。
「タスクB」は「タスクA」よりも優先度が高いとします。
ですので、最初に「タスクB」が実行されます。
ここで、、、な、なんと!!
何とここで、優先度が高い「タスクB」が自分自身で自分自身の仕事を中断するのです!!
そして、休眠状態となります。
そうすると「タスクA」が実行可能となり、実際に実行されます。
そして「タスクA」の実行が完了したときに、「タスクA」が「タスクB」の休眠状態を解除するのです。
すると「タスクB」が実行されます。
一見、優先度が高い「タスクB」が最初に「タスクB」全てを実行するように見えますが、、、
この場合は、優先度の低い「タスクA」が実行され、そのあとに優先度が高い「タスクB本体」が実行されます。
難しい問題を解く場合には、いろいろな手順が必要となるのです。
手順を守る、規則を守る。
この部分は非常に重要な考え方です。
この手順、規則さえ守れば、大半の問題は解決できるのです。
そして、これは仕事のやり方にも通じます。
このようにして、お互いの仕事を協調しながら、信頼性を高めていくことが可能です。
人と人との信頼も同じだと思いますよ。
・・・
次に、スケジューリングと同じくらい重要な考え「排他制御」というものについて記述致します。
これも例を挙げてみましょう。
「タスクA」と「タスクB」があるとします。
「タスクA」が「タスクB」よりも優先度が高いとしてみましょう。
「タスクA」と「タスクB」との間には共有する一つの資源があるとします。
一つしか資源がないので、この資源には「タスクA」「タスクB」のどちらか一つしか獲得できません。
ここで「タスクB」が実行状態とします。
「タスクA」は実行可能状態と致しましょう。要するに「タスクA」は「タスクB」の後に生まれたと致します。
「タスクB」が実行状態にあるので「資源」を確保したとしましょう。
しかし「タスクA」のほうが優先度が高いので、即座に「タスクA」が実行状態となり「タスクB」が実行可能状態となります。
ここで問題が発生いたします。
「タスクB」が「資源」を確保しているので、「タスクA」は、この「資源」を確保できません。「資源」は一つしかないためです。
ですので「タスクA」は「タスクB」が資源を手放すまで待つしかありません。
ここで「タスクB」は「資源」を使用したのち、この「資源」を開放致します。
この段階で「タスクA」は「資源」を確保できるようになり、仕事を再開可能となります。
この「資源」は一つしかないので、共有する必要があります。
・・・
何が言いたいのかと言えば、お互いに協調する必要があるということです。
たとえ、優先度が高いタスクがあったとしても、優先度が低いタスクのために休眠する必要があったり、、、
優先度が低いタスク、或いは優先度が高いタスクが資源を独り占めせず、お互いに共有する、
・・・
これができないと、衝突が起きます。
衝突が起きない、つまり問題が起きない。
これを実現させるためには、協調性が必要となります。
これは、信頼につながります。
信頼性が高い場合、みんなからも信頼されます。
約束を守る。場合によっては譲り合う。
これができると非常に強い。
これができるシステムは非常に強く、そして皆から信頼されるでしょう。
とはいえ、中々そういう言うシステムは世の中には存在致しません。
だからこそ、極めて貴重なのです。
だから、それができるシステムは世界から尊敬されるのです。
尊敬される。。。
私も、ほんの少しは、このような事ができるようになりたいです。
bottom of page