学習のゴール
メモリ空き管理、MMUによる管理、タスク間の同期について学習しよう!
メモリ管理
メモリ管理には、メモリの空き管理と、CPUが持つMMU(Memory Management Unit)による管理の2つがあります。
メモリ空き管理
メモリの空き管理はタスクの要求に応じて、メモリの確保、解放をするものです。
タスクがメモリを要求すると、空き容量からメモリを確保してタスクにメモリを提供します。解放の場合は、空き領域の情報を更新します。
複数回のメモリ確保、解放が実行されると管理上、使用中のエリアと空きエリアが混在した状態 (虫食いのような状態)が発生します。これをフラグメンテーションと言います。
フラグメンテーションにより、連続した空き容量が確保できなくなり、タスクのメモリ管理要求に応えられないことが発生します。
MMUによる管理
MMUはCPUが持つハードウェアの機能でメモリマッピング機能とメモリ保護機能があります。
CPUによってはMMUの機能が搭載されていないことがあります。また、MMUを利用するにはOSがMMUに対応している必要があります。
メモリマッピング機能
MMUによるメモリマッピング機能は、タスクから見えるアドレス(論理アドレス空間)と実際にプログラムが格納されているアドレス(物理アドレス空間)を別々に扱い、この論理アドレスと物理アドレスを対応付けするものです。
メモリマッピング機能によりすべてのタスクの開始アドレスを固定の論理アドレス(例:0x1000番地)にすることができます。
メモリ保護機能
MMUのメモリ保護機能は、タスクがアクセスできるメモリアドレスを制限する機能です。
タスクがRTOSの領域や他のタスクの領域にアクセスできると、プログラムの不具合などでデータや命令を破壊してしまいます。
これを避けるため、タスクのアクセス先を常にMMUが監視し、アクセス違反があれば例外を発生させてRTOSにタスクを停止させます。
タスク間の同期
複数のタスクが連携して機能を実現する場合には、タスク間で待ち合わせが必要になることが頻繁にあります。
タスクが別のタスクから送信されるイベントを待つことを同期と言います。また、1つのフラグで複数のタスクの同期を行う機能が用意されており、この同期機能をイベントフラグと呼びます。
▼ 同期の役割
タスクを労働者と考えると、マルチタスクは複数の労働者と考えられます。
普段は異なるミッションをこなしていますが、お互いにコミュニケーションを取ることでミッションが円滑に進む場面もあります。これが同期です。
動作の流れは次の通りです。
- イベントの発生を待つタスクがイベントフラグをクリアし、イベントの発生(=フラグがセットされる)を待つ
- 別のタスクがイベント発生を通知するためにフラグをセットすると、そのフラグを待っているタスクの待ちが解除され、フラグ情報が待っていたタスクに通知される
▼料理人、ウエイターでのイメージ
- ウエイター(イベント発生を待つタスク)が料理の完成(イベントの発生⇒フラグのセット)を待つ
- 料理人(別のタスク)が料理の完成(イベントの発生⇒フラグのセット)をウエイターに伝え(タスクの待ちが解除)、ウエイターが料理を運ぶ
RTOSは、フラグのクリアやセット、イベント発生を待つ(タスクを待ち状態に遷移)、イベントが発生したら待ち状態から復帰する、という一連の機能をシステムコールとして提供しています。