巨人の足元でたじlog

そうして言葉を軽んじるから――― 君は私の言葉を聞き逃す

プロセスとスレッドとかタイムスライスとかスケジューリングがわからない

nginxをかませると何がいいのか? その答えを探して、先輩に聞いてみたところキーワードとして「プロセス、スレッド、cpuコア」みたいな話がふんわりと出てきて、しかし自分の方での知識がなさすぎ説明の土台に立てていなかったので、一旦そこら編を整理しておく。

プロセスらへんについては、「ふつうのLinuxプログラミング」という本で読んで、メモリとかうまいことやってくれているというふうに理解した覚えがある。
それぞれのプロセス同士が使うメモリを競合しないように、うまいことやっていると。
一つのプロセスがメモリを使う際には、実際の物理メモリアドレスはどこなのかを意識しない、自分だけのものとして使っていいと、それを誰かが調整してくれている。みたいな認識だった。

http://moro-archive.hatenablog.com/entry/2014/09/11/013520

を読んで、あーそんなこと言ってたなそういえば。と思い出した。

マルチプロセスは、メモリ空間とかごと別の環境ができると。
そのぶん、マルチプロセス内で処理を切り替えるときにはプロセスごとにいちいち仮想アドレスと物理アドレスマッピングをしなきゃいけないと。
なので、その分オーバーヘッドが生じて遅くなる...? 一方でマルチスレッドの場合は、スレッド間でメモリのデータセグメントは共有されている?ので、その分いちいちマッピングをする必要はないので、オーバーヘッドはなくなる?みたいな?

しかしそもそもプロセスなんてのはサーバー上に走っているのでどっちにせよマッピングとかはプロセスが切り替わるごとにやらなきゃいけないんじゃないのか?

いやーわかんない。

そもそも、2つのリクエストがほぼ同時に来たときに、レスポンスを返すための処理がとても重いとする。それをマルチスレッドでさばくと、全体としてのレスポンスの速さは変わるの?
というもの、スレッドが複数個走っているときにも、プロセスはひとつなので、スケジューリングされるタイムスライスの時間は変わらない?はず。とすれば、同じ計算能力に対して仕事が2倍になるのだから、それぞれの仕事の進捗の速さは2分の一になってしまうじゃないか。
というかタイムスライスはどうやって決まるんだ?マルチスレッドで2つのスレッドがたった時点で、タイムスライスが2倍になってくれば問題はないのだが、そこらへんまで踏み込むのは今はやりすぎな気がしている。

明日聞いてみよう。

やっぱりもうちょっと調べてみた。

タイムスライスの長さをシステム負荷に応じて動的に調整します まず、全タスクを一周動作させ るまでのスケジューリング周期を求めます。この値は単一プロセッサ時の周期 (20msec) に CPU 数によって 重み付けをした値です

CPU 数が増える程スケジューリング周期は長く、プロセスが増える程タイムスライスは短くなりま す。これは、CPU 数が増えれば一度に実行出来るプロセス数が増えるのでスケジューリング頻度を増やす必 要が無くなる為です。

https://syuu1228.github.io/process_management_and_process_schedule/process_management_and_process_schedule.pdf

この説明では、プロセスごとにタイムスライスを多めに割り振る方法とかはない。
しかし、topコマンドで負荷を見ながら、yesコマンドを打つと大量にCPUが食われているのがわかる。
ということはやはり処理に応じてタイムスラスは割り振られているんだなぁ。