| オペレーティングシステム |
|---|
| 共通の特徴 |
オペレーティングシステム( OS ) は、コンピュータのハードウェアとソフトウェアのリソースを管理し、コンピュータ プログラムに共通のサービスを提供するシステム ソフトウェアです。
タイムシェアリングオペレーティング システムは、システムを効率的に使用するためにタスクをスケジュールします。また、プロセッサ時間、大容量ストレージ、周辺機器、およびその他のリソースのコストを割り当てるための会計ソフトウェアも含まれる場合があります。
入出力やメモリ割り当てといったハードウェア機能に関しては、オペレーティングシステムはプログラムとコンピュータハードウェアの間の仲介役として機能しますが[ 1 ] [ 2 ]、アプリケーションコードは通常ハードウェアによって直接実行され、OS機能へのシステムコールを頻繁に実行したり、OSによって割り込まれたりします。オペレーティングシステムは、携帯電話やビデオゲーム機からウェブサーバーやスーパーコンピュータに至るまで、コンピュータを搭載した多くのデバイスに搭載されています。
2025年11月現在、Androidは38%の市場シェアで最も普及しているオペレーティングシステムであり、これにMicrosoft Windowsが33%、iOSとiPadOSが15%、macOSが4%、Linuxが1%と続いている。Android、iOS、iPadOSはスマートフォンなどのモバイルデバイス用のオペレーティングシステムであり、Windows、macOS、Linuxはデスクトップコンピュータ用のオペレーティングシステムである。[ 3 ] Linuxディストリビューションは、サーバーおよびスーパーコンピューティング分野で主流である。他の特殊なクラスのオペレーティングシステム(特殊用途オペレーティングシステム)、[ 4 ] [ 5 ]組み込みおよびリアルタイムシステムなど、多くのアプリケーション向けに存在している。セキュリティ重視のオペレーティングシステムも存在する。一部のオペレーティングシステムはシステム要件が低い(例:軽量Linuxディストリビューション)。その他はシステム要件が高い場合がある。
一部のオペレーティング システムはインストールが必要であったり、購入したコンピュータにプレインストールされている場合 ( OEMインストール) がありますが、その他のオペレーティング システムはメディア (ライブ CDなど) またはフラッシュ メモリ ( USBスティックからの LiveUSB など) から直接実行できます。
オペレーティングシステムは定義が難しいが[ 6 ] 、「ユーザーとアプリケーションのためにコンピュータのリソースを管理するソフトウェア層」と呼ばれている。[ 7 ]オペレーティングシステムには、カーネルと呼ばれる常時実行されているソフトウェアが含まれるが、他のソフトウェアも含まれる場合がある。[ 6 ] [ 8 ]コンピュータ上で実行できる他の2種類のプログラムは、システムプログラム(オペレーティングシステムに関連付けられているが、カーネルの一部ではない場合がある)とアプリケーション(その他のすべてのソフトウェア)である。[ 8 ]
オペレーティングシステムが果たす主な目的は3つあります。[ 9 ]
マルチプロセッサでは、複数の CPU がメモリを共有します。マルチコンピュータまたはクラスター コンピュータには複数の CPU があり、各 CPU は独自のメモリを持っています。大規模なマルチプロセッサは設計が難しく、法外に高価であるため、マルチコンピュータが開発されました。 [ 17 ]必要なマシンのサイズのため、クラウド コンピューティングでは一般的に使用されています。 [ 18 ]異なる CPU は、多くの場合、互いにメッセージを送受信する必要があります。 [ 19 ]良好なパフォーマンスを確保するには、これらのマシンのオペレーティング システムでこのパケットのコピーを最小限に抑える必要があります。[ 20 ]新しいシステムでは、多くの場合、マルチキュー(ユーザー グループを別々のキューに分ける) が採用されており、パケットのコピーの必要性を減らし、より多くの同時ユーザーをサポートできます。[ 21 ]もう 1 つの手法は、各 CPU が他の CPU に属するメモリにアクセスできるようにするリモート ダイレクト メモリ アクセスです。[ 19 ]マルチコンピュータオペレーティングシステムは、CPUが別のCPU上のプロシージャを呼び出すことができるリモートプロシージャコール[ 22 ]や、オペレーティングシステムが仮想化を使用して物理的に存在しない共有メモリを生成する分散共有メモリをサポートすることがよくあります。[ 23 ]
分散システムとは、ネットワークに接続された独立したコンピュータのグループであり、各コンピュータは独自のオペレーティングシステムとファイルシステムを持つ場合があります。マルチコンピュータとは異なり、分散システムは世界中のどこにでも分散している可能性があります。[ 24 ]ミドルウェアは、オペレーティングシステムとアプリケーションの間に追加されるソフトウェア層であり、一貫性を向上させるためによく使用されます。ミドルウェアはオペレーティングシステムと同様に機能しますが、真のオペレーティングシステムではありません。[ 25 ]
組み込みオペレーティングシステムは、 IoT機器であろうとネットワークに接続されていない機器であろうと、組み込みコンピュータシステムで使用するために設計されています。組み込みシステムには多くの家電製品が含まれます。組み込みシステムの特徴は、ユーザーがインストールしたソフトウェアをロードしないことです。そのため、異なるアプリケーション間の保護が不要で、よりシンプルな設計が可能になります。非常に小さなオペレーティングシステムは10キロバイト未満で動作することがあり、[ 26 ] 最も小さいものはスマートカード用です。[ 27 ] 例としては、Embedded Linux、QNX、VxWorks、そして超小型システムのRIOTやTinyOSなどがあります。[ 28 ]
リアルタイムオペレーティングシステムは、特定の時点までにイベントやデータを処理することを保証するオペレーティングシステムです。ハードリアルタイムシステムは正確なタイミングを必要とし、製造業、航空電子工学、軍事などの分野で広く使用されています。[ 28 ]ソフトリアルタイムシステムでは、時折イベントが失われても許容されます。このカテゴリには、オーディオやマルチメディアシステム、スマートフォンなどが含まれることがよくあります。[ 28 ]ハードリアルタイムシステムが十分なタイミング精度を実現するために、 eCosのようにアプリケーション間の保護のない単なるライブラリになっていることがよくあります。[ 28 ]
ハイパーバイザーは、仮想マシンを実行するオペレーティングシステムです。仮想マシンはハードウェアをエミュレートするアプリケーションです。言い換えれば、オペレーティングシステムが動作するように設計された実際のハードウェアと可能な限り同じように動作します。[ 14 ] [ 29 ]仮想マシンは一時停止、保存、再開が可能なため、オペレーティングシステムの研究、開発、[ 30 ]およびデバッグに役立ちます。[ 31 ]また、ベースオペレーティングシステムと互換性のないアプリケーションでもコンピュータ上で実行できるため、移植性が向上します。[ 14 ]
ライブラリオペレーティングシステム(libOS)は、ネットワークなどの一般的なオペレーティングシステムが提供するサービスがライブラリの形で提供され、単一のアプリケーションと構成コードで構成されて、ユニカーネル( [ 32 ]ライブラリから絶対に必要なコード部分のみが抽出され、結合された [ 33 ])、単一のアドレス空間、クラウドまたは組み込み環境に展開できるマシンイメージ)を構築するオペレーティングシステムです。
オペレーティングシステムコードとアプリケーションコードは分離された保護ドメインで実行されず(少なくとも概念的には単一のアプリケーションしか実行されていないため、アプリケーション間の干渉を防ぐ必要はない)、OSサービスは単純なライブラリ呼び出し(コンパイラのしきい値に基づいてインライン化される可能性がある)を介してアクセスされ、組み込みOSやリアルタイムOSと同様に、 通常のコンテキストスイッチのオーバーヘッドは発生しない。 [ 34 ]このオーバーヘッドは無視できない。モード切り替えの直接的なコストに加えて、重要なプロセッサ構造( CPUキャッシュ、命令パイプラインなど)の間接的な汚染も必要であり、ユーザーモードとカーネルモードの両方のパフォーマンスに影響を与える。 [ 35 ]

1940年代後半から1950年代にかけての最初のコンピュータは、プログラミング言語やオペレーティングシステムを使用せずに、プラグボードまたはパンチカードなどのメディアに入力されたマシンコードによって直接プログラムされていました。 [ 36 ] 1950年代半ばにトランジスタが導入された後、メインフレームが構築され始めました。これらには、プログラムの実行をスケジュールするなど、現代のオペレーティングシステムが行うことを手動で行う専門のオペレーターが必要でしたが[ 36 ] [ 37 ] 、メインフレームにはまだFortranモニターシステム(FMS)やIBSYSなどの基本的なオペレーティングシステムがありました。[ 38 ] 1960年代に、IBMは最初の相互互換性のあるコンピュータシリーズ(System/360 )を発表しました。それらはすべて、何千ものバグのある何百万行ものアセンブリ言語で構成された同じオペレーティングシステムであるOS/360を実行していました。 OS/360は、マルチプログラミングをサポートした最初の人気オペレーティングシステムでもありました。これにより、CPUをあるジョブに使用させながら、別のジョブが入出力(I/O)を待機することができました。複数のジョブをメモリに保持するには、メモリのパーティショニングと、あるジョブが別のジョブに割り当てられたメモリにアクセスすることを防ぐための保護が必要でした。[ 39 ]
同じ頃、テレプリンターが端末として使用され始め、複数のユーザーが同時にコンピューターにアクセスできるようになりました。オペレーティングシステムMULTICSは、数百のユーザーが大型コンピューターにアクセスできるようにすることを目的としていました。採用は限定的でしたが、クラウドコンピューティングの先駆けと考えることができます。UNIXオペレーティングシステムは、シングルユーザー向けにMULTICSを開発したことから始まりました。[ 40 ] UNIXのソースコードが利用可能であったため、互換性のない他のオペレーティングシステムの基礎となり、その中で最も成功したのはAT&TのSystem Vとカリフォルニア大学バークレー校のBSD ( Software Distribution )でした。 [ 41 ]互換性を高めるために、IEEEはオペレーティングシステムアプリケーションプログラミングインターフェース(API)のPOSIX標準をリリースし、これはほとんどのUNIXシステムでサポートされています。MINIXはUNIXの簡素化されたバージョンで、1987年に教育目的で開発され、市販のフリーソフトウェアLinuxのきっかけとなりました。 2008年以降、MINIXはほとんどのIntelマイクロチップのコントローラーで使用されており、LinuxはデータセンターやAndroidスマートフォンで広く使用されています。 [ 42 ]


大規模集積回路の発明により、1980年頃からパーソナルコンピュータ(当初はマイクロコンピュータと呼ばれていた)の生産が可能になった。 [ 43 ]約5年間、CP/M(マイクロコンピュータ用制御プログラム)がマイクロコンピュータ用の最も人気のあるオペレーティングシステムだった。[ 44 ]その後、IBMはマイクロソフトからディスクオペレーティングシステムを買収し、IBMはIBM PC DOSとして、マイクロソフトはMS-DOS (Microsoft Disk Operating System)として販売し、 IBM PC互換機で広く使用された。後期バージョンでは、UNIXから機能を借用するなどして、より高度なものになった。[ 44 ]
AppleのMacintoshは、グラフィカルユーザーインターフェース(GUI)を採用した最初の普及型コンピュータでした。GUIは、それ以前のオペレーティングシステムが使用していたテキストのみのコマンドラインインターフェースよりもはるかにユーザーフレンドリーであることが証明されました。Macintoshの成功に続いて、MS-DOSはWindowsと呼ばれるGUIオーバーレイでアップデートされました。Windowsは後にスタンドアロンオペレーティングシステムとして書き直され、別のオペレーティングシステム(VAX VMS)から多くの機能を借用したため、多額の法的和解金が支払われました。[ 45 ] 21世紀において、Windowsはパーソナルコンピュータでは依然として人気がありますが、サーバーの市場シェアは低下しています。UNIXオペレーティングシステム、特にLinuxは、エンタープライズシステムとサーバーで最も人気がありますが、モバイルデバイスや他の多くのコンピュータシステムでも使用されています。[ 46 ]
モバイルデバイスでは、当初Symbian OSが主流でしたが、 BlackBerry OS(2002年導入)とiPhone向けiOS(2007年以降)に取って代わられました。その後、 LinuxカーネルとCライブラリ( Bionic )を部分的にBSDコードに基づいて採用したオープンソースのAndroidオペレーティングシステム(2008年導入)が最も人気を博しました。[ 47 ]
オペレーティングシステムのコンポーネントは、コンピュータの様々な部分が連携して機能するように設計されています。DOSが事実上廃止されたため、すべてのユーザーソフトウェアはハードウェアにアクセスするためにオペレーティングシステムと連携する必要があります。
カーネルは、オペレーティングシステムにおいて、異なるアプリケーションとユーザー間の保護を提供する部分です。この保護は、エラーを1つのプログラムに隔離することで信頼性を向上させるだけでなく、悪意のあるソフトウェアの力を制限し、個人データを保護し、1つのプログラムがコンピュータのリソースを独占できないようにすることでセキュリティを向上させる上でも重要です。[ 48 ]ほとんどのオペレーティングシステムには2つの動作モードがあります。[ 49 ]ユーザーモード では、ハードウェアがソフトウェアが正当な命令のみを実行しているかどうかをチェックしますが、カーネルは無制限の権限を持ち、これらのチェックの対象にはなりません。[ 50 ]カーネルは他のプロセスのメモリ管理や入出力デバイスへのアクセス制御も行います。[ 51 ]

オペレーティングシステムは、アプリケーションプログラムとコンピュータハードウェアとの間のインタフェースを提供します。これにより、アプリケーションプログラムは、オペレーティングシステムにプログラムされた規則と手順に従うだけでハードウェアと対話できます。オペレーティングシステムは、アプリケーションプログラムの開発と実行を簡素化する一連のサービスでもあります。アプリケーションプログラムの実行には通常、オペレーティングシステムカーネルによるプロセスの作成が伴います。オペレーティングシステムカーネルは、メモリ空間やその他のリソースを割り当て、マルチタスクシステムでプロセスの優先順位を設定し、プログラムのバイナリコードをメモリにロードし、アプリケーションプログラムの実行を開始します。その後、アプリケーションプログラムはユーザーやハードウェアデバイスと対話します。ただし、一部のシステムでは、アプリケーションはオペレーティングシステムに対して、サブルーチンまたは別のスレッドとして、同じプロセス内の別のアプリケーションを実行するように要求できます。たとえば、OS/360 および後継製品のLINKおよびATTACH機能です。
割り込み(アボート、例外、フォールト、シグナル、[ 52 ]またはトラップとも呼ばれる)[ 53 ]は、ほとんどのオペレーティングシステムが環境に反応するための効率的な方法を提供します。割り込みが発生すると、中央処理装置(CPU)の制御フローが、現在実行中のプログラムから割り込みハンドラ(割り込みサービスルーチン(ISR)とも呼ばれる)に変更されます。[ 54 ] [ 55 ]割り込みサービスルーチンにより、中央処理装置(CPU)のコンテキストスイッチが発生する可能性があります。[ 56 ] [ a ]コンピュータが割り込みを処理する方法の詳細は、アーキテクチャごとに異なり、割り込みサービスルーチンの動作の詳細はオペレーティングシステムごとに異なります。[ 57 ]ただし、いくつかの割り込み機能は共通です。[ 57 ]アーキテクチャとオペレーティングシステムは次の要件を満たす必要があります。[ 57 ]
ソフトウェア割り込みは、イベントが発生したことをプロセスに伝えるメッセージです。 [ 52 ]これは、イベントが発生したことを中央処理装置(CPU)に伝えるハードウェア割り込みとは対照的です。 [ 58 ]ソフトウェア割り込みはハードウェア割り込みに似ており、現在実行中のプロセスからの変更があります。[ 59 ]同様に、ハードウェア割り込みとソフトウェア割り込みはどちらも割り込みサービスルーチンを実行します。
ソフトウェア割り込みは通常発生するイベントである可能性があります。タイムスライスが発生することが予想されるため、カーネルはコンテキストスイッチを実行する必要があります。[ 60 ]コンピュータプログラムは、データが多すぎてアルゴリズムの実行に時間がかかりすぎる場合に備えて、数秒後にタイマーが切れるように設定することがあります。[ 61 ]
ソフトウェア割り込みは、不正な機械命令などのエラー状態である可能性があります。[ 61 ]しかし、最も一般的なエラー状態は、ゼロ除算と無効なメモリアドレスへのアクセスです。[ 61 ]
ユーザーはカーネルにメッセージを送信して、現在実行中のプロセスの動作を変更することができます。[ 61 ]たとえば、コマンドライン環境では、割り込み文字(通常はControl-C)を押すと、現在実行中のプロセスが終了することがあります。[ 61 ]
x86 CPUのソフトウェア割り込みを生成するには、INTアセンブリ言語命令が利用できます。[ 62 ]構文は で、は割り込みベクターテーブルへのオフセット番号(16進形式)です。 INT XX
Unix系オペレーティングシステムでソフトウェア割り込みを生成するために、システムコールは別のプロセスにシグナルを送信します。 [ 63 ]は受信プロセスのプロセス識別子です。 [ b ]は送信されるシグナル番号(ニーモニック形式)です。(初期の実装ではプロセスを終了するだけだったので、という不快な名前が付けられました。)[ 64 ]kill(pid,signum)pidsignumkill
Unix系オペレーティングシステムでは、シグナルによってプロセスに非同期イベントの発生が通知されます。[ 63 ]非同期通信を行うには、割り込みが必要です。[ 65 ]プロセスが他のプロセスと非同期通信する必要がある理由の1つは、古典的なリーダー/ライター問題のバリエーションを解決することです。[ 66 ]ライターは、出力をリーダーの入力ストリームに送るために、シェルからパイプを受け取ります。 [ 67 ]コマンドライン構文は次のとおりですalpha | bravo。alphaは計算の準備ができるとパイプに書き込み、その後待機キューで待機します。[ 68 ]その後、準備完了キューbravoに移動され、すぐに入力ストリームから読み取ります。[ 69 ]カーネルは、パイプを調整するためにソフトウェア割り込みを生成します。 [ 69 ]
信号は7つのカテゴリーに分類される。[ 63 ]カテゴリーは以下の通りである。
入出力(I/O)デバイスはCPUよりも低速です。そのため、CPUが各I/Oの完了を待つ必要があると、コンピュータの速度が低下します。代わりに、コンピュータはI/Oの完了を割り込みで処理することで、ポーリングやビジーウェイトを回避できます。[ 70 ]
一部のコンピュータでは、文字または単語ごとに割り込みが必要となり、CPU時間をかなり消費します。ダイレクトメモリアクセス(DMA)は、デバイスがCPUをバイパスしてメインメモリに直接アクセスできるようにするアーキテクチャ機能です。[ 71 ](アーキテクチャとは別に、デバイスはメインメモリとの間で直接またはバス経由でダイレクトメモリアクセス[ c ]を実行する場合があります。) [ 72 ] [ d ]
オペレーティング システムには、入出力デバイスにアクセスするための デバイス ドライバーが含まれています。
コンピュータユーザーがキーボードのキーを入力すると、通常、その文字は即座に画面に表示されます。同様に、ユーザーがマウスを動かすと、カーソルは即座に画面上を移動します。キー入力やマウスの動きごとに、割り込み駆動型I/Oと呼ばれる割り込みが発生します。割り込み駆動型I/Oは、プロセスが文字[ 72 ]または単語[ 73 ]を送信するたびに割り込みを発生させる場合に発生します。
ハードディスクドライブ、ソリッドステートドライブ、磁気テープドライブなどのデバイスは、非常に高速にデータを転送できるため、バイトまたはワードが転送されるたびにCPUに割り込みをかけ、デバイスとメモリ間でバイトまたはワードを転送させると、CPU時間が長くなりすぎます。その代わりに、データはチャネルやダイレクトメモリアクセスコントローラなどのハードウェアによってCPUとは独立してデバイスとメモリ間で転送され、すべてのデータが転送された場合にのみ割り込みが送信されます。[ 74 ]
コンピュータ プログラムがシステム コールを実行してブロック I/O書き込み操作を実行する場合、システム コールは次の命令を実行する可能性があります。
書き込みが行われている間、オペレーティングシステムは通常通り他のプロセスにコンテキストスイッチします。デバイスが書き込みを完了すると、デバイスは割り込み要求をアサートして現在実行中のプロセスを中断します。また、デバイスはデータバスに整数を送信します。[ 78 ]割り込み要求を受け入れると、オペレーティングシステムは以下の処理を行います。
書き込みプロセスのタイムスライスが期限切れになると、オペレーティングシステムは次の処理を実行します。[ 79 ]
プログラムカウンタがリセットされると、中断されたプロセスはタイムスライスを再開します。[ 57 ]
マルチプログラミング対応のオペレーティングシステムカーネルは、とりわけ、各プログラムが現在使用しているすべてのシステムメモリを管理する責任を負います。これにより、あるプログラムが別のプログラムが既に使用しているメモリに干渉することがなくなります。プログラムはタイムシェアリングを行うため、各プログラムはメモリに独立してアクセスする必要があります。
多くの初期のオペレーティングシステムで採用されていた協調メモリ管理は、すべてのプログラムがカーネルのメモリマネージャを自発的に使用し、割り当てられたメモリを超えないことを前提としています。しかし、プログラムには割り当てられたメモリを超えるバグがしばしば含まれるため、このメモリ管理システムは現在ではほとんど見られません。プログラムに障害が発生すると、他の1つ以上のプログラムが使用しているメモリが影響を受けたり、上書きされたりする可能性があります。悪意のあるプログラムやウイルスは、他のプログラムのメモリを意図的に改ざんしたり、オペレーティングシステム自体の動作に影響を与えたりする可能性があります。協調メモリ管理では、1つのプログラムが誤動作するだけでシステムが クラッシュする可能性があります。
メモリ保護により、カーネルはプロセスによるコンピュータのメモリへのアクセスを制限できます。メモリ保護には、メモリセグメンテーションやページングなど、様々な方法があります。いずれの方法も、ある程度のハードウェアサポート( 80286 MMUなど)を必要としますが、これはすべてのコンピュータに搭載されているわけではありません。
セグメンテーションとページングの両方において、特定の保護モードレジスタは、実行中のプログラムがアクセスを許可するメモリアドレスをCPUに指定します。他のアドレスへのアクセスを試みると割り込みが発生し、CPUは再びスーパーバイザモードに入り、カーネルが制御権を握ります。これはセグメンテーション違反、または略してSeg-Vと呼ばれます。このような操作に意味のある結果を割り当てることは困難であり、また通常はプログラムの不正動作の兆候であるため、カーネルは通常、問題のあるプログラムを終了させ、エラーを報告します。
Windows 3.1からMEまではある程度のメモリ保護機能を備えていましたが、プログラムはそれを簡単に回避することができました。セグメンテーション違反が発生したことを示す一般保護違反が発生しましたが、それでもシステムはクラッシュすることがよくありました。

仮想メモリ アドレス指定 (ページングやセグメンテーションなど) を使用すると、カーネルは各プログラムが使用できるメモリをいつでも選択できるため、オペレーティング システムは複数のタスクで同じメモリ位置を使用できます。
プログラムがアクセスできないメモリ([ e ]メモリ)にアクセスしようとしたが、そのメモリには既に割り当てられていた場合、カーネルは割り込みを受けます。この種の割り込みは、典型的にはページフォールトです。
カーネルはページフォールトを検出すると、通常、ページフォールトを引き起こしたプログラムの仮想メモリ範囲を調整し、要求されたメモリへのアクセスを許可します。これにより、カーネルは特定のアプリケーションのメモリがどこに保存されるか、あるいはメモリが既に割り当てられているかどうかさえも、自由に決定できるようになります。
現代のオペレーティングシステムでは、アクセス頻度の低いメモリをディスクなどのメディアに一時的に保存し、他のプログラムがその領域を利用できるようにすることができます。これはスワッピングと呼ばれ、メモリ領域を複数のプログラムで使用でき、そのメモリ領域の内容は必要に応じて交換またはスワップできます。
仮想メモリは、プログラマーやユーザーに、コンピュータ内に実際よりもはるかに多くのRAMがあるという認識を与えます。[ 80 ]
並行性とは、オペレーティングシステムが複数のタスクを同時に実行する能力を指します。[ 81 ]事実上すべての最近のオペレーティングシステムは並行性をサポートしています。[ 82 ]
スレッドは、プロセスの作業を複数の部分に分割し、それらを同時に実行することを可能にします。[ 83 ]スレッドの数は、利用可能なプロセッサの数によって制限されません。プロセッサよりもスレッドの数が多い場合、オペレーティングシステムカーネルはスレッドのスケジュール、一時停止、再開を行い、各スレッドの実行時間とCPU時間を制御し、各スレッドの実行を制御します。[ 84 ]コンテキストスイッチ 中、実行中のスレッドは一時停止され、その状態はスレッド制御ブロックとスタックに保存され、新しいスレッドの状態がロードされます。[ 85 ]歴史的に、多くのシステムでは、スレッドは制御を放棄するまで実行できました(協調的マルチタスク)。このモデルでは、1つのスレッドがプロセッサを独占できるため、現在ではほとんどのオペレーティングシステムがスレッドに割り込むことができます(プリエンプティブマルチタスク)。[ 86 ]
スレッドは独自のスレッドID、プログラムカウンタ(PC)、レジスタセット、スタックを持ちますが、コード、ヒープデータ、その他のリソースを同じプロセスの他のスレッドと共有します。[ 87 ] [ 88 ]そのため、スレッドを作成する方が新しいプロセスを作成するよりもオーバーヘッドが少なくなります。[ 89 ]シングルCPUシステムでは、並行処理とはプロセス間の切り替えのことです。多くのコンピュータは複数のCPUを備えています。[ 90 ]異なるCPU上で複数のスレッドを実行する並列処理は、同時に実行できる量に応じてプログラムを高速化できます。[ 91 ]

21世紀のコンピュータで使用される永続記憶装置は、揮発性のダイナミックランダムアクセスメモリ(DRAM)とは異なり、クラッシュや停電後もアクセス可能です。永続(不揮発性)記憶装置はバイトあたりのコストがはるかに安価ですが、アクセス、読み取り、書き込みに数桁長い時間がかかります。[ 92 ] [ 93 ] 2つの主要な技術は、磁気ディスクで構成されるハードドライブと、電気回路にデータを保存するソリッドステートドライブ(SSD)です。後者は高価ですが、より高速で耐久性に優れています。[ 94 ] [ 95 ]
ファイルシステムは、オペレーティングシステムが永続ストレージへのアクセスを簡素化するために使用する抽象化です。人間が判読できるファイル名やその他のメタデータを提供し、アクセスの分散化によってパフォーマンスを向上させ、複数のスレッドが同じメモリ領域にアクセスするのを防ぎ、破損を識別するためのチェックサムを備えています。[ 96 ]ファイルシステムは、ファイル(任意のサイズのデータの集合に名前を付けたもの)と、人間が判読できるファイル名やその他のディレクトリを列挙するディレクトリ(フォルダとも呼ばれる)で構成されています。 [ 97 ]絶対ファイルパスはルートディレクトリから始まり、句読点で区切られたサブディレクトリを列挙します。一方、相対パスはディレクトリからのファイルの位置を定義します。[ 98 ] [ 99 ]
システムコール(ライブラリによってラップされる場合もある)は、アプリケーションがファイルを作成、削除、開く、閉じるだけでなく、リンク、読み取り、書き込みも可能にする。これらの操作はすべて、アプリケーションに代わってオペレーティングシステムによって実行される。[ 100 ]オペレーティングシステムは、レイテンシを削減するために、最近要求されたメモリブロックをキャッシュに保存したり、アプリケーションが要求していないが次に必要になる可能性のあるデータをプリフェッチしたりすることなどを行う。 [ 101 ]デバイスドライバは、各入出力(I/O)デバイスに固有のソフトウェアであり、これによりオペレーティングシステムは異なるハードウェア上で変更を加えることなく動作することができる。[ 102 ] [ 103 ]
ファイルシステムのもう1つの構成要素は、ファイル名とメタデータを、その内容が格納されているデータブロックにマッピングする辞書です。 [ 104 ]ほとんどのファイルシステムは、ディレクトリを使用してファイル名をファイル番号に変換します。ブロック番号を見つけるために、オペレーティングシステムはインデックス(多くの場合、ツリーとして実装されています)を使用します。[ 105 ]これとは別に、空きブロックを追跡するための空き領域マップがあり、これは通常ビットマップとして実装されています。[ 105 ]どの空きブロックにも新しいファイルを格納できますが、多くのオペレーティングシステムは、パフォーマンスを最大化するために同じディレクトリ内のファイルをグループ化したり、断片化を減らすために定期的にファイルを再編成したりします。[ 106 ]
コンピュータのクラッシュやハードウェア障害が発生した場合のデータの信頼性の維持も懸念事項です。[ 107 ]ファイル書き込みプロトコルは、書き込み中にクラッシュが発生した場合でも、永続ストレージが部分的に書き込まれた不整合な状態にならないように、アトミック操作で設計されています。[ 108 ]データ破損は、冗長ストレージ(RAID( Redundant Array of Inexpensive Disks )など)[ 109 ] [ 110 ]と、データが破損したかどうかを検出するためのチェックサムによって対処されます。複数層のチェックサムとファイルのバックアップにより、システムは複数のハードウェア障害から回復できます。データ破損の検出と回復には、バックグラウンドプロセスがよく使用されます。[ 110 ]
最新のオペレーティング システムには、通常、TCP/IPプロトコル スタックなどのネットワーク スタックが含まれています。
セキュリティとは、同じコンピュータを使用する他のユーザーだけでなく、ネットワークを介してリモートアクセスしようとするユーザーからもユーザーを保護することを意味します。[ 111 ]オペレーティングシステムのセキュリティは、 CIA トライアドの 実現に基づいています。CIA トライアドとは、機密性(権限のないユーザーはデータにアクセスできない)、整合性(権限のないユーザーはデータを変更できない)、可用性(サービス拒否攻撃が発生した場合でも、権限のあるユーザーがシステムを引き続き利用できるようにすること)です。[ 112 ]他のコンピュータシステムと同様に、セキュリティドメイン(オペレーティングシステムの場合はカーネル、プロセス、仮想マシン)を分離することがセキュリティを実現する鍵となります。[ 113 ]セキュリティを強化するその他の方法としては、攻撃対象領域を最小限に抑えるための単純化、デフォルトでリソースへのアクセスをロックすること、すべての承認要求をチェックすること、最小権限の原則(タスクを実行するために必要な最小限の権限を付与すること)、権限の分離、共有データの削減などがあります。[ 114 ]
オペレーティングシステムの設計には、安全性の程度に差があります。カーネルとアプリケーションが分離されていないものは最も安全性が低く、ほとんどの汎用オペレーティングシステムのようにモノリシックカーネルを採用しているものは、カーネルの一部が侵害されると依然として脆弱です。より安全な設計では、マイクロカーネルが採用されており、カーネルの権限を複数のセキュリティドメインに分割することで、単一のカーネル侵害による影響を軽減しています。[ 115 ]ユニカーネルは、カーネルを最小化し、他のオペレーティングシステムの機能をアプリケーションごとに分離することでセキュリティを向上させる別のアプローチです。[ 115 ]
ほとんどのオペレーティングシステムはCまたはC++で記述されており、潜在的な脆弱性を悪用される可能性があります。これらの脆弱性に対する保護策にもかかわらず、境界チェックの欠如によって可能になるバッファオーバーフロー攻撃によって脆弱性が引き起こされます。[ 116 ] ハードウェアの脆弱性(一部はCPUの最適化によって引き起こされます)も、オペレーティングシステムを侵害するために利用される可能性があります。[ 117 ]オペレーティングシステムのプログラマがバックドアなどの脆弱性を意図的に埋め込んだ事例が知られています。[ 118 ]
オペレーティングシステムのセキュリティは、複雑さが増し、その結果バグが避けられなくなることで妨げられています。[ 119 ]オペレーティングシステムの形式的検証は実行できない場合があるため、開発者はオペレーティングシステムの強化を使用して脆弱性を減らします。[ 120 ]たとえば、アドレス空間レイアウトのランダム化、制御フローの整合性、[ 121 ]アクセス制限、[ 122 ]その他の技術。[ 123 ]オープンソースオペレーティングシステムにコードを投稿できる人には制限がありません。このようなオペレーティングシステムは、変更履歴が透明で、分散ガバナンス構造を備えています。[ 124 ]オープンソース開発者は、コードレビューと型チェックを使用して悪意のあるコードを消去し、セキュリティの脆弱性を見つけて排除するために協力して取り組むよう努めています。[ 125 ] [ 126 ] Andrew S. Tanenbaumは、すべてのオペレーティングシステムのソースコードを公開することを推奨し、そうすることで開発者が秘密に信頼を置き、信頼できない「暗黙によるセキュリティ」の慣行に依存することを防ぐと主張しています。[ 127 ]
ユーザーインターフェース(UI)は、人間とコンピュータのインタラクションをサポートするために不可欠です。あらゆるコンピュータで最も一般的な2つのユーザーインターフェースの種類は次のとおりです。
スマートフォンやタブレット端末を含むパーソナルコンピュータやワークステーションでは、ユーザー入力は通常、キーボード、マウス、トラックパッドまたはタッチスクリーンの組み合わせで行われ、これらはすべて専用のソフトウェアによってオペレーティングシステムに接続されています。[ 128 ]ソフトウェア開発者やプログラマーではないパーソナルコンピュータのユーザーは、入力と出力の両方にGUIを好む傾向があり、GUIはほとんどのパーソナルコンピュータでサポートされています。[ 129 ] GUIをサポートするソフトウェアは、入力とプレーンテキスト出力のコマンドラインよりも複雑です。プレーンテキスト出力はプログラマーに好まれることが多く、サポートも容易です。[ 130 ]
趣味のオペレーティングシステムは、既存のオペレーティングシステムから直接派生したコードではなく、ユーザーやアクティブな開発者が少ないものに分類されます。[ 131 ]
趣味的な開発は、6502マイクロプロセッサを搭載したシンプルなシングルボードコンピュータなど、 「自作」のコンピューティングデバイスをサポートするために行われる場合もあります。あるいは、既に広く使用されているアーキテクチャ向けの開発が行われる場合もあります。オペレーティングシステムの開発は、全く新しいコンセプトから生まれる場合もあれば、既存のオペレーティングシステムをモデル化することから始まる場合もあります。いずれの場合も、趣味家が自ら開発者となる場合もあれば、同じ興味を持つ少数の、時には組織化されていないグループと交流する場合もあります。
趣味用のオペレーティング システムの例としては、SyllableやTempleOSなどがあります。
アプリケーションが特定のオペレーティング システムで使用するために作成され、別の OS に移植される場合、そのアプリケーションに必要な機能は、その OS によって異なる方法で実装される可能性があり (関数の名前、引数の意味など)、アプリケーションを調整、変更、または保守する必要が生じます。
オペレーティングシステムの多様性をサポートするためのコストは、 JavaやQtなどのソフトウェアプラットフォーム向けにアプリケーションを作成することで回避できます。これらの抽象化は、特定のオペレーティングシステムとそのシステムライブラリへの適応コストを既に負担しています。
もう一つのアプローチは、オペレーティングシステムベンダーが標準を採用することです。例えば、POSIXとOSの抽象化レイヤーは共通性を提供し、移植コストを削減します。
2025年10月現在、 LinuxカーネルをベースとするAndroidは38%の市場シェアで最も人気のあるオペレーティングシステムであり、これにMicrosoft Windowsが31%、iOSとiPadOSが15%、macOSが7%、Linuxが1%と続いている。Android、iOS、iPadOSはモバイルオペレーティングシステムであり、Windows、macOS、Linuxはデスクトップオペレーティングシステムである。[ 3 ]

LinuxはGNU一般公衆利用許諾書(GPL)に基づいて配布されるフリーソフトウェアであり、その派生物はすべてソースコードを公開することが法的に義務付けられている。[ 132 ] Linuxはプログラマーが自らの使用を目的に設計されており、シンプルさと一貫性を重視し、少数の基本要素をほぼ無制限に組み合わせることができ、冗長性を避けている。[ 133 ]
その設計は、マイクロカーネルを使用していない他のUNIXシステムと似ています。[ 134 ] C言語で書かれており[ 135 ] UNIX System V構文を使用していますが、BSD構文もサポートしています。 Linuxは標準的なUNIXネットワーク機能とUNIXツールのフルスイートをサポートし、複数のユーザーをサポートし、プリエンプティブマルチタスクを採用しています。 当初は最小限の設計だったLinuxは、 16MB未満のRAMで動作できる柔軟なシステムですが、大規模なマルチプロセッサシステムでも使用されています。[ 134 ]他のUNIXシステムと同様に、Linuxディストリビューションはカーネル、システムライブラリ、およびシステムユーティリティで構成されています。[ 136 ] Linuxには、デスクトップ、フォルダーとファイルアイコンを備えたグラフィカルユーザーインターフェイス(GUI)と、コマンドライン経由でオペレーティングシステムにアクセスするオプションがあります。[ 137 ]
AndroidはLinuxをベースにした部分的にオープンソースのオペレーティングシステムであり、スマートフォンでの人気に加え、スマートウォッチ、自動車のダッシュボード、飛行機のシートバック、医療機器、家電製品など、GUIを必要とする組み込みシステムでも普及しているため、ユーザーに最も広く使用されているオペレーティングシステムとなっています。[ 138 ] Linuxとは異なり、Androidの大部分はJavaで書かれており、オブジェクト指向設計を採用しています。[ 139 ]

Windowsは、デスクトップパソコン、ノートパソコン、タブレット、携帯電話、ワークステーション、エンタープライズサーバー、Xboxコンソールなどで広く使用されている独自のオペレーティングシステムです。 [ 141 ]このオペレーティングシステムは、「セキュリティ、信頼性、互換性、高性能、拡張性、移植性、国際的なサポート」を目的として設計されましたが、後にエネルギー効率と動的デバイスのサポートも優先事項となりました。[ 142 ]
Windows Executiveは、プロセス、スレッド、セクション(ファイルなどのメモリオブジェクト)などの重要なデータ構造については、カーネルモードオブジェクトを介して動作します。[ 143 ] オペレーティングシステムは、多くのアプリケーションのI/Oを高速化する仮想メモリのデマンドページングをサポートしています。I/OデバイスドライバはWindowsドライバモデルを使用します。 [ 143 ] NTFSファイルシステムにはマスターテーブルがあり、各ファイルはメタデータを含むレコードとして表されます。 [ 144 ]スケジューリングにはプリエンプティブマルチタスクが含まれます。[ 145 ] Windowsには多くのセキュリティ機能があります。[ 146 ]特に重要なのは、アクセス制御リストと整合性レベルの使用です。すべてのプロセスには認証トークンがあり、各オブジェクトにはセキュリティ記述子が与えられます。以降のリリースでは、さらに多くのセキュリティ機能が追加されました。[ 144 ]
{{cite book}}:|website=無視されました (ヘルプ)集約型の
ワークロードのパフォーマンスに悪影響を及ぼします。システム コール汚染がアプリケーション パフォーマンスに与える影響を定量化した例を、図1に示します。この図は、SPEC CPU 2006 ベンチマークの 1 つ (Xalan)
について、システム コールの直前と
直後の
サイクルあたりのユーザー モード命令数 (カーネル サイクルと命令は無視) を示しています
。システムコールの影響で、サイクルあたりの命令数(IPC)が大幅に低下し、このアプリケーションのIPCが以前のレベルに戻るまでに最大14,000サイクルの実行を要します。後ほど説明するように、このパフォーマンス低下は主に、カーネルが主要なプロセッサ構造に与える干渉が原因です。
pwriteシグナルとは、イベントが発生したことをプロセスに通知するものです。シグナルはソフトウェア割り込みと呼ばれることもあります。
割り込みの概念は、長年にわたってその範囲を拡大してきました。80x86ファミリは、int(ソフトウェア割り込み)命令を導入したことで、割り込みをめぐる混乱をさらに深める結果となりました。実際、様々なメーカーが、本章で解説する現象を説明する際に、例外、フォールト、アボート、トラップ、割り込みといった用語を使用しています。残念ながら、これらの用語の正確な意味については明確なコンセンサスがありません。著者によって、それぞれ独自の用語が使用されています。
トラップと同様に、割り込みは実行中のプログラムを停止し、割り込みハンドラに制御を移します。割り込みハンドラは適切なアクションを実行します。処理が完了すると、割り込みハンドラは割り込みを受けたプログラムに制御を戻します。
ハードウェアは制御をオペレーティングシステムに移します。オペレーティングシステムはまず、レジスタとプログラムカウンタを保存することでCPUの状態を保存します。次に、発生した割り込みの種類を判断します。割り込みの種類ごとに、オペレーティングシステム内の個別のコードセグメントが、どのようなアクションを実行するかを決定します。
CPUを別のプロセスに切り替えるには、古いプロセスの状態を保存し、新しいプロセスのために保存した状態を読み込む必要があります。このタスクはコンテキストスイッチと呼ばれます。
ハードウェアは、通常はシステム バス経由で CPU に信号を送信することにより、いつでも割り込みをトリガーできます。
シグナルは、プログラムの通常の実行フローを中断するという点でハードウェア割り込みに似ています。ほとんどの場合、シグナルがいつ到着するかを正確に予測することはできません。
ソフトウェアイベントの発生。例えば、プロセスのCPU時間制限を超えた場合などです。