LookOne について
※メモのために書いているので、文章のアレコレは気にしていません
ここ最近分散システムの勉強をしていましたが、各ノードのパフォーマンスを最大まで上げないと分散させる意味あんまりないのでは?って思い並列コンピューティングの勉強をしています。
使っている本はこちら www.amazon.co.jp
現在、相互排他の章のLockOneのところが終わったので忘れぬように纏めます
#共有カウンタ class Counter{ private int value; public Counter(int c){ value = c; } public int getAndIncrement(){ int temp = value; # やばいところ value = temp + 1; # やばいところ return temp; }
シングルスレッドで上記のインクリメントを読んでも問題ないが、複数スレッドで上記のインクリメントを呼ぶとやばいところ
がやばくなるのである。
それを回避するためにクリティカルセッションで やばいところ
を守る。
(読み込み/書き込みのシーケンスを一度に1つのスレッドが行う)
//interface public interface Lock{ public void lock; public void unlock(); } class Counter{ private int value; public Counter(int c){ value = c; } public int getAndIncrement(){ lock.lock(); try{ int temp = value; # クリティカルセッション value = temp + 1; # クリティカルセッション return temp; }finally{ lock.unlock(); } }
lockでスレッドはデータをクリティカルセッションに入れるまで待つ。
クリティカルセッションに入れたら、ロックをかけデータの見出し及び書き込みをする。
上記が成功/失敗したらロックを解除する。
あるスレッドが無限に占有することがないことからスターベーションフリーである。
またスレッドがロックを試み取得でき、ロックを取得できる。スレッド1がロック取得できないとしたら、スレッド2がクリティカルセッションをこなしていることから、デットロックフリーとなる。
LockOne
LockOneアルゴリズムでは2つのスレッドの環境で考える。 またスレッドがロックを確保している|しようとしている のステートを表すためサイズ2のbooleanの配列を用意する。
下記ではスレッドAがスレッドBに邪魔されずにロックを確保できる例を示す。
スレッドAはクリティカルセッションに入るために、ロックを確保しようとする。
下記ではスレッドBがスレッドAに邪魔されロックの確保を待たされる例を示す。
下記では、スレッドA,Bが同時にロックをかけようとしてスターベーションの状態を示す
writeA(flag[A] = true)とwriteB(flag[B])がreadA(flag[B])とreadB(flag[A])よりも先に起こるためおきる。
LockOneではどちらかのスレッドがもう一方のスレッドよりも前に実行さえすればデッドロックは起こらない。
(Neo)Vimで気持ち良い環境を構築する
前置き的な
今までVimを適当に使ってきた私ですが、一度自分の環境を見直すことにしてみました(1月末くらいから)。
その理由として、プラグインを入れすぎてテキストエディタとしてのシンプルさを失ったVimに疑問を持ったこと、
純粋にVim本来の力を忘れいたこと...などがあります。
ということで本記事では、最低限vimで欲しいプラグインたちを紹介します
プラグイン管理
Shougoさんが開発しているdein.vimを使用しています こちらは以前から使っていますが、パッケージをtomlで管理できるところが良いです
補完系
補完系はdeoplete.nvimとLSPクライアント(LanguageClient-neovim)を使用しています。
LSPを導入することで、補完系のプラグインを減らせました。
Ruby
,Python
だとLanguageClient-neovimの設定は、こんな感じです。
[[plugins]] repo = 'autozimu/LanguageClient-neovim' rev = 'next' build = 'source install.sh' hook_source = ''' set hidden let g:LanguageClient_serverCommands = { \ 'python': ['pyls'], \ 'ruby': ['solargraph', 'stdio'] \} nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR> nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR> nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>
もっさり pic.twitter.com/tyiBZ1KdXi
— 𝚃𝚛𝚜 (@TrsNium) February 5, 2019
pylsと組み合わせるとこんな感じです。
その他
ステータスバーのカスタムはvim-airlineとvim-airline-themeを使っています
設定はこんな感じ、<Cntl-n>, <Cntl-p>でbufferを切り替えれるようにしてます
[[plugins]] repo = 'vim-airline/vim-airline' hook_add=''' let g:airline_powerline_fonts=1 let g:airline#extensions#tabline#enabled = 1 nmap <C-p> <Plug>AirlineSelectPrevTab nmap <C-n> <Plug>AirlineSelectNextTab let g:airline#extensions#tabline#buffer_idx_mode = 1 if !exists('g:airline_symbols') let g:airline_symbols = {} endif ''' [[plugins]] repo = 'vim-airline/vim-airline-themes' hook_add=''' let g:airline_theme='minimalist'
行末の不要な空白を可視化するためにvim-trailing-whitespaceを入れています
インデントを可視化するためにvim-indent-lineを入れています
デフォルトだと|
でインデントが可視化されるのですが、好みではなかったので·
で置き換えています
[[plugins]] repo = 'Yggdroot/indentLine' hook_add=''' let g:indentLine_enabled = 0 let g:indentLine_char = '|' let g:indentLine_leadingSpaceEnabled = 1 let g:indentLine_leadingSpaceChar = '·' '''
windowサイズの変更を楽にするためwinresizerを使用しています
<Cntl-e>でリサイズが始まりh
,j
,k
,l
でサイズを変えることができます
もう<Cntl-w>> とかには戻れない....
最後にカラースキームですがicebergを使用しています
ここら辺は好みなので、好きなのを入れましょう
基本的に私が中心に使っているのは、上記のプラグインたちです。
他にもオススメがぜひ教えてください!
最後まで見ていただき、ありがとうございました。