代表例がシグナルシグナルと並行処理は相性が悪い(というか、気をつけないといけない)ロックをするようなプログラムで、割り込まれてロックをしたりすると、そっりゃあ危ないよね的な発想。相性が悪いとよく言われている。わからないからである。2つは、アプリケーションで自由に使えます。https://qiita.com/Kernel_OGSun/items/e96cef5487e25517a576#6-シグナルブロック(おーひらのイメージ)ブロックしたからこそ、特定のスレッドにのみシグナルを飛ばすことができる。ブロックすると、シグナルが、どこかに、たまっていく。シグナルが消えるわけじゃない!だから、なんつーか、シグナルをコントロール可能っていうか、シグナルに割り込まれて、いきなり処理を変えられちゃう、ことを防げる!シグナルは溜まっていく。あとでどうこうできる。これってとても良いことだと思う!英語の勉強を始めた話。無料体験から本契約にうつるでしょう。言えば、暗号通貨の話が気になっています。ネット環境悪めでも、画面共有なしなら結構いけるとはいえ、画面共有があったほうが良いのは間違いなさそう。お絵かきもできるし、今注目していることもわかるし、何よりおーひらの不安が減るから。このへんのバリア命令を(人間が)考えて書くの大変そう...。実際、人間が書くの?メモリバリア命令は、普通に書きます。リオーダリングCPUアーキテクチャごとのメモリオーダリングの表の解釈W→Wは機械語としてこうなっているwrite1writeで、AArch64の場合は、リオーダリングされる。Pthreadsで起きていた問題をRustでは解決しているという話https://discord.com/channels/508093437187457045/882639711447961710/989509351725211669https://discord.com/channels/508093437187457045/882639711447961710/989511113207087124ミューテックスをやりたいとする。↓pthreadsでやると、なんか問題があった。これは危ない!人間は平気でミスるからね。Rustなら、保護対象データへは、ロック後でなければアクセスできない。Pthreadsだと、ロックの解放を自分でやらんと行けなかった。Rustならロックの解放が自動で行われるので、嬉しいね。文字にするとふつーっぽく見えるけど、とっても大事だと思う。https://github.com/oreilly-japan/conc_ytakano/pull/794.6のコードが動かんhttps://github.com/oreilly-japan/conc_ytakano/blob/main/chap4/4.6/ch4_6_signal_rust/src/main.rsなおした。あとは反例としては、車とか。イベントが起きた瞬間に一度だけ通知が来る。イベントによって変化した状態が維持されている限り、通知が来続ける。「クンッ」の感じで、レベルは水平ってかんじ。電圧とか由来!野球のレベルスイングのレベルと多分同じ。https://mackey-lab.hatenablog.com/entry/2015/04/22/005214これはわかりやすいたとえ!メールが着いた瞬間に、一度だけ通知音が鳴るのが、エッジトリガ。相手が諦めるか自分が出るまで、電話が鳴り続けるのが、レベルトリガ。大事だと思うこと非同期とか並行とかいう文脈においては「順に」とか「順番」とか「待つ」とか「いつ?」とかはすげー大事。かなりの具体性を考えないとあかん!雑に、「イベントが起きた順で処理される」とかだと、実は結構曖昧なのでは!epoll_waitの仕様にもよる!「一般の話」か「特化の話」かを区別しようぜ!ということです!(?)Unixの話https://discord.com/channels/508093437187457045/882639711447961710/999668725269667850Unixは最初「全てがファイル!」という設計思想で作り始めたけど、Socketという例外(ファイルでないもの)が出て来たので、「全てはファイルディスクリプタ」ということになった。後年、Unixの設計者が新たに作ったPlan9というOSでは、ちゃんと「全てがファイル!」を達成した。(なお、細かいところで間違いがあるかも。)肉じゃがとカレーが同じ話ぎりぎりまで料理を決めないまま調理する。マという意味で、エンドユーザという意味ではない。スケジューリングからMEMO最近どう?イテレータ、ジェネレータ、コルーチンあたりの用語を整理したいね!このへん結構あいまいじゃない?「ジェネレーターの実装のための、コルーチン」っていうのが発見。非対称コルーチン対称コルーチンは、人間による管理がヤバそう。あとは、フロー図にも起こしづらいでしょ。非対称コルーチンは、無限リストとかのやつ。LexerとParserでコルーチン使って、交互に仕事するという発想賢い!さっきのページでちらっと見えた「lexerとparserをコルーチンで交互に実行する」っていうの賢い。後続処理にわたすのも早い段階からできるというのが利点。当時は、とにかく省リソースが良かったはず。https://discord.com/channels/508093437187457045/882639711447961710/1004723888913141831「継続」というすごい概念https://www.lambdanote.com/products/nmonthly-vol-3-no-1-2021http://www.shido.info/lisp/scheme_cc.html継続の利用例として代表的なのは、強力な制御機構の実現です。コルーチンは並行処理の一つの手段で、継続は計算過程というものを抽象化する手段という違いかと。後者の方がより広い対象で、並行処理はその応用に過ぎない、と。新しい言語だからとかカンケー内科?イテレータとかジェネレーターとかをPythonで考えてみると良いと思う。PEPとかみるといろいろ分かりそう。https://docs.python.org/ja/3/reference/expressions.html?highlight=generatorhttps://peps.python.org/pep-0255/tokenizeの話があるぞ!!!!同じ種類のアプローチが、多くの生産者/消費者機能に適用されます。イテレーターの一種ですが、特に強力な種類です。https://peps.python.org/pep-0342/https://peps.python.org/pep-0525/コンパイラの本!ドラゴンブック、タイガーブック、『言語実装パターン』が3大書だと思います。和書では、中田先生の『コンパイラの構成と最適化』が至高。話じゃなくて、あくまで、コルーチンを使ったスケジューリングを実現するための実装アイデアって感じ。キーワードつけるだけで便利だが、非同期処理と動機処理の使い分けがますますわからなくなっちゃうのでは?非同期処理は計測や解析、予測がしづらい最適化の緒がつかめなくなる。なんでもかんでも非同期にすれば良いというわけでもなさそうだし。見かけは楽になるかもしれないけど、同期的とか非同期の使い分け、より雑になっていく危険性!IO多重化とは?なんかいっぱいファイルディスクリプタをあれこれできるやつ的な。IOが多重化されていない状態をイメージすると考えやすいかも。非決定的な感じの方が、非同期っぽさを捉えている気がする。型を用いた記述方法には明示的に記述する方法と、暗黙的に記述する方法がある。型への操作はプログラマが記述しなければならない。キーワードにすることで、いつものめんどくさい処理を書かなくて済む感じ-キーワードが禁止されたらつらい世界観を想像するとわかりやすい説がある明示的、暗黙的に記述するというのは、参照を考えてみるとわかりやすい。持っているのは、いろんな言語のライブラリでよく目にするかな。https://discord.com/channels/508093437187457045/882639711447961710/1009802126093979708Rustのawaitはキーワードだった!Future(という考え方)はコルーチンによって実装されるらしい。各種Futureの実装MEMO1周年!最近どう?ひさびさ!コレ的な図。感じ全体が見えにくい(仕組みに注目したいけどRust面できつい)もう少し小さなmain関数が複数あれば良さそう今日はまとめらんねーぜ!けど、謎の絵だけ置いておく。ちなみに軽量スレッドとかの表記ゆれちなみに、定義はこんな感じですかね。・軽量スレッド(ファイバー、グリーンスレッドetc):スケジューリングとコンテキストの切り替えがユーザー空間で行われるマルチコンテキストシステム内のコンテキスト。・スレッド:互いにメモリ空間を共有するマルチコンテキストシステム内のコンテキスト。・プロセス:互いにメモリ空間が分離されたマルチコンテキストシステム内のコンテキスト。水槽内の水に酸素を送る装置です。気泡が登る様子から「ぶくぶく」と呼ばれることもあります。水面を揺らして酸素を取り込みやすくする効果があり、熱帯魚やエビなどの生き物の酸欠を防ぎ活性化させます。大成功!実際、テンション上がらなかったからね。本の内容から派生した話をすると楽しい「本の内容を無視している」というとネガティブっぽいけど、そうじゃない。tokio今調べたら、TOKIOってフランス語とかドイツ語での東京って意味らしいですへ〜Discordのスレッドを活用するといいかもしれない要練習。マルチスレッドやマルチスレッドプログラミングってどう?ウェブアプリを書いてるだけだと、自分のロジックでマルチスレッドを使うことはないですね。データ処理とかに使うプログラムとか、GUIプログラムだと、ちょいちょい使う印象。https://discord.com/channels/508093437187457045/882639711447961710/1030083761842425856Cでソース書くことありますけど確かにCだとほいほいスレッド立てることはないですね。アクターばんざい純粋な計算パフォーマンス向上のための非同期化では、OSスレッドを使うことはもうないんじゃないかと思います。逆に言うと、昔はOSスレッドしかなかった?(ユーザーランドのスレッド技術が進化したってこと?)Webサーバとかだと、むしろサービスそのものよりも、OSスレッドを作るコストの方が高いとかもある。Goroutineは、OSのスレッドと比べてコストが安いコストの話で言えば、Goroutineはスレッドとは比較にならないくらいコストが低いはず。(1000倍とかのオーダー?)「スレッドプール」と「スレッドプーリング」は似て非なる言葉かもしれない(要検証)スレッドプーリングとは、複数の実行スレッドを管理し、処理を各スレッドに分散させるためのテクニックである。場合によっては、同時実行制御などの機能も、スレッドプーリングの一部と考えられる。スレッドプーリングは、以下の処理を作業を行うのに適した方法である。スレッドプールは"先に"(≒タスクが来る前に)スレッドを作っておくのはわかるが、これの何が嬉しいの?https://discord.com/channels/508093437187457045/882639711447961710/1030090077340172329注文が来てから作るではなく、先に作っておいて注文を待つ。たこ焼き屋さんとかでも同じ。スレッド生成は先に済ませておけば、「忙しい最中に面倒な仕事をする」を回避できる的なイメージよく考えたら、スレッドプールは飲食店よりも、駅前で待ってるタクシーの方が例えとして適当かも。OSスレッドの生成や破棄はコストが高い破棄のコストってイメージしにくいよね(?)一度作ってしまうと捨てるのが大変のは、スレッドも人間が使う物も同じ。スレッドプールの"ノリ"スレッドの作成・破棄のコストが安くないので、先に作っておく。コストが大きくなりすぎたりして効率が悪いので、スレッド数の上限を設ける」ことになって、スレッド数の管理をすると複雑になるので最初から作っておいた方が楽になったりするという効用もある。応じて」という意味か!スレッドプールの嬉しさを説明してくれていた!(おーひらが誤解した!「予め」つくるなら、「じゃあ何個だよ?」「何個が効率言い訳?」っていう話になる↓だから、自然とスレッド数の上限も決められていくよねちなみに最近はセキュリティのために、消したスレッドが使ってたメモリは0クリアしないといけない。ブラウザが使っていたメモリには、パスワードとか入っていたりする。メモリ解放した後に、盗まれる可能性がある。秘匿情報を扱う系のプロセス(スレッド)ならたいてい当てはまりそうな話題。昔、Windows2.0とかならやってなかったかもwともかく、現代のブラウザだったら、まず実装されている話。実行速度の劣化やデッドロックが起きてしまう。いうアイデアは危険という話これまじで重要レビュー項目だな静的解析したほうがいいんじゃにの?コード上は些細な違いではあるが、重大な違いである。実行速度の劣化やデッドロックが起きてしまう。ブロッキングとかノンブロッキングがちゃんとわかってないと、ダメだぞ!?sleepはあくまで具体例。譲らないままになってしまう、みたいの。試合を支配している「SleepしたタスクをTOKIOが避けてくれる。」というような表現がありましたが、むしろTOKIOはすべてのスケジューリングを司っているので、「TOKIOのSleep関数を使うことで、TOKIOが行っているスケジューリングを阻害しないようにしよう」というのが適切かなと思いました。(本が言わんとしていることに忠実という意味で。1つのOSスレッドに対応するパターン。thread::sleep的な)、そのOSスレッドに紐付ているユーザースレッドも止まるよねっていうの納得できた。したことでキューに積み直されるlock_onlyが実行キューから取り出されてロック解放待ちになるでもロック解放にはlock_sleepがまた実行キューから取り出さプリエンプション(preemption)プリエンプションは、(一定時間経つと)スケジューラ側が無理やり実行権を取り上げ(て、他のタスクに切り替える)ることです。やりとりみて!非同期ライブラリを使うときは、非同期ライブラリ用の命令を使うとだいたいOK!sleepとか、spawnとか。仕組みは謎だが、標準ライブラリ(というか、非同期用のライブラリじゃないと)事件が起きる。パフォーマンスが落ちたり、デッドロックになったり。呼び出しているため、デッドロックに陥ることはない。async関数呼び出し。p.await.unwrap()}キジの生息分布は?そういえば、本物の野生のキジを見たいなと前々から思っているのですが、どこに居るのかわかりません。調べても、「気付かないだけで、どこにでもいる。」と書かれているだけです。「顰蹙」とかですかね。触ったコンピュータのOSは?PC-DOSとかDR-DOSWindows95知ってるけど知らない理論アクターモデルとかCSPとかジキルとハイドの話は余計だと思います!強く思いました!公平性は2つある話。むずい!プロセスは実行されることが期待されているから生まれているはず。プロセスは複数作るのが普通だと思うので、それをどういう戦略で管理するかとか、どこまで保証するかは確かに重要テーマだ(いまさら!)定義:弱い公平性ある実行環境が弱い公平性を満たす⇔あるプロセスが、ある時刻以降で実行可能だが待機状態になるとき、最終的にそのプロセスは実行される。定義:強い公平性ある実行環境が強い公平性を満たす⇔あるプロセスが、ある時刻以降で、実行可能な待機状態と実行不可な待機状態の遷移を無限に繰り返すとき、最終的にそのプロセスは実行される。「メモリにコピーするインストラクション」の実行コストと、メモリ空間を切り替えるためのページテーブルの差し替え、インストラクションポインタなどの待避、などなどをして、切替後のタスクのそれを逆に使えるようにする、みたいなことをやるので、やること結構ありますね。アプリケーション内の関数呼び出しでいうとマシン語でレジスタの待避をしたりするのをもっといろいろやる、みたいな感じ。その場合はどのレジスタを待避させれば十分なのかをプログラマが知っているので必須なものだけですませられるのに対して、汎用のタスクスイッチだと「影響がありえる」すべてのコンテキスト情報を待避させないとならないですね。実は専門用語だったのか!特定のタスクを実行するために固有の情報すべてが、コンテキスト情報です。呼ぶこともあるようです。単行本』は名著https://www.amazon.co.jp/dp/47561467914.3と4.4ってやつは古いので注意。C」はC言語のコーディング規約。いう単語のニュアンス。ノンプリエンプティブだった。タスク切り替えがごみなアプリがOSをかためることがしばしばだったよね。Teamによって設計された[2]。Teamによって設計された[2]。雑に言えば、仕事が少ないから!そもそも、システムコールが重たい。大きさも、プロセス全体とアプリ内のみとではぜんぜんちがう。プロセスの切替だと、プロセス空間毎切替えるとか、いろいろと。協調じゃん!上記は、協調的マルチタスクのデメリットである、「無限ループマンによって詰む」現象が起こるわけだし!おーひらさんも指摘されている通り、関数呼び出し→コルーチン→グリーンスレッド→カーネルスレッド/カーネルプロセス→コンテナ型仮想マシン(で合ってましたっけ)は、相似形を形成していると言えそうですね。アーカイブOSSは人が作っているクレームはデータとして集積されやすいけど、「好き」とか「いいぞ!」はサイレントになっちゃうので。