現在インターネットをしている人はすべて、GUI環境なのでここを見ているあなたのパソコンはマルチタスクで動作しているはずです。マルチタスクとは幾つかの仕事を同時にこなす事ができる仕組みで、音楽を聴きながらワープロを打つだとか。インターネットをしながら印刷をするとか言うことができる機能です。 その仕組みは、非常に簡単で、一見複数のプログラムが同時に動作しているように見えますが、実際には非常に短い時間(コンマ何とかという世界)においてはどれか一つのアプリケーションしか動作していません。ようするに、「1」「2」「3」というアプリケーション(実際にはタスクという仕事の単位を使う)があるとすると、まず、「1」を動作させすぐに「2」に制御を移す、するとまたすぐに「3」に制御を移すと言うことを1秒間に数え切れないぐらいの回数を、恐ろしいぐらいの速度でやっているわけです。だから、コンピュータ側から見れば、実際にどれか一つのアプリケーションしか動作していないのに、コンピュータから見て動きの遅い人間にとっては、全部同時に動いているように見えるというわけです。どうですか。簡単でしょ? CPUがタスクを処理している間にはレジスタと呼ばれるメモリを使用しているので、単純にタスクを切り替えてはメモリの内容が上書きされてしまいます。タスクの切り替えはやはり、ただ単に切り替えている訳ではありません。 まず、今動作しているタスク1を中断させます。この中断処理の時には後で、今の状態を復元できるようにレジスタの内容を保存します。この他にもOSがタスクを管理するのに必要な情報も同時に保存します。 タスクの状態を保存したり、再びセットするのはすべてOSの仕事でなので、OSの管理下のメモリ中に全タスクを管理するための領域を設け、そこにタスクの状態を保存します。ありがたい事に、486にはタスクの状態を保存するための命令が実装されています。このようにしてタスクの状態を保存したら、前回、保存されているはずのタスク2を復元します。これまた、簡単ですね。 マルチタスクは我々にとって便利なだけでなく、システム全体の処理効率の向上という面にも現れています。例えば、タスク1でディスクからのデータ読み込み待ち状態になったときに、マルチタスクなら瞬時にタスク2に切り替えられます。実際にディスクの読み込みとは目的のデータがある位置まで読み取りアームを伸ばしたり、アームの下にデータが回転してくるまでの待ち時間などがあり、以外と時間がかかっている。人間にとっては瞬間の作業でも、コンピュータにとってみれば、かなりの作業がこなせる時間であり、それだけの時間コンピュータを停止させておくのは、かなり無駄なことであるのがよくわかると思う。このような、我々の気が付かない無駄な時間というのは、普通にパソコンを触っている時に、そこら中で起きているのである。つまり、塵も積もればというやつである。 GUIなどのユーザインターフェースを中心とするソフトウェアは、ユーザの操作(マウスでどこかをクリックするなどの操作)をイベントと呼び、何らかのイベントが発生したときに特定の動作(次の文章を表示するなど)を行うようにするプログラミング方式のことをイベントドリブン(イベント駆動)といいます。なぜ、ここでプログラミング方式についての話をするかというと。よく考えてください。何らかの入出力が発生したときにタスクを切り替える(停止する)ということは、何らかの入出力が完了したら、タスクを開始(再開)するということでしょう?何か似ていませんか?そうです。イベントが発生したときにのみ特定の動作(タスクを再開)をしたらよいという部分がそっくりなのです。つまり、このイベントドリブンはマルチタスクにしやすい、プログラミング方法なのです。Windows3.1などは、このやり方でマルチタスクにしていました。 さて、よくイベントドリブン(ノン・プリエンティブ/擬似マルチタスク)と対比で使用されるのが、プリエンティブです。プリエンティブとは、簡単に言ってしまうと、入出力のタイミング以外にも、一定時間がたつと強制的にタスクを切り替えてしまいます。現在、マルチタスクOSと言われている物の多くがこのプリエンティブを利用しています。さて、Windows3.1などを使用したことがある人はわかると思うのですが、ノンプリエンティブなOS(Windows3.1など)では、あるアプリケーションを起動中(何か処理を実行中)に別のアプリケーションで、重い処理をするイベントを発生させた場合、前に処理が、後から発生した処理によって現在の処理を停止させられるのです。これが、短い時間なら大した影響が現れないのですが意外と長い時間処理を行う場合、同時に音楽の再生・映像の再生・データ通信など次から次へとデータが流れてくるものを処理するアプリケーションが起動していた場合、その受け取ったデータを処理できず障害が発生するというわけです。これが、ノンプリエンティブの弱点であり、欠点でもあった。これが、プリエンティブでは、各タスクが切り替えのタイミングを一切感知しなくても、OSが勝手に切り替えを行うので、特定のタスクが他のタスクに影響を与えることがなくすべてのタスクが独立して動作できることから、「完全なマルチタスク」とも呼ばれています。 排他制御とは一つの資源に対して複数のタスクがアクセスすることを防ぐ処理のことです。 プリエンティブなマルチタスク環境では、ランダムのタイミングにタスクが切り替わるので、一つの資源に対して同時にアクセスが簡単に起きてしまう。だからOSはそれを防ぐために排他制御を行わなくてはならない。 |
メール |
トップ |