世界最高の共有メモリ(最も徹底したLinux共有メモリ)パート1

世界中で自転車を共有したり、宝物を共有したり、傘を共有したりするために1,000万種類の共有があり、私は共有メモリだけが好きです。

初期の共有メモリでは、CPUが各プロセスでこのメモリにアクセスできるように、同じメモリが複数のプロセスの仮想アドレス空間にマップされる(対応するプロセスでVMA領域を見つける)ことが強調されていました。

この段階では、マルチメディアおよびグラフィックスの分野で共有メモリ方式で広く使用されています。ある意味では、プロセスの仮想アドレス空間へのマッピングの概念(CPUがアクセスするだけのもの)を強調するのではなく、何らかの形の「ハンドル」に重点を置いています。 、ビデオ、グラフィックス、およびイメージデータの存在を全員に知らせ、この「ハンドル」を使用してプロセス全体でこのメモリの一部を参照できるようにして、ビデオエンコーダー、デコーダー、GPUなどがプロセス全体でメモリにアクセスできるようにします。したがって、さまざまなプロセスで使用されるアクセラレーションハードウェアは実際には異なります。彼らがより重視するのは、ハンドルを介してこのメ​​モリを取得でき、CPUの仮想アドレスにアクセスする必要がなくなったことです(もちろん、プロセスの仮想アドレス空間にマップすることはできます)。 CPUアクセス)。

メモリコピー(memcpy)がメモリ帯域幅とCPU使用率の大きなコンシューマである限り、共有メモリはLinuxプロセス間の通信およびコンピュータシステムのさまざまなハードウェアコンポーネントの通信の最も効率的な方法として繁栄し続けます。メモリコピーに関しては、CPU使用率が大幅に占有されます。これは、毎秒60フレームの1080Pムービーフレームレートをコピーする最も簡単な方法です。システムのCPUが損傷しないことを保証します。

Linuxのさまざまな共有メモリの手法をまとめた記事を体系的に書きたかったのですが、赤ちゃんを連れていくという原因にいつも悩まされてきましたが、今日は人形の山を担いで津波を呼び起こすことにしました。また、記事も書きたいと思っています。すばやく吐き出す。

メモリを共有する方法はたくさんありますが、現在の主流の方法は次のとおりです。

 

共有メモリ

1.従来のSYS Vに基づく共有メモリ。

2. POSIX mmapファイルマッピングに基づいて、共有メモリを実現します。

3. memfd_create()およびfdプロセス間共有を介して共有メモリを実現します。

4.マルチメディアおよびグラフィックスで広く使用されているdma-bufに基づく共有メモリ。

共有メモリ

 

SYS V共有メモリ

長い歴史、長い歴史、奇妙なAPIがあります。カーネルコードlinux / ipc / shm.cに対応して、カーネルのコンパイル時にCONFIG_SYSVIPCを選択しないと、この機能はなくなります。

Linuxでipcsコマンドを入力して表示される共有メモリは、次の共有メモリです。

共有メモリのsw.cを見るための簡単なプログラムを書いてみましょう:

そして、共有メモリの読み取り終了sr.c:

コンパイルして実行する準備をします。

システムの無料を見る前に:

次のようにswとsrを実行します。

SRの出力はswで書かれたものと同じであることがわかりました。現時点では、もう一度無料で見ていきます。

usedが大幅に増加し(711632-> 715908)、sharedが大幅に増加し(2264-> 6360)、キャッシュされた列も大幅に増加している326604-> 330716であることがわかります。

キャッシュされた列は、ファイルバックアップファイルのページキャッシュサイズをカウントすることは誰でも知っています。理論的には、共有メモリは匿名ページに属しますが、非常に特殊なtmpfsがあるため(/ dev / shmは/ run / shmを指し、/ run / shmはtmpfsにマウントします):

したがって、tmpfsのことは実際には少しあいまいであることがわかります。それは、ファイルに基づく匿名ページ(匿名ページ)として理解できます。これは、女性の声のZhou Shenに少し似ています。以前、匿名ページにはファイルのバックグラウンドがないことを繰り返し強調しました。そのため、メモリをスワップすると、ページはスワップパーティションとスワップされます。メモリ内のディスクファイルシステムの内容のコピーはファイルバックアップされたページであるため、スワップパーティションとのスワップの問題はありません。ただし、tmpfsのコンテンツは実際には統計的な意味でページキャッシュにカウントされますが、実際のディスクバックグラウンドはありません。これは、ディスクファイルシステムのファイルにアクセスして生成されるページキャッシュとは本質的に異なります。したがって、それは本当に雑感があり、すべてに絶対的なものはなく、変更自体のみが変更されていません。

ipcsを使用して、新しく作成されたSYS V共有メモリを見つけることもできます。

POSIX共有メモリ

POSIX shm_open()およびmmap()APIシリーズの共有メモリに対する私の愛は、SYS Vの100倍をはるかに超えています。怠惰な人間であることを許してください。ftok、shmget、shmat、shmdtのようなAPIが嫌いです。

上記のプログラムがPOSIXで記述されている場合は、end psw.cを記述するように簡略化できます。

読書終了:

コンパイルして実行します。

これにより、/ dev / shm /、/ run / shmの下にあるファイルが表示されます。

率直に言って、mmapやmunmapなどのAPIは、くつろいだ気分になりました最初にLinuxを始めたとき、フレームバッファードライバーを書いた後、/ dev / fb0 mmapを使用してユーザー空間で操作しました。愛する人のように本当に親切です。

もちろん、shm_open()APIが気に入らない場合は、通常のopenを使用してファイルを開いてから、mmapすることもできます。キーはmmapである、とウィキペディアは言った:

mmap

コンピューティングでは、mmap(2)は、ファイルまたはデバイスをメモリにマップするPOSIX準拠のUnixシステムコールです。メモリマップトファイルI / Oの方法です。ファイルの内容はディスクから直接読み取られず、最初は物理RAMをまったく使用しないため、デマンドページングが実装されています。ディスクからの実際の読み取りは、特定の場所にアクセスした後、「遅延」方式で実行されます。メモリが不要になった後、そのメモリへのポインタをmunmap(2)することが重要です。保護情報はmprotect(2)を使用して管理でき、特別な処理はmadvise(2)を使用して実施できます。

POSIXの共有メモリは、前述のtmpfsの特性に準拠しています。sw、sr、psw、psrを実行すると、freeコマンドが劇的に変化することがわかりました。

この無料コマンドの結果を、前の2つの無料結果のフィールドと比較してください。

3回目のキャッシュは2回目のキャッシュよりもはるかに大きいですか?ディスク上のファイルにアクセスしながらこの記事を書いていたため、もちろん、POSIX自体の共有メモリもキャッシュの増加を引き起こしていました。

memfd_create

POSIX mmapでくつろげるとしたら、memfd_create()は素晴らしいです。ナチュラルスタンナーとは何かを知る前に、このAPIを見たことがあります。それは、スタンナー内のスタンナーです。農場主が一目でそれを見たときに、それを完全に見ることができる種類のものです。その種のAPI;初めてそれを見るとき、彼らの体は熱くて目を引くので、彼らはその外観を無視します。

 

考えないでください。始める前に、クロスプロセス共有fd(ファイル記述子、よく言う「ハンドル」に対応)の重要な概念について言及する必要があります。

ご存知のように、Linux fdはプロセスレベルのものに属します。各プロセスの/ proc / pid / fdを入力して、fdsのリストを表示します。

このプロセスの0、1、2は、そのプロセスの0、1、2と同じではありません。

年と月の特定の日に、あるプロセスが実際に別のプロセスのfdにアクセスしたいことが判明しましたもちろん、これはあくまでも目的であり手段ではありません。たとえば、プロセスAには2つのメモリを指す2つのfdsがあり、プロセスBがこれらの2つのfdsを取得できる場合、実際にはこれら2つのfdsを介してこれら2つのメモリにアクセスできます。ある意味では、このfdは仲介者として機能します。プロセスAの場合、それは容易ではないと言う人もいます。

fd = open();

open()が100を返す場合、プロセスBにこの100を通知しても大丈夫ですか?プロセスBはこの100にアクセスできます。これは、fdが内部プロセスであり、クロスプロセスの概念ではないことをまだ理解していないことを示しています。あなたの100と私の100は同じものではありません。あなたはこれらの基本的な事柄を理解することができません。

Linuxは、プロセスのfdを転送し、ボールを別のプロセスにキックできる特別な方法を提供します。共有の種類)。私はいつもバグ(共有)をダンプ(共有)したいと思っていましたが、人々は常にバグをダンプしました。

では、ポット(シェア)FDをダンプ(シェア)する方法は?

元の記事766件を公開 賞賛された474件 254万回の閲覧

おすすめ

転載: blog.csdn.net/u010164190/article/details/105444456