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

オペレーティングシステム(OS)は基本的なソフトウェアであり、そのルールは、リソースと利用可能なハードウェアの中間的なソフトウェア要求、入出力の管理、メモリの割り当て/割り当て解除、ファイルシステムなど、デバイスが実行する必要のある基本的なタスクです。

6
基本的なデータ構造として(階層的な)ファイルシステムを使用する方法
私は独学で、CSの学位を持っていません。データ構造について学べば学ぶほど、OSの基本的なデータストレージ構造として、どのようにファイルシステム、ディレクトリ、およびファイルを抱えているのでしょうか? 私はそれがシンプルであることを理解していますが、最近ではネイティブで利用可能なオプションが増えているようです。私の知る限り、ファイルシステムの基本機能を改善する唯一のプロジェクトはReiserFSでした。ReiserFSでは、誰が、いつ、ファイルのどの行が変更されたかを知ることができました。 たとえば、ファイルにネイティブタグを付けて、画像、図、ワードプロセッシングドキュメント、コードリポジトリ全体をすべて単一のプロジェクトに属するものとしてタグ付けできるとしたら、本当に役立ちます。私はファイルシステムのパラダイムに固執しているので、それらをすべて単一のフォルダー/ディレクトリに入れることができることを知っていますが、それらがすでに異なるディレクトリに存在し、そこにとどまる必要がある場合はどうなりますか?私はそこにこれを行うことができるプログラムがあることを知っていますが、なぜそれらはファイルシステムにないのですか? RDBMSで得られるような、ファイルシステムの何らかのリレーショナル機能があれば便利です。それはVista / 7の一部であるはずだったが、それは機能リストからも外れたことを理解している。 確かに、どのプログラムでもバイナリファイルを保存でき、その中に必要なデータ構造を持つことができます。OSがファイルシステムの単純な階層を超えて、データを保存するより複雑な方法を提供できないのはなぜですか?

3
マルチタスクの仕組み
オペレーティングシステムの内部動作についてはまったくわかりませんが、多くの関数の近似動作を多かれ少なかれ推測できます。しかし、私が理解できないことの1つは、マルチタスクです。 理論的には、オペレーティングシステムは、実行中のさまざまなプログラムに応じた短い間隔でCPUに従って時間を管理します。しかし、これが実際にどのように機能するかは明らかではありません。 オペレーティングシステムがプログラムを開始したいとします。マシンコードは、特定のアドレスからRAMのどこかにロードされます。次に、そのアドレスにジャンプを実行して、コードを実行できるようにします。しかし、この方法では、私が戻るまでOSは制御を取り戻すことができません。 基本的に、この作品を作るには2つの方法しか考えられませんが、どちらも実際に適しているとは思えません。 オペレーティングシステムは、直接実行する代わりに、実行するマシン命令を読み取ってエミュレートできます。私はこれがどのように機能するかわからないので、意図的にあいまいですが、プログラムがかなり遅くなるようです。 または、オペレーティングシステムは、システムコールを行うまで待つことができます。その瞬間に制御を取り戻し、実行されている時間を確認し、タイムシェアリングを行うことができます。これは動作する可能性がありますが、システムコールを含まない長い計算を行い、すべてをしばらくハングさせる可能性があるため、信頼性がないようです。 したがって、どちらのメカニズムもうまく機能しないようです。マルチタスクは実際にどのように実行されますか?

7
SSL / TLSが最新のオペレーティングシステムに組み込まれていないのはなぜですか?
インターネットのインフラストラクチャを構成する基本的なネットワークプロトコルの多くは、ほとんどの主要なオペレーティングシステムに組み込まれています。たとえば、TCP、UDP、およびDNSはすべてLinux、UNIX、およびWindowsに組み込まれており、低レベルのシステムAPIを通じてプログラマーが利用できます。 しかし、SSLやTLSに関しては、OpenSSLやMozilla NSSなどのサードパーティライブラリを使用する必要があります。 SSLは比較的古いプロトコルであり、基本的にTCP / IPと同じくらいユビキタスな業界標準であるため、ほとんどのオペレーティングシステムに組み込まれていないのはなぜですか?

8
管理されたOSは良いアイデアだと思いますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 Microsoft SingularityやJNodeなどの管理対象OS は、非常に興味深い概念です。基本的に、OSは低レベル言語(C / C ++ / Assembly)で記述されたコードでブートストラップされ、仮想マシンを本質的に実装します。残りのOS(およびすべてのユーザーランドアプリ)は仮想マシンで実行されます。これにはいくつか素晴らしい点があります。たとえば、突然任意のポインターを廃止します。そして、うまく書けば、ほとんどの最新のOSが現在持っている大量のレガシークラッドを取り除きます。 ただし、デメリットとして、ハードウェアからはるかに離れているため、開発者は抽象レベルを下げて手を汚すことができなくなります。 これについてのあなたの意見は何ですか?

2
DMAコントローラーはどのように機能しますか?
セクション5.1.4からのダイレクトメモリアクセスアンドリュー・タネンバウム、ハーバート・ボス、2014年までに近代オペレーティングシステム、 説明を簡単にするために、図5-4に示すように、CPU、メモリ、I / Oデバイスを接続する単一のシステムバスを介して、CPUがすべてのデバイスとメモリにアクセスすると仮定します。 DMAがどのように機能するかを説明するために、DMAが使用されていないときにディスク読み取りがどのように発生するかをまず見てみましょう。 最初に、ディスクコントローラは、ブロック全体がコントローラの内部バッファに格納されるまで、ブロック(1つまたは複数のセクタ)をドライブからビットごとにシリアルに読み取ります。 次に、チェックサムを計算して、読み取りエラーが発生していないことを確認します。次に、コントローラーが割り込みを発生させます。オペレーティングシステムが実行を開始すると、ループを実行することで、コントローラーのバッファーからディスクブロックを一度に1バイトまたは1ワードずつ読み取り、各反復でコントローラーデバイスレジスタから1バイトまたは1ワードを読み取り、メインメモリに格納できます。 Q:2番目のステップでは、 データは「コントローラーのバッファー」からメインメモリーに転送されませんか?「コントローラのバッファから」と「コントローラデバイスのレジスタから」の両方が表示されるのはなぜですか? 2番目のステップでは、コントローラーはCPUに割り込むことなく、OSを再度関与させることなく、バッファーからメインメモリにデータを転送できますか? DMAを使用する場合、手順は異なります。 まず、CPUはレジスタを設定してDMAコントローラーをプログラムし、何をどこに転送するかを認識します(図5-4のステップ1)。 また、ディスクから内部バッファーにデータを読み取り、チェックサムを検証するように指示するコマンドをディスクコントローラーに発行します。 有効なデータがディスクコントローラーのバッファーにある場合、DMAを開始できます。DMAコントローラは、バス経由でディスクコントローラに読み取り要求を発行することにより、転送を開始します(ステップ2)。この読み取り要求は他の読み取り要求のように見え、ディスクコントローラーは、それがCPUから来たのかDMAコントローラーから来たのかを知りません(または気にしません)。通常、書き込み先のメモリアドレスはバスのアドレスライン上にあるため、ディスクコントローラーは内部バッファーから次のワードをフェッチするときに、書き込み先を認識します。メモリへの書き込みは、別の標準バスサイクルです(ステップ3)。 書き込みが完了すると、ディスクコントローラーは確認応答信号をDMAコントローラーにバス経由で送信します(ステップ4)。DMAコントローラは、使用するメモリアドレスをインクリメントし、バイトカウントをデクリメントします。バイトカウントがまだ0より大きい場合、カウントが0に達するまで手順2〜4が繰り返されます。 その時点で、DMAコントローラーはCPUに割り込み、転送が完了したことを知らせます。オペレーティングシステムは、起動時にディスクブロックをメモリにコピーする必要はありません。すでにそこにあります。 Q:2番目のステップで、DMAコントローラーはディスクコントローラーにデータをディスクコントローラーのバッファーからメインメモリに転送するように要求します。最初のステップで、CPUはディスクコントローラにコマンドを発行し、ディスクから内部バッファにデータを読み込むように指示します。同時に、ディスクコントローラーがディスクからディスクコントローラーのバッファーへのデータの転送を完了したときに、CPUがディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示できるので、 DMAコントローラーは、ディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示しますか?(ディスクとメインメモリ間のデータ転送にDMAコントローラーが必要な理由が理解できないので、見積もりを理解するために重要な何かを見逃していると思います)。 デバイスのデバイスコントローラーは、デバイスを制御し、デバイスで操作を実行します。DMAコントローラーはどのデバイスで操作を制御および実行しますか? ありがとう!

4
確率的挙動のプログラムをテストするためのベストプラクティスは何ですか?
研究開発の仕事をしていると、私は自分の行動にある程度のランダム性があるプログラムを書いていることがよくあります。例えば、私が遺伝的プログラミングで働いているとき、私はしばしば任意のランダムなソースコードを生成して実行するプログラムを書きます。 そのようなコードのテストに関する問題は、バグが頻繁に断続的に発生し、再現が非常に困難になる可能性があることです。これは、ランダムシードを同じ値に設定して実行を開始するだけではありません。 たとえば、コードはカーネルリングバッファからメッセージを読み取り、メッセージの内容を条件付きでジャンプします。当然、後で問題を再現しようとすると、リングバッファーの状態が変更されます。 この動作は機能ですが、予期しない方法で他のコードをトリガーする可能性があるため、多くの場合、単体テスト(または人間のテスター)が見つけられないバグを明らかにします。 この種のシステムをテストするためのベストプラクティスは確立されていますか?もしそうなら、いくつかの参照は非常に役立ちます。そうでない場合は、他の提案を歓迎します!

8
分散コンピューティングとは正確には何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 分散コンピューティングを正確に構成するものは何ですか?また、並列化/コンカレントコンピューティングとどのように違いますか? リソースへのアクセスを同期しようとする複数の並列スレッドでミューテックスとセマフォを使用することは、分散コンピューティングの領域で問題になりますか?

9
UbuntuはITコンサルタントのラップトップとして機能しますか?
私はコンサルタントプログラマーとして働いており、通常は大企業で働いています。私はWindowsラップトップを使用しており、同僚の多くはMacを使用しています。 私の個人的な好みは、開発環境を完全に制御できる場合、Ubuntuを実行することです。しかし、Microsoft固有の製品、特にIEがときどき必要になります。 Macを使用する同僚は、これらの状況で仮想マシンでWindowsを実行することがよくあります。 私の質問は、Ubuntuはエンタープライズプログラマーのラップトップにとって実行可能なソリューションですか?たとえば、Ubuntu上のVMでWindowsを実行するのはMacで実行するのと同じくらい簡単ですか?誰かがこれを試しましたか?Ubuntuがこの環境での開発にMacほど役に立たない特別な理由はありますか? 私は.NET開発を行っていないことに注意してください。したがって、通常は、Apacheサーバーで実行され、Windowsを実行しているクライアントによって使用されるJavaを扱います。

8
C文字列は常にヌルで終了しますか、それともプラットフォームに依存しますか?
現在、私は組み込みシステムで作業しており、オペレーティングシステムなしでマイクロプロセッサに文字列を実装する方法を考えています。これまでのところ、私がやっていることは、NULLで終了する文字ポインタを持つという考えを使用し、NULLが終了を示す文字列として扱うことです。私はこれがかなり一般的であることを知っていますが、これが当てはまることを常に期待できますか? 私が尋ねる理由は、ある時点でリアルタイムオペレーティングシステムを使用することを考えていたため、現在のコードを可能な限り再利用したいからです。そこにあるさまざまな選択肢について、文字列が同じように機能することをほとんど期待できますか? 私の場合はもっと具体的にしましょう。私は、シリアルポート経由でコマンドを受け取って処理するシステムを実装しています。コマンド処理コードを同じにして、RTOS(コマンドを含む)で作成された文字列オブジェクトがすべてNULLで終了することを期待できますか?または、OSに基づいて異なりますか? 更新 この質問を見るようにアドバイスされた後、私はそれが私が尋ねていることを正確に答えていないことを決定しました。質問自体は、文字列の長さを常に渡す必要があるかどうかを尋ねています。これは私が尋ねているものとはまったく異なり、答えの一部には有用な情報が含まれていましたが、私が探しているものではありません。なぜか理由を与えるためにそこに見えた答えではないヌル文字で文字列を終了させます。私が尋ねているものとの違いは、異なるプラットフォームの生まれた文字列がnullで独自の文字列を終了することを多かれ少なかれ期待できるかどうか、それが理にかなっている場合は、すべてのプラットフォームを試してみる必要はありません。

2
ファイルシステムは、ストレージデバイスを(非常に大きな)バイト配列として「認識」しますか?
ファイルシステムがストレージデバイスにどのように読み書きするかを知りたい。 私はこれがどのように機能するかと思います: ファイルシステムはストレージデバイスに直接アクセスしませんが、ストレージデバイスは(ストレージデバイスのデバイスドライバーによって)(非常に大きな)バイト配列としてファイルシステムに提示されます。 たとえば、ファイルシステムがハードディスクにアクセスする場合、ハードディスクを表すバイト配列にアクセスします。 このように、ファイルシステムはあらゆる種類のストレージデバイス(従来のハードディスク、SSD、USBフラッシュドライブなど)で動作でき、ストレージデバイスのデバイスドライバーのみが変更されます。 この画像は、私が今説明したことを示しています。 私の理解は正しいですか?

2
MCUプログラミングにおけるRTOSとベアメタルの利点は?
注:この質問では、2つのRTOSについて具体的に言及していますが、より一般的であり、以前に組み込みRTOSのCコードを記述し、MCUでソフトウェアを直接実行したことがある人なら誰でも回答できます。 組み込みRTOSの詳細を学び、そのためのアプリケーションを作成することに興味があります。現在、EmboxとRIOTを検討しています。それらはオープンソースで、モダンで、アクティブで、優れたドキュメントがあるようです。私の目標は2つのフェーズです。フェーズ1は、これらのOSをコンパイルしてMCU(おそらくAVRまたはARM)にフラッシュする方法を見つけ出すことです。フェーズ2では、単純なCプログラム(基本的にはヘッドレスデーモン)を作成します。これは、「趣味アプリ」として時間とともに進化します。次に、このプログラムを同じMCUにフラッシュ/展開することで、Embox / RIOTとその上にあるアプリで構成されるアプリスタックを正常に展開します。 最終的に行き止まりに至る道を進む前に、C /アセンブラーで書かれMCUにフラッシュされたリアルタイムアプリがRTOSを実際に必要としない理由を説明するのに非常に役立つこの記事を偶然見つけました。 。 だから今、私は本当に混乱していて、コンピューティング理論の私の基本的な理解に疑問を抱いています。私は、最初にEmbox / RIOTを使用するかどうかの決定をしようとしていると思います。 コースを継続し、両方のOS +アプリのMCUで「アプリスタック」を使用します。または 記事の警告に注意し、MCUでアプリ「ベアメタル」を実行してください 明らかに、前者はより多くの作業であるため、そのルートに進むのに十分な理由/報酬が必要です。だから私は尋ねる:これらの(および同様の)組み込みRTOSがMCU / Cアプリ開発者に提供する本当の利点は何ですか?RTOSを使用することで、Cアプリはどのような特定の機能の恩恵を受けることができますか(おそらく、車輪を再発明しないことによって?)RTOSを捨ててベアメタルに移行すると何が失われますか? ここでは具体的な例を求めています。RTOSのウィキペディアエントリにアクセスしたときに得られるメディアの誇大広告ではありません;-)

3
低レベルのコンポーネントでTDDを実行することは良い考えですか?
低レベルのドライバーまたはOSコンポーネント/カーネルの作成を検討しています。 osdev.orgの人々は、重要なビットが有意義にこの方法をテスト可能されていないことを考えているようだが、私は人々が異なったと思ったいくつかの議論を読んだことがあります。私は見回しましたが、低レベルコンポーネントのTDDの実際の例を見つけることができませんでした。 これは実際に人々が行うことですか、それとも実際にはそれを行う良い方法がないために理論的に人々が話していることですか?

1
コンピューティングのレベルを理解する
すみません、私の混乱した質問のために。ポインタを探しています。 これまで私はほとんどアプリケーション層でJavaとPythonを使用しており、オペレーティングシステムとハードウェアについては漠然とした知識しかありませんでした。コンピューティングの低レベルについてもっと理解したいのですが、どういうわけか本当に圧倒されます。大学では、マイクロプログラミング、つまりプロセッサがASMコードを実装するためにどのように配線されているかについてのクラスを受講しました。これまでは、「低レベル」について学べば、これ以上の仕事はできないといつも思っていました。 私の質問の1つは、ハードウェアが開発者からほぼ完全に隠される可能性があるのはなぜですか。オペレーティングシステムはハードウェアのソフトウェアレイヤーであると言っても正確ですか?1つの小さな例:プログラミングで、L2キャッシュまたはL3キャッシュとは何かを理解する必要に遭遇したことはありません。典型的なビジネスアプリケーション環境の場合、アセンブラーや下位レベルのコンピューティングを理解する必要はほとんどありません。現在、ほとんどすべてのテクノロジースタックが存在するためです。これらの低レベルの全体のポイントは、高レベルへのインターフェースを提供することだと思います。一方で、たとえばこのグラフィックスコンピューティング全体など、下位レベルがどの程度の影響を与える可能性があるのでしょうか。 したがって、一方で、この理論的なコンピュータサイエンスブランチがあり、抽象的なコンピューティングモデルで機能します。ただし、複雑なモデル、証明の検証などのカテゴリで役立つ考えを見つけた状況にもめったに遭遇しませんでした。私は、NPと呼ばれる複雑なクラスがあり、それらを解決するのがある程度不可能であることを知っています。多数のN。欠けているのは、これらのことを考えるためのフレームワークのリファレンスです。私には、めったに相互作用しないさまざまな種類のキャンプがあるようです。 過去数週間、私はセキュリティ問題について読んでいました。ここでは、どういうわけか、さまざまなレイヤーの多くが一緒になっています。攻撃とエクスプロイトはほとんど常に下位レベルで発生するため、この場合は、OSIレイヤーの詳細、OSの内部動作などについて知る必要があります。

9
機能開発のためのOSの選択[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 私は主に.NET開発者なので、通常はWindows / VisualStudioを使用します(つまり、私は甘やかされています)が、Haskellや他の(ほとんどの場合は機能する)言語を余暇に楽しんでいます。 Haskellの場合、windows-supportは問題ありません(Haskell-Platformを入手できます)が、latley基本的なClojure / Scheme環境をセットアップしようとしたところ、Windowsでの面倒な作業でした。 それで、私はより良いツールと言語サポートのために別のOSを試すことを考えています。もちろん、MacOSやLinuxディストリビューションが残っています。 私は以前にMacOSを使用したことがなく、もちろんLinuxの方が安く(無料)、通常のPCハードウェアでMacOSを並列起動できないと思います(できますか?)。プラス:私がそれらの(私にとって)外部のOSで使用できるツールについての手がかりはありません。 簡単に言うと、Haskell、Clojure、Scala、Schemeをさらに探索したいのですが、もちろん、JavaScript / HTML5 / Cssに少なくとも優れたツールが必要です。.NET / Mono / F#のサポートは素晴らしいですが、これについてはまだWin7ブートを使用します。 だから私は知りたい:-あなたの好きなOS、ディストリビューションは何ですか(Ubuntuは実行可能ですか?)-どのエディター/ IDEを使っていますか? ご協力ありがとうございました! PS:これがこの質問に適切な場所かどうかはわかりませんが、確かにそうだと思います。そうでない場合は、これをどこに移動すればよいか教えてください(StackOverflowは適切な場所ではないようです)

4
C ++でのOS開発に関する質問
修士課程のプロジェクトとして、シンプルなオペレーティングシステムを設計しています。x86アーキテクチャで16ビットリアルモードで実行するように設計されています。理想的には、このOSをC ++で開発し、必要な場合にのみアセンブリを使用したいと考えています。これまでのところ、私はC ++とasmの混合であるカーネルをロードするアセンブリで書かれたブートローダーを持っています。私の質問は、C ++の使用に関するものです。現在のところ、コンパイルして実行できますが、動的メモリ割り当ては使用していません。 Cを使用している場合、メモリ割り当てを処理するmalloc関数を作成することは理にかなっていますが、C ++では新しいキーワードが使用されます。そう... 'new'はメモリを割り当てるために舞台裏でどのように機能し、これをどのように処理しますか? そして当然の結果として... C ++を使用して、より高いレベルの抽象化を利用することは理にかなっていますか?それともそれを使うのはもっと頭痛の種になるでしょうか?そして私はCを使い続けるべきですか? C ++が適切でないと思われる場合は、根拠を提供してください。

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