570 likes | 789 Views
http://www0.info.kanagawa-u.ac.jp/~kaiya/os/. オペレーティングシステム 2014. 2014/5/8 木曜 2 限 2 年前期 海谷 治彦 永松 礼夫. 目次. 前回と今回のアンケート 前回のは前回のスライド末に 5 章 入出力の制御 5.1 入出力装置 DMA とチャネル 5.2 入出力要求とその制御 UNIX 流のデバイス管理について 5.3 入出力の効率化. アンケート : はじめに. 前回の話は,全体にかなり難しいと思います.
E N D
http://www0.info.kanagawa-u.ac.jp/~kaiya/os/ オペレーティングシステム 2014 2014/5/8 木曜 2限 2年前期 海谷 治彦 永松 礼夫
目次 • 前回と今回のアンケート • 前回のは前回のスライド末に 5章 入出力の制御 • 5.1 入出力装置 • DMAとチャネル • 5.2 入出力要求とその制御 • UNIX流のデバイス管理について • 5.3 入出力の効率化
アンケート: はじめに • 前回の話は,全体にかなり難しいと思います. • 今後,それぞれの詳細は再度触れますので,今は,全体像をつかんでくれれば結構です. • 全体像としては, • 何故,アプリ実行にOSが必要か? • 何故,多数のアプリが同時に動いても平気か? という質問に関して最終的に自力で答えられれば結構かと思います.
アンケート: 学習法他 • 小テストもしくは宿題を希望. • 演習問題を使いながらの授業を希望. • 効率よく学習する方法は? • 私もどちらかと言えばハードは苦手です • 授業中に話題にする尖がったキーワードについては,それほど気にしないでください. • なぜかスライドをアンケートしてアップしている人がいた・・・orz
アンケート: 教科書,先行科目 • 教科書については,事前に教科書として使うことは大学内の本屋には連絡したのですが,在庫不足のようですね. • 基本,教科書が無くても,大丈夫なようにスライドは構成しています. • 数回前の演習については,この点,考慮します. • 教科書を先読みして予習するより,既に終わったスライドを見直して復習してください • 前提としているのは「コンピュータアーキテクチャ」ではなく「計算機システム基礎」でした. • シラバスを見る限り,初級のアーキテクチャの授業のようです. • 個々の論理演算や回路の計算云々ではなく,CPUの基本動作の理解が重要となります. • 「レジスタって何?」だとかなりマズいですが,フリップフロップは忘れちゃっていても*この授業にとっては*問題ないです.
アンケート: 重要事項 • メモリの論理的な構造は,1byteのデータの配列です.配列の添え字としてアドレスが用いられています. • OSに限らず個々の技術は複数の異なる目標達成のために使われます. • 技術や原理側からではなく,OSはどんな目標達成をしなければいけないかの方向から考えを整理してください. • 前回の話の前半,「一つのOSと一つのアプリ」はアプリ毎にOSがあるというわけではなく, • まずは,複数アプリが動いていることは忘れて,OSとアプリのサシの関係を理解しましょう,という意味です. • 「パソコンは99%使用されてない」ではなく,「CPUは99%使用されていない」なので, • 例えば,メモリやタッチパネル等はもっと利用率は高いはずです.
アンケート: 表現等 • CPU, API, GUI 等,略語(頭字語 Acronymといいますね)多くてしんどい.あとカタカナ語も. • 近日中に用語集を準備したいですが,ご自分でも整理してみてね.TSSとか別の意味で二回出てくるし最悪ですね.
アンケート: セグメントエラー • セグメントエラー (segmentation fault) • アクセス許可の無い部分にプログラムがアクセスをした場合のエラーですが,講義のセグメントの範囲を超えた,もしくはセグメント内の無効な部分にアクセスしたことを意味します.
アンケート: セグメント関係 • セグメントレジスタは「いくつのレジスタがどこにあり,それそれどんな種類か?」の情報がメモリ上のどこにあるかを覚えておくレジスタです. • 何故,セグメントは4個しかないか? • OS用に一対,アプリ用に一対ということだろう. • アプリは100個以上あるが,実際,最大何個同居するかはわからないので,アプリの個数分,セグメントを事前に作っておくのは現実的ではないでしょう. • その代り,アドレス変換を用いているのだと思います. • 本当のところはOS開発者に聞いてみないとわかりませんね. • プログラムのことをコードと呼びますから,コードセグメントにはプログラムが入ってると覚えてください.データセグメントに関しては自明ですよね.
アンケート: 割り込み • 前回の授業での割り込みの主な役割は, • 一般アプリの権限を一時的に昇格して機器等の資源にアクセスするためのと, • 複数あるプロセスを短時間で切り替えて,それぞれが同時並行して動いているように見せかけることです. • プログラムの実行時エラーの一部はOSが当該のプログラムに割り込みをかけ動作を停止させているものもあります. • 割り込み番号32番以降は,その割り込みが起きた場合,どう対処するかを,OSを開発する人が決めて,プログラミングして良いことになってます.無論,使わないという選択肢もあります. • 割り込みベクトルの番号の大小と優先度との関係はありません. • INTRピンというのは文字通りCPUから生えている足の一本です. • ちなみに,私もCPUの現物は偶然目にしたことはありますが(研究室に落ちてた), • それが無ければ見る機会が無かったかも.
続き • Linux・・・というかi386の特権レベルや割り込み等は,実際,CPUがそのように製造されているので,鵜呑みにしていただくしか無いかなぁ,と思います. • 割り込みと,特定アプリの強制終了とは異なります. • プリエンプティブなプロセス切り替えに関する指針はプロセスの章で改めて解説します. • 現時点では,タイマーに基づきばしばし切り替えられていると理解しておいてください.
アンケート: タイプと特権レベル • 何故,Linuxはタイプ1と5のタイプしか使ってないか? • 何故,特権レベルは0と3しか使わないか? • i386には 0, 1, 2, 3 と4つあり,Linuxでは1と2を使っていない.ちょっと調べた感じ 1 と 2 を使ってるOSが見当たらない・・・orz • ほとんどのOSではカーネルモードでの操作ができる特権ユーザー(rootやAdministorator等)があり,そのユーザーのアカウントがのっとられると,OSがのっとられたと同じになる. • 昔のOSにエラーが多かったのは,OS自体の作るソフトウェアの技術が未熟だったこともありますが,それ以上に,CPUの保護機能が不完全だったことが大きいと思います.
アンケート: アドレス変換 • アドレス変換のアイディアはスライドの43, 44ページがすべてといってもよいので,そこを復習してみてくださいな. • アドレス変換は利用が衝突した場合のみ変換すればよいのでは無いかという意見がありましたが, • 1. 衝突をチェックする,2. 衝突してれば変換するに比べ, • 1. とにかく変換する,のほうが仕組みが単純なので,現在のように行っているのだと思います. • アドレス変換を行うのはOSです.変換表のデータもOSが管理してます.ただ,変換自体は高速化のため,CPUの機能(アドレス変換回路)をOSが使ってます. • アドレス変換で順番が入れ替わる可能性が技術的にはあると思います.変換テーブルは順番に依存しないので.
アンケート: 32bit/64bit • 今時,32bit CPUのマシンは売って無いので,安心して,8G, 16Gとメモリ積んでください,高いけど・・・ • 32bitと64ビットのマシンでは, • アドレス空間の広さに関して膨大な差(232 VS 264), • 一度に運べるデータ量の差(倍)と大きな違いがあります. • 特に前者は大きいですね. • アドレスバスの幅が128本のCPUは現存しないようです.ちなみに,128bitのアドレス空間があれば,地球上の全データを格納しても余るそうです. • 技術的には41bitCPU等も製造可能でしょうけど,CPU内部のアドレスを覚えておくレジスタが大体16や8の倍数なので,半端なバス幅のマシンは作られないでしょう. • 64bit OS上で32bit版のアプリを動作させる場合,CPUが32bitであるふりをさせないといけませんが,これはOSが行っています.このふりをさせる部分に不具合があると上手く動かないのでしょう.
アンケート: イベント駆動 • I/Oイベント駆動型では,あるプロセスがI/Oを開始するという事情があって,はじめて,次のプロセスに実行権限が移ります • もし,I/Oの少ないプロセスが先に実行されていたら大変ですよね. • I/Oイベント駆動型が主流の時代は,他のプログラムに処理を譲るため,I/Oの必要もないのに,わざわざI/Oの処理を入れるプログラムもあったそうです. • 馬鹿げてますよね.
アンケート: ページング関係 • 4G無いマシンでも4Gあるように見せかけることができるのは,スライド50ページを見直してみてください. • 仮想記憶(数回後に出てきます)とアドレス変換は元になるアイディア(ページング)は共通しているが利用目的が違います. • 仮想記憶は実際に搭載されているメモリよりも多いメモリがあるように見せかけるのが目的, • アドレス変換は複数のプロセス間で利用するメモリを完全に区分けすることが目的です.
アンケート: その他 • 32bitOSにて4Gオーバーのメモリがどのように利活用されているか? • RAMディスク(半導体でできたディスク)として使うのが一般的のようです. • 当然,ハードディスクより無茶苦茶早いので,キャッシュやバッファに使えます. • PCよりスマホのほうが複雑であるというわけでなく(ハードウェアの観点からは実際スマホのほうが複雑かも),現代のPCもスマホも授業で扱う以上の最新技術を駆使して日々稼働してます. • 例えばGPU系のネタとか,低消費電力化技術は授業の範囲では扱えないと思います. • AndroidはLinuxの一種と言えますが,違うOSとも言えます.スマホ各社が自社端末のAndroidをカスタマイズしているのは,搭載されているチップや周辺機器が微妙に違うからです.加えて,独自の低消費電力対応等も行っていると思います.
さて,本日の話 入出力機器の制御
CPU, メモリ, I/O機器の速度差 • 圧倒的な速度差がある. • 例えば,1回の読み書きするのに, • 数ナノ秒 CPU(内のレジスタ) • 数十ナノ秒 メモリ • 数十ミリ秒 ディスク • 上記のように ディスクとメモリは 106くらいの速度差がある. • もちろん人間はもっと遅いよ. 越えられない壁
CPUと装置の接続技術 • 入出力制御方式 • CPUが入出力装置を制御するチップに命令を出す. • DMA • Direct Memory Access • CPUを通さずデータをやりとりする. • 割り込みがまた重要な役目を果たす. • 入出力チャネル • 大型コンピュータで採用. • 今日でも大型コンピュータが使われる所以. • これのおかげで大型機は入出力が早い.
i386周辺の構造 再録 文献6 p.57
I/Oポートを使った入出力 • CPUからは,I/Oポートというメモリのようなモノにデータを置いたり読んだりすることで,機器(ハード)にデータを送ることができる. • 途中に入出力制御装置のチップが入っている. • i386の場合,65536個(216個)までのアドレスがI/Oポートにふられており,このアドレスで機器を区別する.
例 システムスピーカは0x0061のI/Oポートに接続されている. ⇒ ここになんかデータをおけばスピーカーが鳴る. キーボードは0x0060と0x0064のI/Oポートに接続されている. ⇒ これは制御に使われる?(未確認・後述)
例 ディスク関係 いわゆるIDEのディスク (むかしの一般的なハードディスク) 右はフロッピーディスクの制御用のI/Oポート
DMA その必要性 • I/Oポートを使って,CPUが直接データを1個,もしくは数個づつ読んでいては,遅くてラチがあかない. • 106の速度差を思い出して. • そこで,I/Oポートは,「読み出し開始」等の制御情報を送るのに使って,機器とメモリとのデータの行き来はCPUとは独立して行うのがよい. • Direct Memory Access の略.
割り込み その必要性 • 前述のDMAでデータ転送が終わったら,そのことをCPUに通知しないといけない. • そこで,ハードウェア機器からCPU側に非同期に情報を通知する機構が必要. • このことも「割り込み」の一種である. • システムコール関係のところに出てきた割り込みと同類.
割り込みの定義 • 「プロセッサ(CPU)が実行をする命令を変更するイベント」 • 同期割り込み • CPUの制御回路が発生するイベント • i386では「例外」と呼ばれる • 非同期割り込み • CPU以外のハードが発生するイベント • i386では「割り込み」と呼ばれる. 文献5 p.115より
例外・割り込みの分類・特徴 • 例外 • CPUが異常等を検出した際のイベント (i386では識別子 0~31の一部) • ソフトウェア割り込み: 典型的な例は,システムコールによりカーネルコードに実行が移る際. • 割り込み • マスク可能割り込み • ソフトウェア的な設定で割り込みを禁止できるもの.(32~47) • マスク不能割り込み • 禁止できないもの.ハードウェアの故障等に対応する.(i386では識別子の0~31の一部)
IRQとは • i386のマスク可能割り込みを受け取る信号線. • それぞれハードウェア機器に関連付けられている. • それぞれのハードがCPUを使いたい場合に,IRQに対応した割り込みが発生する. • 例: キーボードが打たれるとIRQ1番による割り込みがCPUにかかる. • 386には16個しかない. • I/Oポートにどの割り込みが起きたかが書き込まれている. Interrupt ReQuest
典型的なIRQ 上記は典型例であり,特定の機器を外して,他の機器を割り当てることも少なく無い.
入出力チャネル • 大型コンピュータ(メインフレームとも呼ばれる)が並列で高速な入出力ができるための機能. • コレのおかげで大型機は今でも入出力に関してPCより優位. • 入出力専用の下請けコンピュータを多数従えているイメージ (次項) • 入出力を高速に行うため,専用メモリ上にデータを先読みしたり,処理中のデータを専用メモリ上にのみ保持したりする. • キャシュと呼ばれる. • キャッシュは今時はPCでも普通に使われている.
入出力装置の実イメージ • 代表的な記憶装置としてのハードディスクについての実イメージを以降に示す. • SSDやUSBキー等の,実際には円盤が回っているわけでない装置も,置換性から,同じように扱われる.
ディスクの物理構造 「計算機システム基礎」でも似たような図をみたのではないでしょうか?
とあるディスクの実情報 ディスク /dev/hda: ヘッド 255, セクタ 63, シリンダ 2434 ユニット = シリンダ数 of 16065 * 512 バイト デバイス 始点 終点 ブロック ID システム /dev/hda1 1 255 2048256 83 Linux /dev/hda2 256 321 530145 82 Linux スワップ /dev/hda3 322 576 2048287+ 83 Linux /dev/hda4 577 2434 14924385 83 Linux 4つのパーティション 255個 hda1 hda3 hda2 hda4 1円周にセクタが63個
とあるUSBメモリの情報 Disk /dev/sdc: 2013 MB, 2013265920 bytes 16 heads, 15 sectors/track, 16384 cylinders Units = cylinders of 240 * 512 = 122880 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xed044527 Device Boot Start End Blocks Id System /dev/sdc1 33 16384 1962212 6 FAT16
i386周辺の構造 再録 文献6 p.57
Linuxでのデバイスの抽象化 動機 • 前述のように,ポートだのアドレスだの一々叩いて機器をいじっていたのではプログラマが大変. • 機器によって,実際,操作法は違うのだが,新しい機器(たとえばUSB3のディスクとか)が増える毎にプログラムを作り直さないといけないとラチがあかない. ⇒ 機器をほぼ全てファイルに見立て,ファイルの開閉,読書として機器をいじろう!
デバイスファイルの例 /dev/ ディレクトリの下にある. • /dev/hda IDEハードディスクその一 • /dev/hda5 hda のパーティションその5 • /dev/fd0フロッピーディスク • /dev/psaux PS/2マウス ※ 最近は無い
デバイスドライバとは? • 機器をファイルのように,open, close, read, write 等の処理が扱えるような仲介をしてくれる関数群. • 通常はカーネルに組み込まれる. • 機器に直接アクセスできるのはカーネルだけのため. • 新しいハードウェア機器が開発される毎にデバイスドライバもそれにあわせて作らなければならない. • しかし,名の通った機器(USBとかIEEE1394とか)のデバドラは大抵,すでに誰かが作成済である. • しかも,Linuxの世界では大抵それが無償で使える.
アプリからデバスまで アプリケーション open, close, read, write 等のシステムコールを呼んで,デバイスにアクセス. open(“/dev/xxx”, O_RDWR); OS デバイスの種類を見て,該当するデバドラに処理を委譲する. xxx_open(…..); カーネル内 デバイスドライバ 機器に会わせた操作,例えば特定のポートを叩くとか,をして関数に対応した処理を実施する. ポート0x61に0xffを置く 機器(デバイス)
実際に利用可能なデバドラを見る # cat /proc/devices Character devices: 1 mem 2 pty 3 ttyp 4 ttyS 5 cua 7 vcs 10 misc 29 fb 36 netlink 128 ptm 136 pts 162 raw 180 usb 254 wildio /proc/devices ファイルに列挙されている. それぞれがある種類のデバイス用(共用もある.) 先頭にある番号で識別されている. 2種類の種別がある. Block devices: 1 ramdisk 2 fd 3 ide0 9 md 22 ide1
デバイスの種類 • キャラクタ型 • 一度のI/Oで任意のデータが転送可能な機器. • キーボードとかネットワークとか. • 通常,順次アクセスしかできない. • ブロック型 • 一度のI/Oで固定長のデータブロックを転送可能な機器. • ディスク一般. • ブロック内でランダムアクセスが可能.
デバイスの種類に関する補足 • キャラ,ブロックに分けるのは歴史的背景からという話もある. • それぞれに適用できるシステムコールの種類は異なる. • 一般にブロック型のほうが複雑. • 後述のブロッキングやキャッシュ等を行うため.
個々のデバイスの認識 • 前述のように,個々のデバイスファイル /dev/なんとか は,OS内からは個々のデバイスそのものである. • それぞれのデバイスが,何型でどのドライバを使っているかは,ls –l 等でデバイスファイルの属性を見れば,すぐにわかる.
例 # cat /proc/devices Character devices: 10 misc Block devices: 3 ide0 ブロック or キャラクタの区別 抜粋 3番のデバイスドライバを使用, このドライバは共用されている. メジャー番号 # ls -l /dev/hda1 brw-rw---- 1 root disk 3, 1 Oct 5 2000 /dev/hda1 # ls -l /dev/hdb1 brw-rw---- 1 root disk 3, 65 Oct 5 2000 /dev/hdb1 # ls -l /dev/psaux crw-rw---- 1 root root 10, 1 Oct 5 2000 /dev/psaux 10番のデバイスドライバを使用 同じドライバを使う異なるデバイスは番号をつけて管理する. マイナー番号 通常ファイルではサイズを表示 -rw-r--r-- 1 root root 52 Apr 11 2002 /etc/resolv.conf
ファイルに対するシステムコール • open ファイルを開ける • close 閉じる • read ファイルからデータを読む. • write ファイルにデータを書き込む. • ioctl デバイスの属性を変更したり,制御したりするのに使用する. • 例えば,通信ポートのスピードを変更するなど. これらはアプリケーションが利用する関数群である.