Sunday, October 30, 2016

mmapを使ってファイルベースの巨大なバッファを確保する話

小さなバッファはインメモリでもつが、メモリに収まらないような大きなバッファはテンポラリファイルを作り、file I/Oでアクセスする、というのが昔からの汎用的なバッファ実装のアプローチ。

だが、バッファに格納するデータ量によってアクセス手段を変えるというのはめんどくさいし、そこを抽象化すると無駄なオーバーヘッドが発生する。

幸いなことに最近は、メモリ空間が広い 64bit CPU だけ考えればいい。なので、ファイルの「読み込み」については、めんどくさいから全部mmapするというのが一般的なアプローチになってきている(例: LLVMのリンカであるlld)。

同様のことが、テンポラリファイルを使う可変長のバッファについても可能であり、h2o では実際に実装している。詳しくは h2o_buffer_reserve 関数の実装を見てもらえばいいと思いますが、ざっくりとした手順は以下のとおり:

▪️バッファ作成もしくはリサイズ処理:
  1. テンポラリファイルを作り、すぐ消す(作成の場合のみ。mkstemp, unlink してから file descriptor を使い続ける)
  2. サイズを設定する(posix_fallocate もしくは ftruncate)
  3. 旧来のマップされた領域を munmap する(リサイズの場合のみ)
  4. 全体を mmap する
▪️解放処理:
  1. munmap して close する

Windowsなら、ファイルを消すのを解放時にする必要があるかも。

15 comments:

  1. Windows は FILE_DELETE_ON_CLOSE フラグを設定しておくのかな。クローズすると自動削除。

    ReplyDelete
  2. Windowsの_openなら_O_SHORT_LIVEDや_O_TEMPORARYが、Linux 3.11以降のopen(2)ならO_TMPFILEがありますね
    https://msdn.microsoft.com/library/z0kc8e3z.aspx

    ReplyDelete
  3. I understand what you bring it very meaningful and useful, thanks.

    five nights at freddy's 5  |run 3 |

    ReplyDelete
  4. Thank you for such a sweet tutorial - all this time later, I've found it and love the end result. I appreciate the time you spent sharing your skills.

    cat mario | whatsapp baixar |  tank trouble |

    ReplyDelete
  5. The blog or and best that is extremely useful to keep I can share the ideas of the future as this is really what I was looking for, I am very comfortable and pleased to come here. Thank you very much.
    animal jam | five nights at freddy's | hotmail login

    ReplyDelete
  6. Objek wisata gunung bromo menjadi primadonya jawa timur karena wisata ini memang sangat fenomenal di kalangan para wisatawan. Banyak para pengunjung yang datang dari luar negeri untuk menikmati keindahan alam di wisata gunung bromo. Hamparan pasir yang luas dan dinginnya hawa pagi di wisata gunung bromo menambah keseruan saat berlibur ke wisata gunung bromo jawa timur tersebut.
    Pelayanan jasa sewa mobil malang murah sangat diburu oleh para wisatawan yang sedang berlibur di kota malang batu. Jasa sewa mobil murah malang ini bisa menjadi ladang bisnis yang menggiurkan, karena mengingat banyak para wisatawan yang datang dari luar membutuhkan transportasi sewa mobil malang murah. Beragam pilihan paket sewa mobil malang murah dan juga bermacam-macam tipe mobil yang disediakan oleh sewa mobil malang batu murah. Informasi pemesanan dan booking online sewa mobil malang murah baca halaman lengkap.
    Racikan ampuh jamu kuat dan tahan lama yang dapat dengan mudah mengatasi masalah ejakulasi dini adalah dengan memakai ramuan herbal madura. Obat kuat yang berasal dari madura sangat populer di kalangan pria yang menginginkan hubungan seksual tahan lama agar bisa menikmati kenikmatan saat berhubungan intim tersebut. Jamu tahan lama seksual ini diolah menggunakan bahan-bahan tradisional dan sudah terdaftar resmi di badan kesehatan republik indonesia. Jadi anda tidak perlu khawatir saat mengkonsumsi jamu kuat alami dari madura ini, tidak ada dampak negatif sedikitpun bagi kesehatan tubuh. artikel terkait . Harga jual jamu kuat dan tahan lama produksi ramuan madura asli obat kuat tahan lama.

    ReplyDelete

  7. The share your really gives us excitement. Thanks for your sharing. If you feel tired at work or study try to participate in our games to bring the most exciting feeling. Thank you!
    hotmail sign in | red ball | 192.168.1.1

    ReplyDelete
  8. Thank you! I hope you have many useful articles to share with everyone!
    slither io

    ReplyDelete
  9. Interesting article! Thank you for sharing them! I hope you will continue to have similar posts to share with everyone! I believe a lot of people will be surprised to read this article!
    abcya

    ReplyDelete
  10. Thanks for your post! Through your pen I found the problem up interesting! I believe there are many other people who are interested in them just like me! Thank you for sharing them with everyone!
    fb login

    ReplyDelete