UNIXまたはLinuxシステムはどのように機能しますか?[閉まっている]


37

私はOS が一言でどのように機能するかを知りたい:

  • 基礎となる基本コンポーネント
  • これらのコンポーネントがどのように連携するか
  • UNIX UNIXを構成するもの
  • Windowsなどの他のOSとの違い

3
この質問を包括的に答えるにはとても時間がかかるでしょう...いくつかの本のように。UnixではないOSはほとんどありません(埋め込みスペースは別にして、ウィンドウは例外です)。
xenoterracide

2
泣くべきか笑うべきかわからない
-zvolkov

27
UNIXまたはLinuxシステムはどのように機能しますか?よろしくお願いします:-)。
ガウラブ

3
質問が大好きです。これは、経験豊富なユーザーが自分の理解を言語化し、unixとlinuxの世界を理解するすべての機会を私たちに与える種類です。
スタインÅsmul11年

5
さて、実際のシェルにはシェルがあり、その下にカーネルがあります。これもUnixの仕組みです。
トムザイチ

回答:


74

UNIXシステムは、いくつかのパーツ、またはそれらを呼び出したいレイヤーで構成されています。

システムを起動するには、ブートローダーと呼ばれるプログラムがハードディスクパーティションの最初のセクターに存在します。システムによって起動され、オペレーティングシステムカーネルを見つけてロードします。

階層化

  1. カーネル。これは、ブートローダーによって起動される中央プログラムです。システム(ディスク、メモリ、ビデオ、サウンド)の基本的なハードウェアインタラクションを行い、プログラムを起動できる仮想環境を提供します。カーネルには、ハードウェアデバイス間の小さな違いをすべて処理するすべてのドライバーも含まれています。外の世界(上位層)から見ると、各クラスのデバイスはまったく同じ一貫した方法で動作しているように見えます。つまり、プログラムはその上に構築できます。

  2. バックグラウンドサブシステム。定期的なプログラムがあり、邪魔にならないようにします。リモートログインのようなものを処理し、中心的なメッセージバスを提供し、ハードウェア/ネットワークイベントに基づいてアクションを実行します。たとえば、Bluetoothの検出、wifi管理など。ネットワークサービス(ファイルサーバー、プリントサーバー、Webサーバー)もこのレベルで動作します。UNIXシステムでは、これらはすべて通常のプログラムです。

  3. コマンドラインツール。これらはすべて、テキスト編集、ファイルのダウンロード、システムの管理などを行うために開始できる小さなプログラムです。この時点で、UNIXシステムはシステム管理者にとって完全に使用可能です。Windowsでは、このレイヤーはもう存在しません。

  4. グラフィカルユーザーインターフェイス。これらは単なるプログラムでもあり、唯一の違いはテキストを書く代わりに画面にウィンドウを描くことです。これにより、システムは一般ユーザーにとって使いやすくなります。

サービスやイベントはすべて下から上に移動します。

ライブラリ-共通プラットフォーム

プログラムは、ウィンドウの表示、画面での描画、ファイルのダウンロードなど、多くの一般的なことを行います。これらのことは複数のプログラムで同じであるため、コードは別個の「ライブラリ」ファイル(.soファイル-共有オブジェクトを意味します)に配置されます。ライブラリはすべてのプログラムで共有できます。

考えられるすべてのものに、ライブラリがあります。PNGファイルを読み書きするためのものがあります。JPEGファイル用、XML読み取り用、暗号化用、ビデオ再生用などがあります。

Linuxでは、アプリケーション開発者向けの共通ライブラリはQtとGtkです。これらのライブラリは、特定のニーズに合わせて内部で低レベルのライブラリを使用し、アプリケーション開発者がアプリケーションをさらに高速に作成できるように、一貫性のある簡潔な方法で機能を公開します。

ライブラリは、プログラマがオペレーティングシステム用のエンドユーザーアプリケーションを構築できるアプリケーションプラットフォームを提供します。システムが提供する高品質のライブラリが多いほど、プログラマが美しいプログラムを作成するために書く必要のあるコードが少なくなります。

いくつかのライブラリは異なるオペレーティングシステムで使用できます(たとえば、Qtはそうです)。これにより、プログラムがそのプラットフォームでのみ実行できるように制限されます。

プロセス間通信

オペレーティングシステムの3番目のコーナー部分は、プログラムが相互に通信できる方法です。これらはプロセス間通信(IPC)メカニズムです。これらは、共有メモリの一部など、いくつかのフレーバーに存在します。または、データを交換するために2つのプログラム間に小さなチャネルが設定されます。各プログラムがメッセージを投稿し、応答を受信できる中央のメッセージバスもあります。これはグローバルコミュニケーションに使用され、どのプログラムが応答できるかは不明です。

ライブラリからオペレーティングシステムまで

ライブラリ、IPC、カーネルを適切に配置することで、プログラマはシステムサービス、ユーザー管理、構成、管理、オフィスワーク、エンターテイメントなどのあらゆる種類のアプリケーションを構築できます。これにより、初心者ユーザーが「オペレーティングシステム「。

UNIX / Linuxシステムでは、すべてのサービスは単なるプログラムです。すべてのシステム管理ツールは単なるプログラムです。彼らはすべて自分の仕事をし、一緒に連鎖することができます。http://codingdomain.com/linux/sysadmin/に多くの主要なプログラムをまとめました。


Windowsで識別可能な部品

UNIXは、主にプログラム、ファイル、および制限された権限のシステムです。多くの複雑さは回避されており、簡単な仕事をしているように見えながらも強力なシステムになっています。

詳細には、これらはUNIX / Linuxシステム全体に見られる原則です。

  • 情報にアクセスする方法は統一されています。(「すべては単なるファイル」)。ファイル、ネットワークソケット、IPCチャネル、カーネルパラメーター、ブロックデバイスをファイルとして開くことができます。したがって、/ dev、/ sys、および/ procに仮想ファイルシステムが表示されます。必要なAPIはopenreadとだけcloseです。

  • 基になるシステムは透過的です。すべてのプログラムは同じルールの下で動作します。Windowsとは異なり、「コンソールプログラム」、「GUIプログラム」、または「バックグラウンドサービス」の間に人為的な違いはありません。それらはすべて単なるプログラムであり、たまたま異なることをしています。また、すべて同じ方法で観察、分析、デバッグできます。

  • 設定は読み取り、編集が可能で、コメントを付けることができます。通常、INI形式の形式がありますが、そのアプリケーションのニーズに合わせてカスタム形式を使用する場合があります。それらは単なるファイルであるため、他のシステムにコピーしたり、アーカイブしたり、標準ツールでバックアップしたりできます。

  • 大規模な「一度にすべてを実行する」アプリケーションはありません。マントラは「一つのことをして、うまくやる」です。コマンドラインツールはチェーン化でき、一緒に強力にすることができます。個別のサービス(SMTP、IMAP、POP、ログインなど)は個別のサブプログラムであり、複雑な絡み合ったコードとセキュリティの問題を回避します。複雑なデスクトップ環境は、ハードワークを個々のプログラムに委任します。

  • fork()。新しいプログラムは、既存のプログラムの複製自体によって開始されます。クローンはすべて(ファイルハンドルなど)をセットアップし、オプションで新しいプログラムコードに置き換えます。これにより、新しいプログラムに同じセキュリティ設定と制限を適用したり、メモリを共有したり、IPCメカニズムを設定したりすることが非常に簡単になります。プロセスを開始するコストも非常に低いです。

  • ファイルシステムは1つのツリーであり、そこに他のディスクパーティションとネットワーク共有をマウントできます。再び、データにアクセスする普遍的な方法があります。一般的なシステムの場所(たとえば/usr、ネットワーク共有として簡単にマウントできます)。

  • システムは、低いユーザー特権用に構築されています。ログイン後、すべてのユーザー(rootを除く)は独自のリソースに制限され、アプリケーションとファイルのみを実行します。ネットワークサービスは、できるだけ早く特権を減らします。より多くの特権を取得するか、誰かに代わって特権ジョブを実行するように依頼する明確な方法が1つあります。他のすべての呼び出しは、プログラムの制限と制限によって制限されます。

  • すべてのプログラムは、ユーザーのホームディレクトリの隠しファイル/フォルダーに設定を保存します。グローバル設定ファイルを書き込もうとするプログラムはありません。

  • 秘密のメカニズムまたは特定の1対1メカニズムよりも、公然と説明されたコミュニケーションメカニズムへの好意。他のベンダーとソフトウェア開発者は同じ仕様に従うことをお勧めします。そのため、物事を簡単に接続、交換、および疎結合できます。


1
素敵な答え、簡単に説明するのは本当に難しいことです!ありがとう!;-)
サンダーベルスリュー

1
はい、この答えはよくやった。
ステファン

14
+10ボタンはどこですか?
EricSchaefer

1
コメントと投票に感謝します!答えがこれをよく理解していることを知っているのは素晴らしいです!
vdboor

1
@faif、それは非常に標準的であり(Microsoftのオペレーティングシステムにもあります)、美しさは見る人の目にあります。ポイントは、すべてがファイルであり、特別なものであってもということです。
-psusi

11

UNIXは強力なOSであり、40年以上にわたって成功を収めてきた(コンピューターサイエンスではほぼ永遠に成功している)サウンドデザインに基づいています。中央テクノロジーは、C言語と無数の小さなプログラム、つまりUNIXコマンドに基づいています。基本的な哲学は、McIlroyによって要約されています。

1つのことを行うプログラムを作成し、それをうまく実行します。連携して動作するプログラムを作成します。テキストストリームを処理するプログラムを作成します。これは、ユニバーサルインターフェースであるためです。

UNIX哲学の詳細については、ESRaymondの「The Art of UNIX Programming」を参照してください。


2
「UNIXプログラミングの技術」の+1。ただし、APIはCを中心に定義されていますが、Haskellでシステム全体を実装する(技術的な問題はありません;))などの技術的な問題はありません。
マチェイピエチョトカ

3
アセンブリの一部もHaskellで作成できます。見てい可能性を
フィル・ミラー

10

ここにはいくつかの優れた答えがあります。ただし、除外されていると思うことの1つは、* nixが他のオペレーティングシステム、特にMicrosoft Windowsとどのように異なるかです。

上記で既に説明した「1つのことを行い、うまくやる」という基本概念は、* nixオペレーティングシステムの中心であるため、見落とされることがあります。しかし、Linuxを非常に柔軟かつ強力にするのは、この設計哲学です。

たとえば、MS Windowsのグラフィックユーザーインターフェイス(GUI)は、OSに絡み合っています。GUIなしでMSオペレーティングシステムをインストールすることは事実上不可能です。Linuxでは、グラフィックコンポーネントをまったく持たないサーバーまたは組み込みシステムを簡単に起動できます。完全にコマンドライン駆動でありながら、フル機能のサーバーであることができます。

Linuxのモジュール設計により、システム管理者は、オペレーティングシステムを再起動せずにサービスを停止、アップグレード、および再起動できます。実際、Linuxオペレーティングシステムを再起動する必要があるのは、カーネル自体が変更またはアップグレードされているときだけです。

たとえば、Linuxに新しいWindowsマネージャー(gnome、kdeのいずれか)をインストールすると、現在システムにログインしているユーザーは気付かない場合があります。

Windowsでは、多くの場合、システムの最も単純な変更には再起動が必要ですが、これは実際の技術的要件よりも安全性の問題のほうが大きい場合があります。これはMSオペレーティングシステムの基本的な欠陥の1つだと思います。Linuxでは、多くのドライバーモジュールをアップグレードでき、ユーザーにほとんどまたはまったく影響を与えません。Windowsでは、単に新しいアプリケーションをインストールする場合、ボックス全体を再起動する必要があります。

このモジュール設計により、Linuxに非常に高い柔軟性がもたらされます。各Linuxシステムは、可能な限り少ないリソースオーバーヘッドで、達成する必要がある特定のタスクに合わせて調整できます。Windowsでは、GUIインターフェースをオフにして単純なHTTPサーバーを実行することはできません。Windowsが想定するメモリフットプリントにより、ハードウェアが下がらない障壁が作成されます。これが、Linuxが多くのモバイルおよび組み込みアプリケーションの選択肢のOSになった主な理由です。

続けることができますが、これらの例が、Linuxがこれほど人気を博した理由と、他のOSとの実際の違いを説明するのに役立つことを願っています。



2

Unix Env​​ironment 2eのAdvanced Programmingを読んで、Single Unix Standard(SUS)APIおよびPOSIXについて多くのことを学ぶことをお勧めします。

しかし、これは非常にCの重い本であり、リファレンスマニュアルです。あなたが不眠症に問題がある場合は、あなたと一緒に寝てください。それはさておき、あなたがUnix Cプログラマーなら、それは必需品です。


2

前の2つの本の推奨事項の精神で、私もお勧めします

M. KerriskによるLINUXプログラミングインターフェイス

これは、UNIX / Linuxシステムプログラミングのトピックを対象としていますが、Linuxおよびより一般的にUNIXシステムがプログラマー/ユーザーの観点からどのように機能するかに関する多くの詳細情報を明らかにします。vdboorの回答で言及されている箇条書きのほとんどを詳細に掘り下げ、UNIXの基本的な概念とその基盤の感触/全体像を把握するために、理解可能で読みやすい方法で十分な詳細を明らかにします。

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