背景: 私は Beej のガイドを使用していましたが、彼は分岐して「ゾンビを確実に捕まえる」ことについて言及しました。私が入手したオペレーティング システムの本には、OS がどのように「スレッド」を作成するかが説明されていました (これはもっと基本的な部分だといつも思っていました)。基本的に、それらはすべての外部リソースを共有しますが、レジスタとスタック空間を分割します (そして私は 3 番目のことだと思います)。
それで、 http://www.qnx.comの開発者ドキュメントが非常によく説明しているwaitpid関数にたどり着きました。実際、私はスレッドに関するセクション全体を読み、プロセスとスレッドのグーグルの後のすべてのタイプの条件を除外しました。
コードを分割して元に戻すことができるという事実は、私を混乱させません。これを行う方法はわかりにくいです。
C および C++ では、プログラムは Main() 関数であり、前進し、他の関数を呼び出し、無限にループし (入力またはレンダリングを待機)、最終的に終了または復帰します。このモデルでは、「何かを待っている」を超えて停止する理由は見当たりません。その場合、ループするだけです。
まあ、「セマフォ待ち」とか「レスポンス」とか「割り込み」とかを設定することでループできるようです。または、待機せずに中断される可能性があります。これが私を混乱させるものです。
プロセッサは、プロセスとスレッドをタイムスライスします。それはすべてうまくいきますが、いつ停止するかをどのように決定しますか? ポーリング機能に到達して、「入力を待っています。時計のティックまたはユーザーが何かを行います」と言うのは理解しています。どういうわけか、これをOSに伝えますか?わからない。しかし、さらに:
シングルスレッドのアプリケーションでも、完全にランダムに割り込みまたは介入できるようです。つまり、1 つのスレッドを実行していて、突然 waitpid() が「やあ、プロセスを終了したので、これを中断させてください。2 人ともゾンビが嫌いなので、これをやらなければなりません」と言います。あなたはまだいくつかの計算をループしています。それで、何が起こるのですか?どういうわけか、それらは両方とも実行され、あなたの計算は混乱していません。なぜなら、それはシングルスレッドだからです。あなたはまだ他のアプリのことをしています。
また紛らわしいのは、iOS の通知のように通知を受け取る方法です。しかし、前の段落と同じ質問ですが、実行中のスレッドをどのように中断しますか?
分割については理解できたと思いますが、この結合はまったく混乱しています。教科書には、私が受け入れるはずのこの「帽子からうさぎ」のステップがあるようです。他の SO の投稿では、同じスタックを共有していないとのことでしたが、それは役に立ちませんでした。今では、スリンキー (スタック) が別のスリンキーに寄りかかっていると想像していますが、再結合してデータを変更する方法がわかりません。
助けてくれてありがとう、これが長いことをお詫びしますが、ここで簡潔すぎると、誰かがこれを誤解して「それらは異なるスタックです」という答えをくれることを知っています.
ありがとう、