回答:
いいえ、プログラムはCPUを完全に制御しません。もしそうなら、キーボード、マウス、ハードドライブなど、動作を停止する他のものがあります。
CPUに接続された割り込みラインがあり、デバイスから情報が入ってくると通知します。たとえば、キーを押すと、現在の実行を停止し、割り込みハンドラーを開始する割り込み信号が発生します。
デバイスとして接続されている内部タイマーもあるため、オペレーティングシステムは、特定のレートで割り込み信号を生成するようにタイマーを設定できます。したがって、オペレーティングシステムは、特定の間隔で実行中のプロセスから常に制御を取り戻すことができます。
割り込みを処理するときの通常のプロセスは、割り込みハンドラーが終了した後に制御が実行中のプログラムに戻ることですが、プロセススケジューラーは1つのプロセスの状態を保存し、別のプロセスを復元し、代わりに割り込みハンドラーをそのプロセスに戻すことができます。
スケジューラには、プロセスを切り替える他の機会もあります。たとえば、プログラムがディスクI / Oを実行するシステムコールを行う場合、スケジューラはI / O要求をハードウェアにパススルーさせ、プロセスを待機状態に保存します。ディスクがデータを返す準備ができると、割り込みを送信するため、スケジューラはデータを待機しているプロセスに切り替えることができます。
(かつて私は実際にコンピューターを完全に制御し、すべての割り込みを無効にするプログラムを作成しました。キーボードとマウスの入力用に独自のハンドラーを作成する必要があり、その状態ではディスクI / Oはまったく機能しません。)
いいえ、ハードウェア機能を使用して、タイマーまたはその他のイベントで制御をカーネルに戻します。
定期的な間隔でOSに制御を戻すためにアプリケーションが作成される「協調的マルチタスク」を説明しています。アプリケーションがユーザー入力、ネットワーク、またはディスク操作の完了を待機している場合、その要素がありますが、WindowsなどのOSは、同時に何も待たない2つのアプリケーションを実行することもできます。
ハードウェアには割り込みがあり、ブート中にセットアップされたカーネル内の特定のコードを制御します。次に、カーネルは次に何を制御するかを決定します。これがスケジューラーの仕事です。