class: title, smokescreen, shelf, no-footer # <small>情報技術応用特論 第04回<br>OS(1): OSの概要</small> <div class=footnote> <small><small> Copyright (C) Ken'ichi Fukamachi <fukachan@fml.org>, 2021-2025. CC BY-NC-SA 4.0 </small></small> </div> --- name: www-internals class: title, smokescreen, shelf, no-footer # <small>WWWサーバを例にOSの動作イメージを解説する</small> <div class=footnote> <small><small> </small></small> </div> --- class: img-right,compact # ネットワークの全体像(復習、networkのスライド再掲)  <small> - 右図: PC(サーバ)とPC間の通信 - END TO END (端〜端)通信 - 用語: 階層(Layer), 〜層 - 用語: プロトコル(取り決め,約束事) - TCP,IP,Ethernetなど - 用語: サーバ,クライアント - 右図: サーバ(左)とクライアント(右) - サーバ (図左上の業務用PC) - サービスを提供する側 - WWWサーバ,メールサーバ - クライアント (右端のPC) - サービスを受ける側(お客様) - ブラウザやメールソフト - 人間が操作しているPC </small> --- class: img-right,compact # サーバの全体像とキーワード <div class=footnote> <small><small> (脚注) WWWサーバプログラムの例: apacheやnginx、thttpd </small></small> </div>  <small> - 前頁のサーバ部分(図左端)を題材にして<b>OSの重要キーワード</b>を紹介します。 次頁から各ステップを簡単に見ていきます - 右図はWWWサーバの内部動作です。すでにTCPの3wayハンドシェイクが終わり、 WWWブラウザからリクエスト(GET / HTTP/1.0)のパケットが送られてきた時点を想定してください - 用語 - カーネル(kernel) ... OS本体と言うべき**特権**プログラム </small> --- class: img-right,compact # サーバの動作(1) <div class=footnote> <small><small> (脚注) もちろんブロードキャストも受け取ります(FF:FF:FF:FF:FF:FF宛のフレーム) </small></small> </div>  <small> - サーバ宛のイーサネットフレームをネットワークインターフェイス(**イーサネット**)カードが受け取ります - フレームヘッダの宛先MACアドレスがカードのMACアドレスと一致すれば自分宛ということなので、 カードはフレームを受け取ります。 宛先が異なれば無視します </small> --- class: img-right,compact # サーバの動作(2) <div class=footnote> <small><small> (脚注)各デバイスにあるコントローラも小さなコンピュータです </small></small> </div>  <small> - イーサネットカードのコントローラが、**ハードウエア割り込み**をかけます - OSが事前に設定した**割り込み**の設定表(**割り込みベクタ(interrupt vector)**)を検索し、 該当する処理関数が呼ばれます - この**ハードウエア固有の**処理関数を**デバイスドライバ**と呼びます - ハードウエアそれぞれに専用の**デバイスドライバ**が必要です - カーネルに該当するデバイスドライバがない場合、 そのハードウエアは利用できません </small> --- class: img-right,compact # サーバの動作(3) <div class=footnote> <small><small> (脚注)ここで出てくるXXX_input()はBSD Unixにある実際の関数名です </small></small> </div>  <small> - 呼ばれたデバイスドライバは図のイーサネットカードの扱い方を知っています - 例: メモリ上の0170000から読む(後述) - カードからイーサネットの情報を取り出し(メイン)**メモリ**にコピーします - デバイスドライバは、この先の処理をイーサネットの処理関数 ether_input() にまかせます </small> --- class: img-right,compact # サーバの動作(4) <div class=footnote> <small><small> (脚注1) ここで出てくるXXX_input()はBSD Unixにある実際の関数名です <br> (脚注2) ether_input() は、必要があれば、フィルタリングの処理も行います </small></small> </div>  <small> - ether_input() は、 イーサネットフレームのヘッダを見て、 フレームの中身がIPパケットだと分かるので、 IPパケットの処理関数 ip_input() を呼び出し、 先の処理をゆだねます </small> --- class: img-right,compact # サーバの動作(5) <div class=footnote> <small><small> (脚注1) ここで出てくるXXX_input()はBSD Unixにある実際の関数名です <br> (脚注2) 適宜ルーティングやフィルタリングの処理も行います </small></small> </div>  <small> - ip_input()はIPパケットの処理を行います - IPヘッダを見れば、ペイロード(運んでいるデータ)がTCPだと分かるので、 tcp_input()を呼び出します </small> --- class: img-right,compact # サーバの動作(6) <div class=footnote> <small><small> (脚注1) ここで出てくるXXX_input()はBSD Unixにある実際の関数名です <br> (脚注2) 必要であればフィルタリングの処理も行います </small></small> </div>  <small> - tcp_input()はTCPパケットを処理します - 最終的にパケットのペイロード(データ)が取り出され、 WWWサーバ側でデータを待っている関数を呼び出します。 例:recv(2) </small> --- class: img-right,compact # サーバの動作(7)  <small> - WWWサーバの<b>プロセス</b>は、 クライアントからのデータを待つ関数(例:recv())により、 メモリからデータ`GET / HTTP/1.0`をよみこみます - このあとWWWサーバ内の処理が続きます - 上のGET ...をparseすれば `/`つまりサーバのトップページ(index.html)をリクエストしていることが分かります </small> --- class: img-right,compact # サーバの動作(8) <div class=footnote> <small><small> (脚注1) システムコールも割り込みの一種です <br> (脚注2) システムコールは<b>ソフトウエア割り込み</b>と呼ばれています </small></small> </div>  <small> - クライアントからのリクエスト「`GET / HTTP/1.0`」を解析して、 index.htmlファイルを読み込む必要があると分かりました - (図では省略されていますが) (1) **ファイルシステム**上のindex.htmlファイルをopen**システムコール**で開き (2) read**システムコール**でファイルを読む、これらの処理をカーネルに依頼します - HDDやSSDからファイルを読み出すのは、 そのHDD/SSDハードウエアの**デバイスドライバ**です。 カーネルが適切な**デバイスドライバ**を呼び出します - HDDやSSDは**ストレージ**と呼ばれます </small> --- class: img-right,compact # サーバの動作(送信、詳細は省略)  <small> - クライアントへの返事は逆順です - 送信するデータを用意し、send()などの関数(**システムコール**)を呼び出します - 逆順に tcp_output -> ip_output() -> ether_output() と進み、 最後はイーサネットの**デバイスドライバ**が呼ばれ、 イーサネットフレームが送信されるといった具合です </small> --- class: img-right,compact # プロセス <div class=footnote> <small><small> (脚注) 変数まわりの解説を少し端折っていて不正確ですが、雰囲気を説明するスライドです </small></small> </div>  <small> - この例ではWWWサーバというプログラムが動いていますが、 コンパイルしたファイル(たとえばa.out)を、ただメモリに置けば動くわけではありません - プログラムが動く際には次のようなデータやハードウエアの設定が必要です - **メモリ**上に置かれたコード(プログラムの命令の実体,TEXTと呼ぶ) - **メモリ**上の変数や**スタック**領域 - **仮想記憶**システムの管理情報 - **レジスタ** - これらの総体を**プロセス**と呼んでいます この図では「WWWサーバのプロセス」が動いて(走って)います </small> --- class: img-right,compact # スケジューラ、リソース制御 <div class=footnote> <small><small> (脚注) つい並列と言いがちですが、並列処理(Parallelism)ではなく、並行処理(Concurrency)という言い方が正しいです </small></small> </div>   <small> - このスライドでは単に「XXX_input()を呼び出す」と説明していますが、 ソースコードが見たとおりに順番に実行されるわけではありません - **論理的にはコードのとおり**ですが**時間的には飛び飛びに**実行されています - プロセス群は**(擬似的に)並行処理**されます - コマンド、シェル、ネットワーク、カーネル、みな別のプロセスです - カーネルが1/100秒ずつプロセスを切り替えて並行処理に見せかけます。 どのプロセスに切り替えるか?を考えるのが**スケジューラ** - 同じ関数を(擬似的に)同時実行するため、**ロック**(一般には**リソース制御**)機能が必須 </small> --- class: img-right,compact # キーボードやマウス    <small> - (サーバには直接関係ありませんが) - キーボードやマウスからの入力が発生するたびに、 対応するデバイスドライバが呼ばれます - こういった1バイトずつ転送するデバイスを**キャラクタデバイス**と呼びます。 逆にHDDやSSDなどのブロック単位(歴史的には512バイト、最近は4KBとか8KB) で読み書きするデバイスを**ブロックデバイス**と呼びます </small> --- name: computer-basic class: title, smokescreen, shelf, no-footer # コンピュータの基礎 <div class=footnote> <small> 基本情報処理試験のシラバスを基準に、 用途や特徴などを分類するところからはじめます。 <br> どうしても大枠の用語だらけですが、 基本情報=技術者の常識レベルなので覚えてください </small> </div> --- class: compact # コンピュータの種類 | 種類 | 用途 | 直接操作 | 身近 | 具体例 | |---------------------- |------------------------ |---------- |------ |------------------------------ | | スーパーコンピュータ | 科学技術計算 | NO | NO | 富岳、京、TSUBAME | | 汎用機 | 汎用、業務基幹(事務,経理) | NO | NO | 銀行、事務処理、業務システム | | 組み込み | デバイスの制御 | NO | YES | 家電製品、自動車、工場、発電所| | パソコン | 汎用、一般のアプリ | YES | YES | デスクトップ、ノートパソコン | | ワークステーション | 汎用ながら、特定業務利用 | YES | ? | CADを使う設計、映像処理 | | 携帯端末 | 汎用、一般のアプリ | YES | YES | スマートフォン、タブレット | <small> - 特徴 - スーパーコンピュータは科学技術計算に特化した一品物の超高価な製品 (ただし近年のスパコンは、PCやスマホのパーツを元にカスタム化したものが普通。 それら**身近なパーツの価格性能比が高すぎて特注品を作っても太刀打ちできない**から) - 組み込みの特徴は特定用途で確実に動くハードウエアの信頼性とリアルタイム性 - コンピュータの高速化・信頼性の向上が著しく、 各種コンピュータ間の違いは縮小中 </small> --- class: img-right,compact # コンピュータを構成する部品  <div class=footnote> <small> "Computer Parts" by Qfamily is licensed under CC BY 2.0 </small> </div> <small> - マザーボード <small> - 写真で一番下の緑のボードのこと - CPU,メモリ,各種カードを挿すスロット群 - バスという各部品間のデータ転送をする通信路でパーツ群が接続されています (右図ではスロットの下に隠れて見えてません)。 電力供給ラインも見えませんね(ちなみに直流) </small> - CPU - メモリ - ヒートシンク(CPUを空冷,写真の右下奥) - ビデオカード - ネットワークカード </small> --- class: img-right,compact # コンピュータの五大要素とプログラム内臓方式  <small> - **五大要素**(右図を参照) - **制御、演算、記憶、入力、出力** - **プログラム内臓方式** <small> - 格納方式やストアードプログラム(stored program)方式とも言う - まず主記憶装置に読み、それを実行 1. プログラムを**入力装置**から 1. メモリ(**記憶装置**)へ読み込み 1. メモリ上のプログラムを順次実行 - HDD/SSDなどの**記憶装置**から読みこんだ命令が**演算装置**(四則演算や比較など)や**制御装置**(各装置への指示)で実行される - (ハードウエアの変更なしに)**ソフトウエアを変更するだけで、 さまざまな処理が可能** </small> </small> --- name: os-basic class: title, smokescreen, shelf, no-footer # システムの基礎 <div class=footnote> <small> </small> </div> --- class: compact # ソフトウエアの分類 <div class=footnote> <small><small> (脚注) オープンソース(OSS)の話は(できれば)第7回に取りあげます </small></small> </div> | 大分類 | 中分類 | 例および小分類 | |---------------------- |-------------------- |--------------------------------------------- | | システムソフトウエア | | | | | 基本ソフトウエア | OS | | | | (a)カーネル本体 | | | | (b)標準ユーティリティ(ls sort システム管理) | | | | (c)コンパイラなど言語処理系 | | | ミドルソフトウエア | データベース | | 応用ソフトウエア | | オフィス製品(ワープロ、表計算) | <small> - OSは**基本ソフトウエア** - コンピュータはOSがないと非常に使い勝手が悪い=基本のソフトウエア - 商用OS: Microsoft社のWindows, Apple社のMacOS X, IBM社のz/OS, 商用UNIX - フリーソフトウエア(OSS)のOS: Linux, BSD Unix </small> --- class: compact # システム処理形態の分類: 利用方法、即時性、対話性 <div class=footnote> <small><small> (脚注1) コンビニやスーパーでは全店舗の売上を集計して夜中に集計処理などをしています。 これが<b>バッチ</b>処理。 夜中にバッチ処理といえば、汎用機の世界というイメージ。主力言語はCOBOL(偏見?) (脚注2) バッチやオンライントランザクションの処理中枢はデータセンターなどにあるサーバ(群)です。 別途、 対話型の入出力用コンピュータ(補助,本体より低価格)が必要です。 これが本来の<b>端末</b>ですが、 いまは普通のPCからサーバにログインすることが多いでしょう。 ちなみに端末(termianl)の訳がターミナルです みなさんの黒い画面もターミナルと呼ばれますが、 正確にはterminal emulationをするソフトウエアです </small></small> </div> | 処理形態 | 動作 | 例 | |---------------------------- |-------------------------------------------- |------------------ | | バッチ | 一定期間もしくは一定量ためてから**一括処理** | 月末の事務処理 | | | | 売上データの集計 | | オンライントランザクション | データの発生と同時に処理を開始(**即時性**) | 銀行のATM | | リアルタイム制御 | センサーで状態を監視し対応(**厳しい即時性**) | 自動車のエンジン | <small> - 普段のパソコンやスマートフォンの使い方は、 **対話型**(コンピュータと対話しながら進める)処理が主流 - 上の例でも「銀行のATM」は対話型ですが、他は非対話型 </small> --- class: compact # システム処理形態の分類: 集中vs分散 <div class=footnote> <small><small> (脚注1) サーバクライアントモデルは分散処理の一種と考えられます (脚注2) 分散システムは古典的な開発手法では作れません。 分散を前提にサーバソフトウエアとアプリが設計・作成されていなければ、 きちんとシステムの自動拡大・縮小に連動して動作しません </small></small> </div> <small> - **集中処理** <small> - データセンターなどに集中管理されたサーバ(群)で処理するため、 **管理**しやすく**機密保護**もしやすい反面、 一部の機材の故障が全体に影響をおよぼすことが多い(分散システムほど冗長化されていない)傾向にあります - 性能を向上させるには(機材の入れ替え = **停止をともなう作業**)が必要です(-> **スケールアップ**) </small> - **分散処理** (いわゆる**クラウドの裏側**) <small> - 一部の機材故障であれば(全体には)影響ありません。障害に強い反面、 多数のコンピュータ群からなるため設計も管理も障害対応も難しくなりがちです。 性能の向上は物量戦です(-> **スケールアウト**) </small> - 性能の向上 <small> - スケールアップ ... <b>古典的な少数のサーバ</b>と多数のクライアントの場合、サーバのアップグレードで対応 - **スケールアウト** ... **サーバ数の増加で対応**,**無停止**で**ユーザ数に応じて自動増減可** </small> </small> --- name: os-basic class: title, smokescreen, shelf, no-footer # OSの基礎 <div class=footnote> <small><small> </small></small> </div> --- class: col-2,compact # OSの目的 <div class=footnote> <small><small> (脚注) アプリ互換性: アプリ互換性はUnixが最初ではありません。 60年代に発売されたIBMの汎用機がすでにアプリ互換をうたっています。 ただ、アセンブリ言語で書かれたOSなのでIBM以外では動きません。 メンテも大変そう...IBMだから出来た力技?:-) </small></small> </div> <small> 1. ハードウエア資源の有効活用 1. 処理能力の向上 <small> - スループット(仕事量/単位時間)、 ターンアラウンドタイム(全部終わるまでの時間)、 レスポンスタイム(ユーザに結果を出し始めるまでの時間) </small> 1. 信頼性の向上 <small> - 信頼性(正常動作)、可用性(稼働率)、保守性、保全性(壊れにくい)、安全性(機密性;セキュア) </small> 1. 開発効率の向上 1. 操作性の向上 <wbr> - **移植性**の向上(**開発効率**向上の一部) <small> - Unix以前のOSはハードウエアごとの一品物でした。たいてい、**アセンブリ言語**で書かれていました - 1970年代に、**C言語で書かれたOS(Unix)**が**移植可能**なことが証明されました。 これ以降、新しいコンピュータ(ハードウエア)でも、 OSおよびその上で動くミドルウエアやアプリもそのまま動かすことが可能になり**開発効率の向上**につながりました </small> </small> --- class: compact # 処理というより利用形態によるOSの分類 <div class=footnote> <small><small> (脚注1) いまや一人で占有できるコンピュータを複数台もっている時代なので、 タイムシェアリングの<b>シェア</b>の意味が分かりにくいです;-)が、 本来TSSは高価なコンピュータを<b>多数のユーザで共有(シェア)して使う仕組み</b>のことでした。 20億円のコンピュータを30人で使えるなんてすごい!これが世界最先端だった時代の話です コンピュータ開発史では、 人間がコンピュータをどう使うか? 人間とコンピュータの共生とは? といった観点が出発点にありました (脚注2) 本科目はTSSが前提です </small></small> </div> <small> - タイムシェアリングシステム(TSS) <small> - **コンピュータと対話しながら利用**する形態です - 操作画面がある**身近な機器の大半**はTSSなので、サーバもパソコンも**TSS**です </small> - リアルタイムOS (RTOS) <small> - **組み込みシステム = 特定の機能を実現するために機械に組み込まれるシステム**に使われます。 例:家電製品,自動車,医療機器,産業用の機械など、 **身の回りに多数**(さほど対話的ではない)あります。 よって**組み込みOS**は同義語です - ちなみに一昔前まで携帯電話もリアルタイムOSが主流でした - TSSとの主要な違いはスケジューラで、 高速な反応/<b>一定時間内に確実に特定プロセスを実行する</b>ことが求められています。 例: 自動車のエンジン(反応が遅いと致命的) </small> </small> --- class: img-right,compact # OSの使い分けの例 <div class=footnote> <small><small> "Apollo 11 liftoff" by Apollo Image Gallery is marked with CC PDM 1.0 <br> (脚注) 2021年には100kmまで上昇してペイロードを放出=宇宙に行けた、そうです。おめでとう! </small></small> </div>  <small> - [インターステラテクノロジズ(株)](http://www.istellartech.com/)(大樹町) <small> - 大樹町で打ち上げている(いわゆるホリエモン)ロケットを例に使い分け方を説明します - 本体の姿勢制御とか噴射のタイミングは、 **処理速度1/1000秒レベル**で行う世界なので**リアルタイムOS** - 周辺機器(通信とかタンク内をかき回すとか?)は、そこまでcriticalではないので、 ラズベリーパイ(LinuxつまりTSS)で動かしているそうです </small> </small> --- class: compact # 構成法によるOSの分類 <div class=footnote> <small><small> (脚注1) つまり身の回りで良く見るPCやデバイスは、ほぼ全部UnixかMach系と言えます (注:組み込み機器は別です) <br> (脚注2) Machなどは遅くて使えませんでした。 1990年代以降にあると、 マイクロカーネル再評価が起こりますが、 その話は省略 <br> (脚注3) WindowsはMachを設計の参考にしました。 MacOS Xは、カーネルがMach直系の子孫、ユーザランドはBSD Unixのゴッタ煮 </small></small> </div> <small> - **モノリシックカーネル** - カーネルが一つの巨大なソフトウエア、 代表例はUnixファミリー(商用UNIX, BSD Unix, Linux) - <b>マイクロカーネルにくらべ(a)動作が高速(b)作成も容易(c)デバッグも容易</b> - デメリット - 小さなセキュリティホールがカーネル全体に波及しうる - カーネルをアップグレードする際はOSの再起動が必要 - **マイクロカーネル** - カーネルは必要最低限の機能だけをもつ小さなもの(だからmicroなkernel)とし、 多くのプロセス(サーバプログラム)群が協調してカーネルの機能を提供するモジュラー(modular)な作りです。 - <b>OSを小さな部品群から構成できるか?というOS研究の産物</b>です - 80年代の有名な**Mach**(マークと発音)はWindowsやMacOS Xの御先祖にあたります </small>