差分
/* I/Oスケジューラ */
== デバイススペシャルファイル ==
=== I/Oの抽象化 O の抽象化 ===
<pre class="bash">
$ echo 'hello' > /dev/tty
hello
</pre>
;補足: 接続した順番にデバイスを決めていくので、USB機器などの接続では挿したタイミングでデバイス名が異なることが発生してしまう場合があります。そこで現在ではUUID(Universally Unique Idenifier )という方式を使ってデバイスをユニークに認識する方法を用意しています。fstab(5)、mount(8)、tune2fs(8)を参照してみてください。
/dev/cua0やcua0 や /dev/ttyS0はシリアルポートのスペシャルファイルです。cua?はttyS0 はシリアルポートのスペシャルファイルです。たとえばモデムやFAXモデムを接続しておいて、自分から呼び出して接続を行うcua?はたとえばモデムやFAXモデムを接続しておいて、自分から呼び出して接続を行う(Call-Out)する時に使います。ttySする時に使います。ttyS?は相手から呼び出される時に使います。/dev/ttyUSB0 はUSB接続をしたシリアル通信のためのスペシャルファイルです。
=== レイヤ図 ===
=== ioctl ===
ioctl(2)はスペシャルファイルをコントロールしているデバイスドライバに対して命令を送るためのシステムコールです。これでデバイスをコントロールすることになります。(執筆中)はスペシャルファイルをコントロールしているデバイスドライバに対して命令を送るためのシステムコールです。これでデバイスをコントロールすることになります。(執筆中)
== デバイス ==
=== キャラクタデバイス ===
<pre class="bash">
$ ls -l /dev/{random,tty,st0,midi0}
crw-rw---- 1 root audio 35, 0 Mar 15 2002 /dev/midi0
crw-rw---- 1 root tape 9, 0 Mar 15 2002 /dev/st0
crw-rw-rw- 1 root tty 5, 0 Nov 18 11:35 /dev/tty
</pre>
先頭のcがキャラクタデバイスを意味する
=== ブロックデバイス ===
<pre class="bash">
$ ls -l /dev/hd?
brw-rw---- 1 root disk 3, 0 Mar 15 2002 /dev/hda
brw-rw---- 1 root disk 34, 0 Mar 15 2002 /dev/hdg
brw-rw---- 1 root disk 34, 64 Mar 15 2002 /dev/hdh
</pre>
先頭のbがブロックデバイスを意味する
1つのブロックのことをセクタと呼び、普通はサイズは512バイトです。CD-ROM のようなデバイスでは最近は2KBですが、いずれにしてもセクターは2のN乗倍(512は2 の9乗、2Kは2の11乗)の値を取ります。
最大値は記憶管理のページのサイズ以下です。
32ビットアーキテクチャーなら4KB、64ビットアーキテクチャーであれば8KBです<ref>これは典型的な例で、ページサイズはハードウェアのアーキテクチャーに依存します。</ref>。
ハードディスクなどのデバイスからブロックの内容が読み込まれたとき(あるいは書き込まれる途中)、
データはメモリ中のバッファの中に保管されています。1つのバッファは1つのブロックに対応しています。
普通はページサイズが4KBでブロックサイズが512 バイトですから、一つのページは複数のバッファから出来ています。
ブロックデバイスから幾つかのブロックでデータを読み込んで来た時(あるいは書き込もうとした時)、
メモリ中にバッファのチェーンが作られます。
このように、ブロックデバイスを読み書きする時には、ハードディスクのようなデバイスを直接読み書きするのではなく、
まずこのバッファに対して読み書きが行われます。
=== 擬似デバイス ===
擬似デバイス (Pseudo-devices)とはデバイスファイルのように見せかけているが、その先には具体的なハードウェアが結びつけられていないデバイスファイルです。たとえばとはデバイスファイルのように見せかけているが、その先には具体的なハードウェアが結びつけられていないデバイスファイルです。たとえば /dev/nullは、その先が何もないデバイスファイルです。null は、その先が何もないデバイスファイルです。
<pre class="bash">
% cat foo > /dev/null
</pre>
* /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 Scheduler、I/O 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 といった複数
のスケジュールが用意されています。
またLinux 5.0以降ではI/Oスケジューラがマルチキュー I/O スケジューラに変更され、mq-deadline、bfq (Budget Fair Queueing)、kyber、none <ref>
https://www.kernel.org/doc/html/latest/block/index.html
</ref>
が用意されています。
;補足: Noop I/O Schedulerはスケジュールをしないスケジューラです。Scheduler (none) はスケジュールをしないスケジューラです。
; 調べてみよう : ブロックデバイスが/dev/sdaの場合、I/Oスケジューラの設定は /sys/block/sda/queue/scheduler でされているので、実際に自分の使っている環境ではどうなっているか見てみよう。
; 調べてみよう : IBMサイトにあるLinuxのディスクI/Oに関する考察 <ref>Linux disk I/O considerations ([http://public.dhe.ibm.com/software/dw/linux390/perf/Linux_disk_IO_considerations.pdf<Linux disk I/ref>O considerations ]) や openSUSE サイトにあるI/Oパフォーマンスのチューニング ( [https://doc.opensuse.org/documentation/leap/tuning/html/book-tuning/cha-tuning-io.html#cha-tuning-io-switch 12 Tuning I/O performance] )が参考になります。
== ネットワークデバイス ==
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 が作成されました。
;補足: 多くのディストリビューションがifconfigコマンドから [https://wiki.linuxfoundation.org/networking/iproute2 iproute2ユーティリティ] に含まれる ipコマンドに移行しています。頃合いをみて本説明もipコマンドでの説明に切り替える予定です。
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:C0:26:28:12:C5
inet addr:127.0.0.1 Mask:255.0.0.0
....
</pre> ;補足: loはループバックloはループバックのための仮想デバイスです。127.0.0.1は特別なIPアドレスで、これは自分自身を指します。
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