差分

移動先: 案内検索

デバイススペシャルファイル

1,285 バイト追加, 2018年10月24日 (水) 14:00
スケジュリングをスケジューリングに修正
=== I/O の抽象化 ===
Unix で使われた秀逸なアイデアを3つ上げろといわれたら、多分、多くの人が、階層化ファイルシステム、パイプ、そしてデバイススペシャルファイル(単にスペシャルファイルとも呼ぶ)をあげるでしょう。今回はその中の2つに関係しています。で使われた秀逸なアイデアを3つ上げろといわれたら、多分、多くの人が、階層化ファイルシステム、パイプ、そしてデバイススペシャルファイル(Device Special File : 単にスペシャルファイルとも呼ぶ)<ref> wikipediaではデバイス・ファイルの項目に「デバイスファイルまたはスペシャルファイルとは」と書いていますが、UNIXの世界では次のように「デバイススペシャルファイル」という表現をしています。[https://www.usenix.org/legacy/event/bsdcon02/full_papers/kamp/kamp_html/ Before we continue, we need to fully understand the "device special file" in UNIX.]本稿もそれに従います。</ref>をあげるでしょう。今回はその中の2つに関係しています。
デバイスを抽象化するこのアイデアによって、 I/O のデバイスもすべてファイルと同じ統一したインタフェースで扱えるようになりました。
例えばハードディスクや端末といったものに対して、プロセスから直接ハードウェアにアクセスする必要はありません。
たとえばLinuxでは /dev/sda は SCSI ハードディスク、あるいは SCSI ハードディスクに見えるものです。ハードディスクに見えるもの<ref>たとえば USB メモリは USB マスストレージクラスですが、デバイス用の SCSI エミュレーションによってSCSIデバイスのように見えます。</ref>です。
Linuxのカーネルが認識した順番に /dev/sda から /dev/sdb 、 /dev/sdc となります。
/dev/sda はハードディスク全体で、 sda 上にパーティションが設定されていれば /dev/sda1 、 /dev/sda2 ...となります。
=== 擬似デバイス ===
擬似デバイス (Pseudo-devices)とはデバイスファイルのように見せかけているが、その先には具体的なハードウェアが結びつけられていないデバイスファイルです。たとえばとはデバイスファイルのように見せかけているが、その先には具体的なハードウェアが結びつけられていないデバイスファイルです。たとえば /dev/nullは、その先が何もないデバイスファイルです。null は、その先が何もないデバイスファイルです。
 
<pre class="bash">
% cat foo > /dev/null
</pre>
 
ファイルfooを読み込んで、デバイスファイルファイル foo を読み込んで、デバイスファイル /dev/nullに送り込みますが、送り先は何もないのでnull に送り込みますが、送り先は何もないので /dev/nullに吸い込まれるだけになります。null に吸い込まれるだけになります。/dev/nullを入力にした場合、何も送られないことになります。null を入力にした場合、何も送られないことになります。以下にいくつかのデバイスファイル例をあげます。
例:
* /dev/null 入力・出力とも何もしない
* /dev/random , /dev/urandom 乱数を返す
そこで有効な入出力をするためにスケジューラを用意します。スケジューラの役目は、全体のスループットの改善です。ですから、ある1つのプロセスだけを着目してみると、もしかすると、処理が遅くなっているという可能性もあります。
この当たりは単純に一つのI/Oスケジュリングのアルゴリズムが万能とはなかなかいかないので、Linux Oスケジューリングのアルゴリズムが万能とはなかなかいかないので、Linux 2.6.0以降では
Deadline I/O Scheduler、
<del>Anticipatory I/O Scheduler</del><ref>最新ディストリビューションの使っているLinuxカーネルの多くでは既に用意していません。</ref>、
Complete Fairness Queueing I/O Scheduler、Scheduler<ref> Inside the Linux 2.6 Completely Fair Scheduler https://www.ibm.com/developerworks/library/l-completely-fair-scheduler/index.html</ref>、
Noop I/O Scheduler といった複数
のスケジュールが用意されています。
== ネットワークデバイス ==
1981年当時4.1BSDを改造しTCP/IPのスタックを搭載したのがUNIXのTCP/IPの始まりです。IPの始まりです<ref>私の個人的経験でいわせてもらうと4.2BSDリリース時に入っていたTCP/IPはどう贔屓目に見ても、安定して利用するというには程遠く、プログラム中で引数をちょっと間違えるとシステム全体がいとも簡単にダウンしました。安定して使えたという実感は4IPはどう贔屓目に見ても、安定して利用するというには程遠く、プログラム中で引数をちょっと間違えるとシステム全体がいとも簡単にダウンしました。安定して使えたという実感は4.3BSDになってからです。</ref>当時のLANも多くの場合イーサーネット(Ethernet)で構築されていました。NIC (Network Interface Card) とか、あるいは LANポート と呼ぶネットワークインタフェースのためのデバイスがあり、そのデバイスファイルとして /dev/eth0 が作成されました。
当時、我々がLANと呼ぶものはイーサーネット(Ethernet)で構築されていました。NIC (Network Interface Card)とか、あるいはLANポートとか呼ぶものも、使っているのはイーサーネットでした。そのため/dev/eth0といった名前でネットワークのデバイスファイルが作成されました。むかしのLinuxもイーサーネットのデバイスは、もちろんUnix流に/dev/の下にあるデバイススペシャルファイルで、デバイスは/dev/eth0と見えていました。;補足: eth0は最初に認識しているイーサネットのネットワークインタフェースのデバイスで、複数のネットワークポートやNICが存在していた場合、 eth1、 eth2... となります。
;補足: eth0は最初に認識しているイーサネットのネットワークデバイスで、複数のネットワークポートやNICが存在していた場合、eth1、eth2むかしのLinuxもイーサーネットのデバイスは、もちろんUnix流に /dev/ の下にあるデバイススペシャルファイルで、デバイスは /dev/eth0 と見えていました。ところが今日のLinuxはネットワークデバイスに対してはスペシャルファイルとして用意していません。イーサーネットデバイスのはずである/dev/eth?というのはLinux 2...となります。2以降なくなりました。理由は単純に1つのイーサーネットのデバイスが、1つのIPアドレスを持つというわけではなくなったからです。現在はハードウェアに1つのイーサーネットのポートしかなくても、オペレーティングシステムとして、その1つのポートに複数のIPアドレスを割り当てることができます。
ところが今のLinuxはネットワークデバイスに対してはスペシャルファイルとして用意していません。イーサーネットデバイスのはずである/dev/eth?というのはLinux 2.2以降なくなりました。理由は単純に1つのイーサーネットデバイスが、1つのIPアドレスを持つというわけではなくなったからです。ハードウェアに1つのイーサーネットのポートしかなくても、オペレーティングシステム的にはその1つのポートに複数のIPアドレスを割り当てることができます。ネットワークインタフェースの設定にはifconfigを使いますが、通常はシステムの設定ファイルに指定のフォーマットで登録しておけば、システムのブート時に設定スクリプトが動き、自動的に割り当ててくれます。Debian系のディストリビューションだと/etc/network/interfacesに、RedHat interfaces に、RedHat 系だと/etc/sysconfig/network-scripts/ifcfg-eth0に記述します。eth0 に記述します。
ネットワークインタフェースの設定状況を見るネットワークインタフェースの設定状況を見るのには次のようにします。  <pre class="bash">
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:C0:26:28:12:C5
inet addr:127.0.0.1 Mask:255.0.0.0
....
loはループバック</pre>
;補足: loはループバックのための仮想デバイスです。127.0.0.1は特別なIPアドレスで、これは自分自身を指します。
ifconfigを使う以外にも/proc/net/dev/を見ることで現在のネットワークインタフェースを確認することができる。
ifconfigを使う以外にも/proc/net/dev/を見ることで現在のネットワークインタフェースのデバイスの状況を確認することができます。
 
 
<pre class="bash">
$ cat /proc/net/dev
Inter-| Receive ....
wlan0: 0 0 0 0 0 0 ...
eth0: 1087299 17929 0 0 0 0 ...
</pre>
== udev hald ==
----
[[目次]]へ
 
 
このページへのショートURL:
http://uc2.h2np.net/i/2d.html