
Unixプロセススケジューラはプロセス自体ですか、それともシステムコール(カーネルビットが設定されているユーザープロセスでカーネルコードを実行)などの他のプロセスにピギーバックされていますか?
答え1
Unixプロセススケジューラは実際にシステムコールを「ピギーバック」しません。スケジューラの実行は、ほぼすべてのシステムコールの一部です。
システムread()
コールまたはexit()
システムコールは、スケジューラが実行されるようにする必要があります。ディスクアクセスの場合、read()
時間がかかることがあります。すべてのタスクを非常に遅くしたくない場合は、スケジューラを実行して、最初のプロセスがディスクからデータが戻るのを待っている間にどのプロセスを実行する必要があるかを確認する必要があります。これはソケットで発生する可能性がありますread()
。一部のリモートサーバーからデータが返されるのにかかる時間は定義されていません。カーネルは他のプロセスを再スケジュールする必要があります。この場合、exit()
システムコールを実行するプロセスはもう存在しないため、別のプロセスをスケジュールする必要があります。 apause()
または an の場合、alarm()
プロセスが将来のある時点で実行されることを望みます。同様に、スケジューラは実行する別のプロセスを選択する必要があります。
私はほとんどの(すべてではない)システムコールがUnix / Linux / * BSDスケジューラを実行していると思います。時にはgettimeofday()
スケジューラが実行されないことがあります。これはSolarisが以前に動作していた方法です。ただし、通常、システムコールは、ジョブの実行(NICを介したデータ転送、ディスクの読み取りまたは書き込みの設定、プロセス終了ジョブの実行、分岐など)、スケジューラの実行、およびそれに伴うすべてのタスクを実行すると安全に考えることができます。次のプロセスが実行されている必要があります。時には、システムコールを作成するのと同じプロセスですが、そうでない場合が多いです。