タグ

mmapに関するkamipoのブックマーク (14)

  • バッファキャッシュとAIO(2) - O'Reilly Japan Community Blog

    プロセスがブロックする要因の一つにファイルI/Oがあります。これを同期I/Oと言いますが、POSIXではAIO(非同期 I/O、Asynchronous I/O)も定義しており、I/O中でもプロセスがブロックせず他の処理を進められるようになります。 今回は、バッファキャッシュを意識したさまざまなファイルI/Oについて解説します。 メモリマップ I/O ファイルI/Oの一種にメモリマップI/O、mmap(2)があります。mmap(2)(およびmmap2(2))はオープンされたファイルをプロセスアドレス空間へマッピングするもので、例えばアプリケーション内に領域を用意し、ファイルを読み取る動作は次のようにも実装できます。 3mmap.c 要約 { char a[N]; fd = open(path, O_RDONLY); read(fd, a, N) printf("%.*s\n", N, a)

  • マルチスレッドなら pwrite より mmap+msync のが速い (or Q4M のパフォーマンスの限界値に到達) という話 - kazuhoのメモ置き場

    色々ユーザランドでのロックを使わない形に書き換えても、なかなか速くならなかったのが、pwrite をやめて mmap(PROT_WRITE) 経由での書き込みにしたら、20% 程度あった idle time が 0 になった。 ベンチマーク的にはこんな感じ。上が pwrite 経由。下が msync(MS_ASYNC) 経由の書き込み。どちらも読み込みは mmap。 $ USE_C_CLIENT=1 MESSAGES=400000 CONCURRENCY=40 DBI='dbi:mysql:test;mysql_socket=/tmp/mysql51.sock;user=root' t/05-multireader.t 1..4 ok 1 - check number of messages ok 2 - min value of received message ok 3 - max v

    マルチスレッドなら pwrite より mmap+msync のが速い (or Q4M のパフォーマンスの限界値に到達) という話 - kazuhoのメモ置き場
  • 開発メモ: 入出力系システムコールの基礎的な負荷を可視化

    openとかreadとかのシステムコールを呼ぶだけの簡単なお仕事に携わる皆様、こんにちは。 普段自分が使っているシステムコールって、他にオーバーヘッドがない理想的な状態だとどれくらいの負荷になるんだろう。そんな漠然とした疑問を持ちつつも、面倒なんで自分で測ることなく日々を過ごしている人も多いかもしれない。それじゃいけない。純粋にそのシステムコールを呼ぶとどれくらいの負荷がかかるのかを知っておかねばならない。 ということで、簡単なテストプログラムを書いてみた。各システムコールの典型的な組み合わせでどれくらい時間がかかるかを見るのだ。「gcc -std=c99 -Wall -O2 -o mytest mytest.c」でビルドできる。結果は環境依存性が強いだろうから、ぜひ自分の環境で動かしてみてほしい。 #define _XOPEN_SOURCE 500 #include <stdlib.h>

  • mmapの実装 : kei@sodan

    mmapの基的な動作はファイルをメモリにマップすることですが、mmap()を実行したときにいきなりファイルがメモリにコピーされるわけではありません。 mmap()を実行するとアドレスが返されますが、このときこのメモリ番地は物理メモリ上に乗っていません。 だから、この番地をアクセスするとページフォルトが発生します。このページフォルトを受けて、はじめてデータがファイル(ディスク)から物理メモリにコピーされます。(なお、もし元々このファイルがファイルキャッシュに乗っている場合は、このファイルキッシュのアドレスがそのまま返されます) mmapされた領域に書き込まれたデータは、適宜ディスクに書き戻されます。 なお、ファイルの一部だけがアクセスされたら、その一部だけをメモリに乗せればよいです。また、物理メモリが足りなくなったら、あまりアクセスされていないページはページアウトさせます。 この「ページフ

    kamipo
    kamipo 2010/11/08
  • mmapのAPI : kei@sodan

    まずはmmap()のAPIを説明します。 fd = open(file, access); a' = mmap(a, n, prot, share, fd, offset); まずは普通にファイルをopen()で開きます。その後、mmap()でマップします。 aは「この仮想メモリアドレスにマップしてほしい」という値を指定できるのですが、普通はNULLでOKです。nはファイルの何バイト目をマップするのか、offsetは何バイト目からをマップするのかという指定です。 shareという引数がありますが、これは複数のプロセスが同じファイルをmmapしたときの動作です。 shareにMAP_PRIVATEを指定すると、そのプロセスは別のコピーを見て、プロセス間でデータは共有されません。メモリ上に複数データがある…ということで、ディスクにはどのデータを書いていいのか分からないので、書き込み結果はファイ

    kamipo
    kamipo 2010/11/08
  • ファイルとメモリ : kei@sodan

    今お店で売っているコンピュータは、性能の違いを除けばどれも同じように使えます。 Windowsを買ってきて(あるいはLinuxをダウンロードして)、ブラウザとかメールソフトとかを入れれば ハードウェアの違いは意識することがありません。 でも実際には、コンピュータによってメモリのチップ、ディスクの容量、数、ネットワークカードのメーカーや仕様などは大きく異なっています。こうした差異を吸収してくれているのがOS (オペレーティングシステム)です。OSは色々な資源を抽象化し、プログラマは一種類のプログラムを書きさえすれば、どんなハードウェアでも実行できるようにしてくれます。しかも、メモリがたくさんある環境では高速に、メモリがあまりない環境でも「とりあえずは動く」ように色々と工夫をしてくれます。 実際のハードウェアとOSによる抽象化の例をまとめてみたのが下の図・表です。 ハードウェア デバイス

    kamipo
    kamipo 2010/11/08
  • mmap - Wikipedia

    この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方) 出典検索?: "Mmap" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL(2024年6月) mmap() は、UNIXのシステムコールのひとつで、ファイルやデバイスなどのオペレーティングシステム (OS) 上のリソース(計算資源)の一部または全部を連続した仮想アドレス空間にマッピングする関数である。 ファイルシステム上のリソースに対するアクセス方法として、ストリームI/Oを行うシステムコールとの比較で、ユーザー空間とカーネル空間の間で読み書きされるデータのブロック転送が多くのアーキテクチャ上では発生しないことから、好まれる場合がある。 デバイスでは、io

    kamipo
    kamipo 2010/01/22
  • http://1978th.net/tech/promenade.cgi?id=44

  • IPC: Memory Mapped File | Shinta's Site

    プロセス間で共有される情報を、ファイルを利用して読み書きする。 SYNOPSIS #include <sys/mman.h> void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); int msync(void *addr, size_t len, int flags); int munmap(void *addr, size_t len); DESCRIPTION 複数のプロセスが、ひとつのファイルを同時にアクセス(読み書き)することがあります。その際に、fseek()関数を利用してファイルを操作するのはとても面倒です。もし、メモリにファイルの内容をマッピングすることができ、それへのポインタを得ることができたならファイルの操作は非常に楽なものになります。それを実現するのがメモリマップド

  • mmap()を利用する高度なファイルI/O (1/5) :TEDIA

    TEDIA会員に登録したメールアドレスとパスワードを入力してください メールアドレス: パスワード: パスワードを忘れた方はパスワードの確認を行ってください。 TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます >> テクノロジーポータル TEDIA トップページへ戻る << mmap()を利用する高度なファイルI/O これは全7回でLinux I/Oファイルのシステムコールを解説する連載の第4回です。今回は、mmap()の使い方を学習していきましょう。内容は、ロバート・ラブ著『Linux System Programming: Talking Directly to the Kernel and C Library(Linuxシステムプログラミング-カーネルおよびCライブラリへ直接話しかける:仮題)』第4章からの抜粋です。(原著はオライリーより2007年に出版、ISBN:

    kamipo
    kamipo 2009/11/09
  • Manpage of MMAP

    Section: Linux Programmer's Manual (2) Updated: 2008-06-05 Index JM Home Page roff page 名前 mmap, munmap - ファイルやデバイスをメモリにマップ/アンマップする 書式 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length); 説明 mmap() は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。 新しいマッピングの開始アドレスは addr で指定される。マッピングの長さは length 引き数で指定される。 addr が NULL の場合、カーネ

  • コンピューター:C言語講座:mmapについて

    コンピューター:C言語講座:mmapについて 概要 mmapはファイルをメモリにマッピングするものです。わかりやすく言うと、UNIXのOSが行なっているページングやスワッピングを自プロセスで行なうようなものです。 これを使うメリットとしては、メモリ確保サイズが確保開始時に決定できない場合、簡単にはmalloc()で適当な量を確保し、足りなければrealloc()を使用して拡大することになりますが、realloc()を繰り返すとメモリ領域中に空きが出来やすく、大規模なシステムでは実際使用しているメモリより空き空間の方が数倍大きくなってしまい、メモリ不足で実行不可能になる場合があります。mmapを使用すれば、別々に拡大していくような管理が可能なので、また、スワップスペースとは別の位置に置くことにより、多数の動的メモリを必要とする場合に安全に動作することが可能になる場合があります。ただし、基

  • 横着プログラミング 第9回: sary: Suffix Array のライブラリとツール

    最終更新日: 2002-12-18 (公開日: 2002-12-18) Unix Magazine 誌に 2002年1月号から 2003年2月号にかけて連載し ていた記事の元の原稿です。 私にフローチャートだけを見せて、テーブルは見せないとしたら、 私はずっと煙に巻かれたままになるだろう。逆にテーブルが見せて もらえるなら、フローチャートはたいてい必要なくなる。 -- Frederick P. Brooks Jr. *1 プログラミングにおいてはデータ構造が重要であり、正しいデータ 構造を選択すればアルゴリズムは自明なものとなる、という主張が ある。Rob Pike*2 の "Notes on Programming in C" *3 によると、現実的なプログラムに必要なデータ構造は次の 4つであ るという。 配列 (array) 連結リスト (linked list) ハッシュテーブル

  • mmap (メモリマップトファイル) : kei@sodan

    Linux/Unixのメモリ周りで大活躍のシステムコール、mmapの解説です。 スライド(pdf), (pptx), (ppt) 上記スライド及びこのページの内容の大部分は、(僕が受けた) 田浦先生 の授業オペレーティングシステムの6回目のスライドと同じです。 あと、malloc中のmmap()まわりを調べてくれてありがとう>研究室のkennyくん ファイルとメモリ mmap()のAPI・使い方 (mallocの中身の話題) mmap()の実装

  • 1