{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# ファイルシステム周りのシステムコールとGoの関数について\n", "\n", "2018/9/26 勉強会" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## syscall.inotifyについて\n", "\n", "- inotify\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### inotify\n", "\n", "- ideno notifyの略\n", "- ファイルシステムへの変更を通知する\n", "- dnotifyの派生\n", " - ディレクトリレベルでの監視しかできない\n", "- Linux 2.6.13カーネルから組み込まれた(2005/8/29リリース)\n", "- 1つのファイルディスクリプタを開くだけで1つ以上のファイルやディレクトリでの以下のことを監視できる\n", " - Open\n", " - Close\n", " - 移動/名前変更\n", " - 削除\n", " - 作成\n", " - 属性の変更\n", " - etc.\n", "\n", "- inotifyコマンド\n", " - http://www.usupi.org/sysad/157.html\n", " \n", " \n", "【参考】\n", "- [inotify で Linux ファイルシステムのイベントを監視する](https://www.ibm.com/developerworks/jp/linux/library/l-inotify/index.html)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 実践\n", "\n", "- [go_fsnotify.go](https://github.com/mrsekut/GoSystemProgramming/blob/master/10/go_fsnotify.go)\n", "\n", "\n", "### fsnotify参考\n", "- [fsnotify/fsnotify: Cross-platform file system notifications for Go.](https://github.com/fsnotify/fsnotify)\n", "- [fsnotify - GoDoc](https://godoc.org/github.com/fsnotify/fsnotify)\n", "- [[Go][Mac] ファイルの変更を検知する方法 - Qiita](https://qiita.com/cotrpepe/items/3877a8d803f45c6f1171)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## syscall.Flock\n", "\n", "- fcntl" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## ファイルロック\n", "\n", "- 排他制御\n", "- 複数のプロセス間で同じリソースを同時に変更しないようにするために、他のプロセスに「このリソース使用してるなう」と伝える手法の一つ  \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### よくある例\n", "\n", "- カウンター増えない問題\n", "- 銀行口座の上書き" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### syscall.Flock()\n", "\n", "- ファイルロックをかけられる\n", "- 後からアクセスしてきたプロセスが確認してくれなければ意味がない\n", " - アクセスしてくるプロセス全員がFlock()すれば、かかっていれば何もしない、かかってなければかけるといったことができる\n", " - ロックはかかっているが、無視して書きこむこともできる\n", "- これを勧告ロックという\n", " - 対義語は強制ロック" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "\n", "\n", "\n", "### Note\n", "\n", "\n", "- ノンブロッキングモード\n", " - 定期的にロックをかけようとトライする\n", "- ブロッキングモード\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 共有ロックと排他ロック\n", "\n", "- 共有ロック\n", " - 読み込むときに使用される\n", " - 複数のプロセスから同じリソースに対していくつも同時にかけられる\n", " - 他のプロセスがロックをかけようとした場合は、共有ロックは許可するが、排他ロックを許可しない\n", "\n", "- 排他ロック\n", " - 書きこむときに使用される\n", " - 他のプロセスからの共有ロックがブロックされる\n", " - 他のプロセスがロックをかけようとした場合は、共有ロックも排他ロックも許可しない" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "#### 結局どういうことかというと\n", "\n", "- 書き込みは一人のみ、読み込みは複数人でもOKってこと\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 実践\n", "\n", "- [go_flock.go](https://github.com/mrsekut/GoSystemProgramming/blob/master/10/go_flock.go)\n", " - 2つ実行する" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## syscall.Mmap()\n", "\n", "- mmap\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## ファイルのメモリへのマッピング\n", "\n", "- syscall.Mmap()\n", " - メモリマップ\n", " - ファイルの中身をそのままメモリ上に展開できる\n", " - メモリ上で書き換えられた内容をそのままファイルに書き込める\n", " - メモリマップドファイル" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 実践\n", "\n", "- [go_mmap.go](https://github.com/mrsekut/GoSystemProgramming/blob/master/10/go_mmap.go)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "- mmap.flush()の意味\n", " - https://stackoverflow.com/questions/20056099/why-does-the-memory-mapped-file-ever-need-to-be-flushed-when-access-is-rdwr" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 参考\n", "\n", "- https://www.nttpc.co.jp/yougo/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html\n", "- http://blog.matsumoto-r.jp/?p=2030\n", "- http://www.ibm.com/developerworks/linux/library/l-async/\n" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" }, "toc": { "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }