3

私は Web プログラミングの世界から来ました。通常、サーバーは指定されたメソッド (get、post など) を介してスーパーグローバル変数を設定し、ユーザーがフィールドに入力したデータを利用できるようにします。もう 1 つの方法は、AJAX を使用して、AJAX XMLhttpRequest オブジェクトがブラウザーから通知されたときに開始するイベントにコールバック メソッドを登録することです (私は推測しています...)。だから私の質問は、システムプログラマーのコードがユーザー入力に応じて実行するために代償的に対話しなければならないある種のディスパッチインターフェースがあるかどうか、またはプログラマーが「待機中」のプロセスを直接制御するかどうかだと思いますか? また、ディスパッチがある場合、特定のイベントが発生するのを待つ OS 内のループ構造はありますか?

私は基本的なプログラミング論理のクラスにいて、教授はこのような「洗練された」質問に答えないので、ここでこの質問をするように促されました。私の本は、次のような漠然とした疑似コードの例を示しています。

    //start
    sentinel_val = 'stop';
    get user_input;
while (user_input not equal to sentinel_val)
     {
         // do something.
         get user_input;
     }
     //stop

この例では、1) ユーザーから入力が受信されない場合、ループは新しい入力が魔法のように表示されるまで、古い入力または入力なしで「何かを行う」シーケンスを繰り返し続け、その後、それまたはそれで再び繰り返されると信じています。ヌル値。この本は、ファイルからのプライミングと読み取りの例を使用して、プログラムがイベント駆動型入力からデータを取得する方法を伝えようとしているようですよね?

よくわかりません :(

4

4 に答える 4

5

最低レベルでは、コンピューターへの入力は非同期です。これは、基本的には CPU (キーボード コントローラー) の外部にある何かである「割り込み」を介して発生し、CPU に信号を送信します。このデータ」。(複雑ですが、これが一般的な考え方です)。そのため、CPU は停止し、キーストロークを取得して、読み取るためにバッファーに入れ、割り込み前に行っていたことを続けます。

非常によく似たことが、インバウンドのネットワーク トラフィックや、ディスクからの読み取りの結果などで発生します。

より高いレベルでは、使用しているオペレーティング システムまたはフレームワークへの依存度が高くなります。

キーボード入力では、ブロックされてユーザー入力を待機しているプロセス (基本的にはアプリケーション) が存在する可能性があります。この「ブロック」とは、コンピューターが待機しているだけではなく、代わりに他のプロセスを実行できるようにすることです。しかし、キーボードの結果が来ると、それを待っていた人が目覚めます。

その待機プロセスの観点から、彼らは何らかの関数「get_next_character()」を呼び出し、その関数が文字とともに返されました。等。

率直に言って、これらすべてがどのように結びついているかは非常に興味深く、理解するのに役立ちます。:)

于 2010-02-18T01:21:03.783 に答える
2

OS は、ハードウェア イベント (割り込みと呼ばれます) によって駆動されます。OS は割り込みを待たず、代わりに特別な命令を実行して、CPU をループ内で仮眠させます。ハードウェア イベントが発生すると、対応する割り込みが呼び出されます。

于 2010-02-18T01:20:05.860 に答える
2
It seems the book has tried to use the example of priming and reading from a file
to convey how a program would get data from event driven input, no?

はい、それが本がしていることです。実際、UNIX オペレーティング システムは、あらゆるデバイスのすべての入力と出力をこのように抽象化するという考えに基づいて構築されています。

実際には、ほとんどのオペレーティング システムとハードウェアは、サブルーチンと呼ばれるものにジャンプする割り込みを使用して、低レベルのデータ読み取りを実行し、制御をオペレーティング システムに戻します。

また、ほとんどのシステムでは、多くのデバイスがオペレーティング システムの残りの部分から独立して動作し、オペレーティング システムに高レベルの API を提供します。たとえば、コンピューター プロセスのキーボード ポート (より適切な例としてはネットワーク カード) がそれ自体に割り込み、キーボード ドライバーがオペレーティング システムに別の API を提示します。デバイスの標準を調べて、これらが何であるかを確認できます。たとえば、キーボード ポートが提供する API を知りたい場合は、linix ディストリビューションでキーボード ドライバーのソース コードを調べることができます。

于 2010-02-18T01:20:18.740 に答える
1

私の理解に基づく基本的な説明...

あなたのget user_input疑似関数は、多くの場合、 のようなものreadLineです。つまり、読み取ったデータに改行文字が含まれるまで、関数はブロックされます。

これより下では、OS は割り込みを使用して (これは、キーボードを不必要に処理するのではなく、必要な場合にのみ処理することを意味します)、ユーザーがいくつかのキーを押したときに応答できるようにします。キーボード割り込みにより、キーボードからのデータで入力バッファを満たす特別なルーチンに実行がジャンプします。OS は、適切なプロセス (通常はアクティブなプロセス) がreadLine関数を使用してこのデータにアクセスできるようにします。

そこにはもっと複雑なことがたくさんありますが、それは単純な見方です。誰かがより良い説明を提供してくれれば、私は喜んで優れた知識に頭を下げます.

于 2010-02-18T01:19:52.443 に答える