web-dev-qa-db-ja.com

UNIXまたはLinuxシステムはどのように機能しますか?

OSがどのように動作するか知りたい一言で言えば

  • 基盤となる基本コンポーネント
  • これらのコンポーネントがどのように連携するか
  • UNIXを作るもの
  • Windowsのような他のOSとの違いは何ですか
37
Sander Versluys

UNIXシステムは、いくつかの部分、つまり私が呼びたい層で構成されています。

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

レイヤリング

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

  2. バックグラウンドサブシステム。通常のプログラムだけがあり、邪魔にならないようになっています。リモートログインのようなものを処理し、中央メッセージバスを提供し、ハードウェア/ネットワークイベントに基づいてアクションを実行します。たとえば、Bluetooth検出、Wi-Fi管理など。すべてのネットワークサービス(ファイルサーバー、プリントサーバー、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スタイルの形式ですが、そのアプリケーションのニーズに合わせてカスタム形式を使用する場合があります。これらは単なるファイルであるため、他のシステムにコピーしたり、アーカイブしたり、標準的なツールでバックアップしたりできます。

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

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

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

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

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

  • 秘密のメカニズムまたは特定の1対1のメカニズムよりも、公開された通信メカニズムへの支持。他のベンダーやソフトウェア開発者も同じ仕様に従うことをお勧めします。そのため、物事を簡単に接続し、スワップアウトして、疎結合を保つことができます。

74
vdboor

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

1つのことを行うプログラムを作成し、それをうまく実行します。一緒に動作するプログラムを作成します。テキストストリームを処理するプログラムを作成します。これは、汎用インターフェイスであるためです。

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

11
Didier Trosset

ここにいくつかの優れた答えがあります。ただし、除外されていると思うのは、* 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とどう違うのかを説明するのに役立つことを願っています。

10
OldTimer

"UNIXオペレーティングシステムの設計" は、読むのに適した本です。

3
Hemant

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

The LINUX Programming Interface by M. Kerrisk

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

2
darbehdar

私は nix環境2eの高度なプログラミング を読んで、Unix Unixを構成する要素とコンポーネントがどのように機能するかについての考えを与える、Single Unix Standard(SUS)APIとPOSIXについて多くを学ぶことをお勧めします、そして一緒に働きます。

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

2
xenoterracide