なぜ私がこれを求めているのかについての背景。私は数時間前にこの質問をした非同期I/Oを実行するとき、カーネルはI/O操作が完了したかどうかをどのように判断しますか?
は、すべてのI/Oは、システムコールを介して行われなければならない答えを持っていたし、道のシステムコールが行くに実装されている
When a goroutine blocks on I/O how does the scheduler identify that it has stopped blocking?
は、彼らは常に呼ばれていますランタイムによって制御されるコードを通じて実行されます。これは、システムコールを呼び出すときに直接コールするのではなく(カーネルにスレッドの制御を渡す)、ランタイムには作成するシステムコールが通知され、それがゴルーチンのために実行されることを意味します。これは、例えば、ブロックされていないシステムコールではなく、ブロックされていないシステムコールを行うことができます(基本的にはカーネルに "このことをしてください。終了するまでブロックする代わりにすぐに戻り、準備ができました ")。その間に他の作業を続けることができます。
だから、私の理解から、何golangスケジューラが行うことは、それがI/O操作のために待機しているスレッドの上にハングアップ過ごす時間を取得するかわからないなることです。代わりに、何とかその責任をカーネルに委ねます。
しかし、私には不明なことがたくさんあるので、このプロセスをより深く理解したいと思います。
これは私の理解であり、潜在的に完全に間違っている可能性があります。ゴルーチン内部
-
、リモートサーバーへのGETリクエストとして
- メイクI/O要求
- Golangは、ブロック操作であるTCPストリームを、読むためにシステムコールを行い、代わりに待つので、それはカーネルに依頼それが情報を得たときに通知される。スケジューラはキューからブロックしているゴルーチンを取り除きます。
- カーネルがすべての情報を取得すると、それはgoプロセスに転送され、スケジューラはそのキューにゴルーチンを追加するように通知します。
私が理解しようとしているのは、別のスレッドを作成せずにI/O操作を行う方法と、カーネルがI/O操作を実際に「知っている」方法です。それはポーリングを介してですか、あるいはそこに何らかの割り込みシステムがありますか?
これは意味があると思います。私はこの低レベルのコンセプトにはとても新しいです。