本記事は、Linuxの仕組みを読んで学んだことを
アウトプットするために作成しています。
記事全体は、5分程度で読むことが可能です。
・プロセス間通信について
プロセス間のデータ共有などをつかさどっているものです。
fork()だけではメモリ空間が複製(コピー)されて独立してしまうため、データをリアルタイムに共有することはできない。mmap()を使うことで、物理メモリを共有して読み書きできるようになるそうです。※mmap()はシステムコールです。
fork()がわからない方は、僕のLinuxの仕組み①の記事を読んでみてください。
SIGINTもプロセス間通信の一つで、
パイプ | ←プロセスとプロセスをつなげる役目があります。
例)cat resource.file | grep “test.txt”
排他制御について
クリティカルセクションとアトミック処理があります。
・クリティカルセクション
一連の処理で外部からアクセスされると困るもののこと。
・アトミック処理
並列処理の中で邪魔されずに一気に完了することが保証されている処理のこと。
並列処理を実行可能にするには、ロックシステムがあり実際にシステムコールとして用意されています。このようにロックは、OS内部だけでなく、アプリ開発でもデータの整合性を守るために重要な概念です。
ちなみに高級言語のロックは、基本的にアセンブラ(機械)語とくらべて非効率だそうです。
デバイスファイルについて
プロセス → カーネル → デバイスファイルへアクセス
という順になっています。理由は衝突などを防ぐためだそうです。
ためしに、rootで下記コマンドをたたいてください。
「ls -l /dev/」
頭文字が「c」はキャラクタデバイス
頭文字が「b」であればブロックデバイス とされています。
キャラクタデバイスとは、RWだがシーク操作は不可能。
例)マウス、キーボードなど
ブロックデバイスとは、シークが可能。
例)HDD/SSDなど
実際にデバイスファイルが利用されているのは、プロセスがデバイスドライバにアクセスした際のカーネル機能についてよく言う、デバイスドライバです。USBなどを接続した際に、カーネルにロードされてハードウェアを制御するプログラムのことです。
シーク(Seek)とは、ストレージデバイスにおいてデータの読み書きを行う際に、
物理的な位置を移動させる操作のことを指します。
メモリマップトI/O(MMIO)について
デバイスのレジスタにアクセスすることです。
そして、レジスタによって処理完了を検出したりします。
その際に検出する機能に、ポーリングや割り込みといった処理があります。
・ポーリング機能とは?
処理中にずっとレジスタを読み込むことによって、書き込みが行われたタイミングで処理完了を検出する方法。ただ、前述では多少CPUを無駄に稼働させているようにも見えます。
そこで、CPUが無駄に見張るのではなく、デバイス側から完了通知を送ってもらう方式があります。これが割り込み機能です。
・割り込み機能とは?
デバイスにI/Oリクエストを出したプロセス自身がスリープ状態(実行待ち)になり、完了の割り込みが入るとOSがそのプロセスを起こしてあげる。
この通知を利用して、検出する方式のことを割り込み機能といいます。
これは検出の一例であって、割り込み機能自体は次プロセスを動かすためにあります。
※デバイス処理が高速であればポーリングのほうがいいこともある。
割り込みだと、高速の場合処理が追い付かなくなる可能性もあるため。
まとめ
最後まで読んでいただきありがとうございました。
今回はやや設計よりの話もあったので、PGなどはあまり気にすることはないかもですが
DevOpsやSREなんて言葉が流行っている今日では、必要になってくる知識かもしれませんので是非何かしら役立ててくれると光栄です。
今回はLinuxの仕組みを読んで実際に覚えたいことや、
気にかけて開発したいと思った個所をブラッシュアップしてみました。
次回は、ファイルシステムの解説をしていきたいと思います!是非そちらも参照ください。

コメント