タグ付けされた質問 「operating-systems」

ハードウェアとアプリケーションの間のインターフェースとなるソフトウェアの原理に関する質問。



7
プログラムを開くと、オペレーティングシステムは独自のマシンコードを挿入しますか?
私はCPUを研究していますが、メモリからプログラムを読み取り、その命令を実行する方法を知っています。また、OSはプログラムをプロセス内で分離し、各プログラムを非常に高速に切り替えて、同時に実行していると考えますが、実際には各プログラムはCPUで単独で実行されることも理解しています。しかし、OSがCPUで実行される大量のコードである場合、どのようにプロセスを管理できますか? 私は考えてきましたが、考えられる唯一の説明は、OSが外部メモリからRAMにプログラムをロードすると、元のプログラム命令の途中に独自の命令を追加するため、プログラムが実行され、プログラムがOSを呼び出して、いくつかのことを実行できます。OSがプログラムに追加する命令があり、CPUがOSコードにいつか戻ることができると信じています。また、OSがプログラムを読み込むと、禁止されている命令(メモリ内の禁止されたアドレスにジャンプする)があるかどうかをチェックし、それを排除すると信じています。 私はきちんと考えていますか?私はCSの学生ではありませんが、実際には数学の学生です。可能であれば、OSがCPUで実行される大量のコードであり、同時に実行できない場合、OSがプロセスを管理する方法を説明する人を見つけられなかったため、これに関する良い本が欲しいでしょう。プログラムの時間。これらの本は、OSが物事を管理できることだけを伝えていますが、今ではその方法を伝えています。

6
要素の繰り返しなしでペアのセットから組み合わせを生成する
ペアのセットがあります。各ペアの形式は(x、y)で、x、yは範囲の整数に属します[0,n)。 したがって、nが4の場合、次のペアがあります。 (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 私はすでにペアを持っています。次に、n/2整数が繰り返されないようにペアを使用して組み合わせを作成する必要があります(つまり、各整数は最終的な組み合わせで少なくとも1回出現します)。理解を深めるための正しい組み合わせと間違った組み合わせの例を次に示します 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] ペアができたら、可能性のあるすべての組み合わせを生成する方法を誰かが提案できますか?

7
Unix / Cの不整合と不完全性の例は何ですか?
リチャードガブリエルの有名なエッセイThe Rise of Worse is Betterは、MIT / Stanford(Lisp)とNew Jersey(C / Unix)デザインの似顔絵バージョンを、シンプルさ、正確さ、一貫性、完全性の軸に沿って比較しています。彼は、「PC敗者問題」(Josh Habermanが別の場所で議論した)の例を挙げて、Unixがインターフェースの単純さよりも実装の単純さを優先していると主張します。 私が思いついたもう1つの例は、数値へのさまざまなアプローチです。Lispは任意の大きな数値(メモリのサイズまで)を表現できますが、Cは数値を固定ビット数(通常は32〜64)に制限します。これは正しさの軸を示していると思います。 一貫性と完全性の例は何ですか?ガブリエルのすべての説明は次のとおりです(彼は似顔絵だと認めています)。 MIT /スタンフォードのアプローチ シンプルさ-設計は、実装とインターフェースの両方においてシンプルでなければなりません。インターフェイスは実装よりも単純であることが重要です。 正確性-設計は、観察可能なすべての側面において正しいものでなければなりません。不正確さは単に許可されません。 一貫性-設計は一貫していてはいけません。一貫性を保つために、デザインの単純さや完成度を少し下げることができます。一貫性は正確さと同じくらい重要です。 完全性-設計は、実用的な限り多くの重要な状況をカバーする必要があります。合理的に予想されるすべてのケースをカバーする必要があります。シンプルさは、完全性を過度に低下させることは許されません。 ニュージャージーのアプローチ シンプルさ-設計は実装とインターフェースの両方でシンプルでなければなりません。実装がインターフェースよりも単純であることがより重要です。シンプルさは、設計において最も重要な考慮事項です。 正確性-設計は、観察可能なすべての側面において正しいものでなければなりません。正しいよりも単純である方がわずかに優れています。 一貫性-設計が過度に一貫していてはなりません。場合によっては一貫性を犠牲にして単純化することもできますが、実装の複雑さや不整合を導入するよりも、あまり一般的ではない状況に対処する設計の部分を削除する方が適切です。 完全性-設計は、実用的な限り多くの重要な状況をカバーする必要があります。合理的に予想されるすべてのケースをカバーする必要があります。他の品質を優先して、完全性を犠牲にすることができます。実際、実装の単純さが危険にさらされるたびに、完全性が犠牲になります。シンプルさを維持する場合、完全性を達成するために一貫性を犠牲にすることができます。特に価値がないのは、インターフェースの一貫性です。 Gabrielが正しいかどうかを尋ねているのではないことに注意してください(これはStackExchangeには不適切な質問です)。

4
一般的にどのスレッドが共有しますか?
さて、これは一般的な質問です。そして、もし誰かがそれを実装固有にしたいなら、私はUnix関連のものを好むでしょう。しかし、まず一般的に次の問題を知る必要があります。 私は単一のプロセスが複数のスレッドを持つことができると読みました。同じプロセスの複数のスレッドは、それらの間で物事を共有します。彼らが何を共有し、何を共有していないのか知りたい。プロセスがアドレス空間、スタック、ヒープ、グローバル変数、コード、データ、OSリソースで構成されていることを考慮して、スレッド間で共有されるものは何ですか?私は次の推測を持っています: グローバル変数-スレッド共有グローバル変数を読み取りました。また、JavaとC#でプログラミングしているときに、クラスレベルの変数を共有するスレッドを作成しました。したがって、スレッドはグローバル変数を共有すると信じています(ただし、高レベルのプログラミング言語の概念がそのまま低オペレーティングシステムレベルの事実に変換されるかどうかはわかりません)。 ヒープ-グローバル変数はヒープに格納されるため、ヒープはスレッド間で共有されます。 スタック-各スレッドは独自の実行シーケンス/コードを持つことができるため、プログラムカウンターの内容をプッシュ/ポップする独自のスタックを持っている必要があります(関数呼び出しと戻りが発生した場合)。したがって、同じプロセスのスレッドはスタックを共有しません。 今、私は次のものの共有について確信が持てない アドレス空間-アドレス空間で何が正確にカウントされるのかわからない。しかし、アドレス空間は一般的にスレッドではなくプロセスのコンテキストで使用されると思います。また、同じプロセスのすべてのスレッドは親プロセスと同じアドレス空間に存在するため、スレッドはアドレス空間を共有すると言われています。(しかし、それらは同じアドレス空間内で異なるスタックを維持しますか?) OSリソース-これは非常に実装固有であると思います。たとえば、親プロセスは、すべてではなくそのスレッドの一部に同じファイルのハンドルを選択的に与えることができます。または私は誤解しており、OSリソースはファイル以外のものを意味しますか? コード-スレッドは異なるコードを持つことができるため、コードの共有が常に当てはまるわけではありません。 データ-データの下で何を考慮すべきかわからない。ただし、グローバル変数がスレッド間で共有されていることを確認してください。そして、ローカル変数が同様に共有されていないことを確認してください。 全体的に、あいまいな用語、オペレーティングシステムの書籍で行われている超一般化、およびオンラインで提供される実装固有の詳細により、かなり混乱しています。だから私は私を満足させることができるいくつかの答えを見つけようとしています。

2
オペレーティングシステムは、ランダムシードのエントロピーをどのように作成しますか?
Linuxでは、ファイル/dev/randomと/dev/urandomファイルは、それぞれ、擬似ランダムバイトのブロックおよび非ブロック(それぞれ)ソースです。 それらは通常のファイルとして読むことができます: $ hexdump /dev/random 0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa 0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe 0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f 0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3 0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444 …

4
協調スケジューリングは、I / O操作を実行するときにプロセスを一時停止しますか?
多くのオペレーティングシステムのリファレンスでは、協調的な(プリエンプティブとは対照的な)マルチタスクでは、プロセスがCPUを明示的に自発的に中断するまで保持します。実行中のプロセスがすぐに満たされないI / O要求を実行する(たとえば、まだ利用できないキーストロークを要求する)場合、スケジューラはそれを中断しますか、それとも要求が処理されるまでCPUを本当に保持しますか? [「I / Oのブロック」を「すぐに満たすことができないI / O要求を実行する」に置き換えるように編集しました。]

3
一定時間の操作で賢いメモリ管理?
固定サイズのブロックを含む2つの基本的なメモリ割り当て操作を実行できるメモリセグメント(必要に応じてファイルのようにサイズが拡大または縮小できる)を考えてみましょう。 1つのブロックの割り当て 使用されなくなった以前に割り当てられたブロックを解放します。 また、要件として、メモリ管理システムは現在割り当てられているブロックを移動することはできません。インデックス/アドレスは変更しないでください。 最も単純なメモリ管理アルゴリズムは、グローバルカウンタ(初期値0)をインクリメントし、その新しい値を次の割り当てのアドレスとして使用します。ただし、割り当てられたブロックがわずかしか残っていない場合、セグメントを短くすることはできません。 より良いアプローチ:カウンターを保持しますが、割り当て解除されたブロックのリスト(一定時間で実行可能)を維持し、空でない限り、新しい割り当てのソースとして使用します。 次は何?メモリセグメントを可能な限り短く保つ、一定の時間の割り当てと割り当て解除の制約があるにもかかわらず、できる賢いことはありますか? (目標は、現在割り当てられていないブロックを最小のアドレスで追跡することですが、一定の時間では実現できないようです…)

4
オペレーティングシステムは、管理対象の同じチップ上でどのように実行できますか?
オペレーティングシステムに関する私の読み物(ウィキペディア、技術サイトなどの基本資料を読む)から、オペレーティングシステムは、プログラムとアプリケーションが効率的かつ安全な方法でハードウェアと対話できるようにするプログラムであることを学びました。 ただし、オペレーティングシステム自体を操作する必要があるときに、オペレーティングシステムがコンピューターの操作を監視する方法について混乱しています。 どういう意味ですか?オペレーティングシステムが動作すると想像する方法は、コンピューター上に2つのCPUがあるということです。1つは常にOSを実行し、もう1つはOSがコンピューターを実行するために使用します。ただし、OSは他のプロセスと同じCPUで実行されていることがわかります。これは、マネージャーが従業員と同じ生産ラインで作業しなければならないようなもので、別の従業員が作業ツールを使い終わったときにのみ電動工具を使用できるようになります。彼は、従業員が少しでも規律を欠いている場合、注文を発行することができないため、あまり効果的なマネージャーではありません。 それでは、他のすべてのプロセス間で共有する必要がある同じCPU上で、OSが一部の時間しか実行されないのはどうしてでしょうか。これはどのように解決するのですか?

3
「ソフト」リアルタイムオペレーティングシステムが実際に提供する保証
「ハード」リアルタイムオペレーティングシステムとは何かを知っていると思います。これは、アプリケーションプログラマとの契約を提供するスケジューラを備えたオペレーティングシステムです。アプリケーションは、各リソース割り当て要求に期限を提供します。 場合は期限の要求がある実行可能な、スケジューラは、各リソースが締め切り前に要求しているアプリケーションに割り当てられることを保証します。この保証は、アプリケーションプログラマが特定のリクエストの最大レイテンシと最小スループットについて推論できるようにするのに十分です。 「ソフト」リアルタイムシステムについて私が見つけたすべての定義は、私には無意味に思えます。 ウィキペディアによると 結果の有用性は期限後に低下し、システムのサービス品質が低下します。 うーん。はい。その基準では、Windows 95はソフトリアルタイムシステムであり、3BSDもLinuxもそうでした。ウィキペディアは素晴らしい情報源ではありませんが、Googleの次のヒット数はそれほど良くありません。例えばhttp://users.ece.cmu.edu/~koopman/des_s99/real_time/は言います ソフトリアルタイムシステムでは、まれにしか発生しないピーク負荷での動作の低下は許容されます。 それは契約ではありません、それは何も言うことのない派手な方法です。 実際のオペレーティングシステムによって提供される実際のソフトリアルタイムの保証/契約の例は何ですか? 私はフォームの答えを探しています: (OS名)でプログラマーが(プログラマーが何をする必要があるか)を行うと、オペレーティングシステムは(システム保証を)保証します。

2
マイクロカーネルとモノリシックカーネルのパフォーマンス
マイクロカーネルは、すべてのドライバーをユーザー空間プログラムとして実装し、カーネル自体にIPCなどのコア機能を実装します。ただし、モノリシックカーネルは、ドライバーをカーネルの一部として実装します(たとえば、カーネルモードで実行されます)。 マイクロカーネルはユーザー空間のドライバー間でメッセージの受け渡しを処理する必要があるため、モノリシックカーネルよりも遅いといういくつかの主張を読みました。これは本当ですか? 長い間、ほとんどのカーネルはモノリシックでした。これは、ハードウェアの速度が遅すぎてマイクロカーネルをすばやく実行できないためです。ただし、GNU / Hurd、Mac OS X、Windows NTラインなど、多くのマイクロカーネルとハイブリッドカーネルが存在するようになりました。 それで、マイクロカーネルのパフォーマンスについて何か変更はありましたか?このマイクロカーネルへの批判は今日でも有効ですか?

2
マネージコードを実行する最小限のカーネルを使用する場合の潜在的な落とし穴は何ですか?
マネージコードインタープリター/ランタイムとして機能する非常に小さなネイティブの下位カーネルと、非ネイティブマシン言語(Javaバイトコード、CILなど)にコンパイルされた上位の上位カーネルに基づいてオペレーティングシステムを構築するとします。同様のオペレーティングシステムの例は、SingularityとCosmosです。 純粋にネイティブなソリューションとは対照的に、この種のインフラストラクチャを備えたOSを作成する際に、どのような落とし穴と開発上の課題が存在しますか?

6
間隔内の2つの数値の最大XORを見つける:二次式よりも良いことはできますか?
lllrrr L ≤ I 、最大(I ⊕ J )最大(私⊕j)\max{(i\oplus j)}L ≤ I 、J ≤ Rl≤私、j≤rl\le i,\,j\le r ナイーブアルゴリズムは、考えられるすべてのペアを単純にチェックします。たとえば、ルビーでは次のようになります。 def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 私感私たちはより良い次より行うことができます。この問題のためのより良いアルゴリズムはありますか?

1
OSのメモリバルーニング
一部のハイパーバイザーは、バルーニングと呼ばれる方法を使用してメモリ使用量を最適化します(少なくともKVMが呼ぶ方法です)。この方法は、VM間のメモリを重複排除し、共通ページをコピーオンライトで読み取り専用に設定します。 これは、fork呼び出しの反対です。 プロセスに対してOSレベルで実装することは可能ですか(同じサイトで複数のタブを持つChromiumでブラウジングするとき、主にメモリの重複を考えていました)、すでに実装されていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.