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

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


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

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

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

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

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

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