2016-10-13 5 views
1

システムコールABCを作成したとします。システムコール内でプロセスを中断できますか?

syscall ABC() 
{ 
    int mask = disable(); // to disable interupt 
    .... 

    pid // pid of calling process 

    if(some condition){ 
     suspend(pid); 
    } 

    .... 

    restore(mask); // restore interupts 
} 

私たちのプログラムからABCを呼び出す場合、いくつかの基準によって、ABCシステムコールはsuspendを呼び出す必要があります。それから何が起こるでしょうか? 割り込みが無効になっているため、他のプロセスはコンテキスト切り替えができず、現在のプロセスはサスペンド状態です。単一のコアプロセッサでは、ハング状態ですか?現在のプロセスを再開するプロセスがないためです。 私が間違っている場合は私を修正してください。

代わりの一時停止は、我々は睡眠を使用することができます。変更を加えている間に違いはありますか?現在のプロセスを中断

+2

プロセスを中断するために使用するAPIを教えてください。 – jlliagre

+0

実際、OSについては言及していませんでした。これはLinuxに非常によく似ていますが、拡張可能ではない(主に学術目的のための) "Xinu"です。そして、私はXinuシステム(カーネル)で作業していますので、サスペンド機能(プロセステーブルに直接アクセスしてそのエントリにアクセスする)を含むsuspend.cファイル(API)があります。 – Django

答えて

0

に即時のコンテキストスイッチが発生します。 割り込みマスキングので、コンテキストスイッチが再開するために、通常の割り込み処理が発生しますコンテキスト、 の一部です。もちろん睡眠の

は中断点で を中断異なるユーザーレベルではるかに表示されています。 のプロセスは、 を実行しているプロセスとほとんど区別できません(ps/proctop、またはその他の監視ツールを参照しない限り)。それは半分死んだよう ルックスを中断しています プロセス(親リターンでwait())。 任意の信号(つまり、ブロックされたり、無視されていない) は、眠っているプロセスをウェイク だけSIGCONTは中断し、プロセスを再開することができます。 (SIGTERMでも停止プロセスは中断されますが、 だがSIGKILLはそれを強制終了します)

関連する問題