トップページ⇒linux
986コメント359KB

☆Linux カーネルの仕組みを勉強するスレ☆

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/10/02 17:44ID:38KkZsUQ
メモリ管理、プロセス、ファイルシステム色々ありますが
カーネル全般について語り合うスレッドです。
0176login:Penguin01/11/14 00:22ID:LEvOTgWY
しかし、良く読めば、kernel 2.2 でネットワークの
性能があんまし出てないって話だったのね。

2.4 ではカードによっては zero copy が出来るようになったし、
32bitマシンで64bitDMAのbounce buffer なしのデータのやりとり
とかもできるようになってきてるし、ソフト開発で今更 2.2
がターゲットというのもどうかとおもわれ。
0177login:Penguin01/11/14 00:46ID:IRaPmSaY
> ん〜じゃほとんどI/OせずCPUをガンガン使うタイプのプロセスはあまりCPUを
> 使えなくなるような気がするのだけど。

その通り。UNIX のスケジューラは、どれも基本的には、こうなっているよ。
Linux だってそう。嘘だと思ったらスケジューラのソースを読んでくれ。
ところが、基本的にはそうなっている筈なのに、なぜか CPU intensive な
プロセスが CPU を掴んで離さないことがあるのが変だって話をしてるわけ。
その原因として Linux に sleep priority がない (他の UNIX には、全て
ある) ことを疑っているんだけど、本当にこれが原因なのかどうかは実は
検証したわけじゃないので良く分からない。濡れ衣かもしれない。

あと、今回の件は wake one とか zero copy とか bounce buffer なしとか
は、たぶん関係ないよ。どうしてそう想像できるかは、
・使ったハードは、今どきの Intel CPU に Intel EtherExpress PRO
・CPU intensive なプロセスと I/O intensive なプロセスがそれぞれ 1 つ
ずつでも発生した
・Linux と Solaris や BSD を比べた
・少なくとも直接の原因はスケジューリングにあった
ってことから導けるんだけど、面倒だからこれ以上の説明は省略。
これだけ書いとけば、あとは自分で考えれば分かる筈だからね。
0178login:Penguin 01/11/14 00:47ID:jil2no7j
ちょっと勉強したいのでSolarisのソースコードをMXに載せてくれないかな?
もうソース公開おわっちゃったみたいなので。
UNIX板だと煽られそうだからここの有志に期待。
0179login:Penguin01/11/14 01:02ID:cZfNRmC/
ライセンス違反じゃん
0180login:Penguin01/11/14 01:06ID:jil2no7j
まぁそうかたいこといわずに・・
0181login:Penguin01/11/14 01:45ID:BJD7Ro88
>>177
> その通り。UNIX のスケジューラは、どれも基本的には、こうなっているよ。
> Linux だってそう。嘘だと思ったらスケジューラのソースを読んでくれ。
つーか良いスケジューラかどうかってハナシをしてるんだけど。これでいいの?
0182login:Penguin01/11/14 02:18ID:IRaPmSaY
> つーか良いスケジューラかどうかってハナシをしてるんだけど。これでいいの?

良いからこうなってるんだ YO。
そんなに疑わしいなら、君の考える理想のスケジューリングと、それが既存の
スケジューリング戦略と比べて、どう優れているかを、ここで提案してごらん YO。
0183login:Penguin01/11/14 03:05ID:BJD7Ro88
>>182
> そんなに疑わしいなら、君の考える理想のスケジューリングと、それが既存の
> スケジューリング戦略と比べて、どう優れているかを、ここで提案してごらん YO。

やはりCPUバウンドとI/Oバウンドなプロセスがバランスよく動くことが理想だ
と思うわけ。画像のレンダリングとかをやるならCPUバウンドの方を優先した
方がいい。SVR4なんかはI/Oでなくて「イベント」でプライオリティを増減し
ているらしいけどこういう戦略の方が今っぽくはないかというハナシ。

例えばLinuxのsched.cなんかを読むと以前実行したプロセスとメモリを共有し
ているプロセスの優先度を上げるようになっているけどこういうのは駄目なの?

あと前も言ったけどLinuxのスケジューラは毎秒キューを再計算してないので
(再計算するのは全ての実行可能プロセスがカンタム時間を使いつくした時だ
け)プロセスが多くなると設定しなおす頻度が下がるからレイテンシが下がる
んだろうと思ったんだけど。こういうのも毎秒計算するよりはアリだと思う。

まぁ問題と言えば問題なんだけどそれはスケジューラのクセであって信用に値
するかしないかという問題ではないと思ってるんだけどどう?
0184login:Penguin01/11/14 08:20ID:BJD7Ro88
おはよう
>>177
> その原因として Linux に sleep priority がない (他の UNIX には、全て
> ある) ことを疑っているんだけど、
他のUnixはスリープ優先度でI/O intensiveを実現してるんだけどLinuxの場合は
違う方法でそれを実現しているってのもクセを作ってる一因だと思う。
> あと、今回の件は wake one とか zero copy とか bounce buffer なしとか
> は、たぶん関係ないよ。どうしてそう想像できるかは、
俺も関係ないと思う。つーわけで出勤だよヽ( ´ー`)丿続きはまた今夜。
0185login:Penguin01/11/14 19:55ID:IRaPmSaY
> やはりCPUバウンドとI/Oバウンドなプロセスがバランスよく動くことが理想だ
> と思うわけ。

I/O バウンドなプロセスを優先して動かすと、バランスよく動くようになるん
だよ。I/O バウンドなプログラムは、名前の定義からして CPU はそんなに使
わない、CPU を掴んでもすぐに手放すんだから、優先的に CPU を回してやっ
ても全く何の問題ないんだよ。

> 画像のレンダリングとかをやるならCPUバウンドの方を優先した方がいい。

違うよ。CPU intensive なプロセスを優先すると、正帰還が起きて CPU を消
費しないプロセスには決して CPU が割り当てられないという致命的な状況が
発生するでしょ。対話的なプログラムなんかは、ほとんど入力待ちにいてCPU
を使わないから優先度が下がって、優先度の高い CPU intensive なプロセス
が終了するまで決してスケジュールされないことになる。つまり、ほとんどシ
ングルタスク OS 状態、しかも対話的なプロセスが常に一番後回しにされてし
まうという。そんな OS 決して誰も使わないよ。
もし信じられないなら、p->couter が大きい方を優先する代わりに p->counter
が小さい方を優先するように goodness() を書き換えて試してごらんよ。そん
なことをしなくても、ちょっと考えれば分かる筈だと思うんだが。

> 他のUnixはスリープ優先度でI/O intensiveを実現してるんだけどLinuxの場合は
> 違う方法でそれを実現しているってのもクセを作ってる一因だと思う。

これも違うなあ。I/O intensive なプロセスが優先されるのは、基本的にはそ
ういうプロセスが CPU を使わない (Linux の実装の言葉で言うと、
p->counterの値が大きい) からだよ。これは、Linux 以外の UNIX でも変わら
ない。Linux の異なる点は、他の UNIX が持っているもう一つの仕組み (スリー
プ優先度) を持ってないことであって、Linux 独自の特別な仕組みで I/O バ
ウンドなプログラムを優先させているわけじゃない。

あと、気になっているんだけど、Linux のスケジューラを、4.3BSD のスケジュー
ラに毛が生えたって表現するのは、かなり違うと思うな。ラウンドロビン以外
の優先度クラスがあるって意味では毛が生えているけど、逆に抜けている毛も
大きいと思うよ。ロードアベレージを勘案した decay なんてのは、すっぽり
抜け落ちてるでしょ。
0186login:Penguin01/11/14 21:32ID:BJD7Ro88
>>185
> を使わないから優先度が下がって、優先度の高い CPU intensive なプロセス
> が終了するまで決してスケジュールされないことになる。つまり、ほとんどシ
> ングルタスク OS 状態、しかも対話的なプロセスが常に一番後回しにされてし
> まうという。そんな OS 決して誰も使わないよ。

だからバランスよくと表現したんだけど。LinuxはPC用OSだよ?
DVDとか見るときとかどうするのさ。これってほとんどCPUバウンドなプロセスだよ。
ゲームとかもそうかもね。

こんなもんでいいやと手を打った結果だと思ってるんだけど。

なんでここまで粘着かというとオライリーの「LINUX カーネル」のP330に
「I/Oバウンド型プロセスを優先する仕組は万能ではない」
という節があるから。俺もこれを見て納得してたんだけどそうではないという。
それで混乱しているわけさ。

> もし信じられないなら、p->couter が大きい方を優先する代わりに p->counter
> が小さい方を優先するように goodness() を書き換えて試してごらんよ。そん
> なことをしなくても、ちょっと考えれば分かる筈だと思うんだが。

それって優先度が逆転してるじゃん(笑)

> あと、気になっているんだけど、Linux のスケジューラを、4.3BSD のスケジュー
> ラに毛が生えたって表現するのは、かなり違うと思うな。ラウンドロビン以外
> の優先度クラスがあるって意味では毛が生えているけど、逆に抜けている毛も
> 大きいと思うよ。ロードアベレージを勘案した decay なんてのは、すっぽり
> 抜け落ちてるでしょ。

こういう部分はLinuxの各所に見られるね。アルゴリズムをシンプルにするこ
とによって速く動かそうという感じ。VM とか。その代わり必要だと思ったら
ガンガン詰め込む。スケジューラの件も kernel-ml あたりでプリエンプティ
ブなスケジューラのパッチが流れてきてるんでそのうち入るのではないかな。

そういや君の案件ってリアルタイムプロセスにして動かすという手はなかったの?
0187login:Penguin01/11/14 22:18ID:IRaPmSaY
> だからバランスよくと表現したんだけど。LinuxはPC用OSだよ?
> DVDとか見るときとかどうするのさ。これってほとんどCPUバウンドなプロセスだよ。

それこそ、リアルタイム・スケジューリングを使うべきアプリケーション
じゃないの? 今はカーネルが、どう優先度を自動的に推測すべきかって
話をしているわけでしょ。リアルタイム・スケジューリングの場合、
ユーザーが指定した優先度が固定的に使われるんだから、そもそもそういう
問題は発生しないよ。

> なんでここまで粘着かというとオライリーの「LINUX カーネル」のP330に
> 「I/Oバウンド型プロセスを優先する仕組は万能ではない」
> という節があるから。俺もこれを見て納得してたんだけどそうではないという。
> それで混乱しているわけさ。

え? その記述は正しいよ。
俺は、ベストだとは言ったかもしれないけど、万能だなんて言ってないけどな。
カーネルの行う優先度の推測は、所詮推測に過ぎないんだから、向かない
応用はあるし、だからこそリアルタイム・スケジューリングとかが必要に
なるわけでしょ。
でも、TSS 用の優先度変動型スケジューリング・ポリシーとしては、I/Oバウ
ンド・プロセスを優先させる以外に良いやり方はないと思う。というか、CPU
バウンド型プロセスを優先させたら、取り返しのつかないことになる。

> > もし信じられないなら、p->couter が大きい方を優先する代わりに p->counter
> > が小さい方を優先するように goodness() を書き換えて試してごらんよ。そん
> > なことをしなくても、ちょっと考えれば分かる筈だと思うんだが。
>
> それって優先度が逆転してるじゃん(笑)

そう。君の主張していた、TSS スケジューリングにおいて CPU バウンド型
プロセスを優先させるっていう方針は、つまるところ、そういう意味なわけ。
やっと分かったかな。

> こういう部分はLinuxの各所に見られるね。アルゴリズムをシンプルにするこ
> とによって速く動かそうという感じ。VM とか。その代わり必要だと思ったら
> ガンガン詰め込む。

この、必要だと思ったらってところの判断基準に納得いかない点があるんだよなあ。
今回の応用の場合は作り込みで問題を回避できたけど、一般論としては回避で
きないこともあると思うんだが。

> スケジューラの件も kernel-ml あたりでプリエンプティブなスケジューラ
> のパッチが流れてきてるんでそのうち入るのではないかな。

プリエンプティブ化と この件は、関係ないのでは?

> そういや君の案件ってリアルタイムプロセスにして動かすという手はなかったの?

リアルタイム・プロセスにするにはルート権限いるでしょ。
この特定の問題のためだけに setuid root にするよりは、sched_yield() で
スケジューラの変な挙動を回避する方が、マシな解決策だと判断したわけ。
0188login:Penguin01/11/14 22:43ID:BJD7Ro88
>>187
> それこそ、リアルタイム・スケジューリングを使うべきアプリケーション
> じゃないの?
Unix的にはそうかも知れない。しかしLinuxはそういうプロセスにもCPUを割り振る
ようなスケジューラに*結果的*になっている。だからこの辺でいいんじゃないか
と手を打ったように見えるわけさ。それをクセと書いたわけ。

> この、必要だと思ったらってところの判断基準に納得いかない点があるんだよなあ。
> 今回の応用の場合は作り込みで問題を回避できたけど、一般論としては回避で
> きないこともあると思うんだが。
必要だと思ったらというより必要だと思ってパッチを出せる人がいたらってことかな。
却下されることはあまりないよね。

> > スケジューラの件も kernel-ml あたりでプリエンプティブなスケジューラ
> > のパッチが流れてきてるんでそのうち入るのではないかな。
>
> プリエンプティブ化と この件は、関係ないのでは?
あ。ごめん。>>154 の件。
0189login:Penguin01/11/14 23:16ID:IRaPmSaY
> しかしLinuxはそういうプロセスにもCPUを割り振るようなスケジューラに*
> 結果的*になっている。だからこの辺でいいんじゃないかと手を打ったよう
> に見えるわけさ。

これを、Linux のスケジューラのクセであって許容範囲内であると考えるか、
UNIX 古来の知恵を無視して手を抜いてるから信用できないって考えるかって
違いなんだよなあ。俺は old type、oldtimer だから、よく知られている筈の
知恵が使われてないのをみると、結構ガックリくるのね。
まあ、無視しても何の問題も出ないのなら、そういうのもありなわけだけど、
現実に、こっちとしては手間がかかってるわけだし。

> 却下されることはあまりないよね。

たとえば crashdump と kernel debugger が標準カーネルにいまだに入ってな
いのは、納得いってない。そりゃ Linus が必要としてないのは分かるが、
顧客に対してカーネル保守サービスを提供している場合には要るんだけどなあ。
0190login:Penguin01/11/15 01:29ID:L5cES50v
>そりゃ Linus が必要としてないのは分かるが、
>顧客に対してカーネル保守サービスを提供している場合には要るんだけどなあ

そりは君のお仕事では?
0191login:Penguin01/11/15 02:42ID:mJoL8gKI
>>189
> これを、Linux のスケジューラのクセであって許容範囲内であると考えるか、
> UNIX 古来の知恵を無視して手を抜いてるから信用できないって考えるかって
> 違いなんだよなあ。俺は old type、oldtimer だから、よく知られている筈の
> 知恵が使われてないのをみると、結構ガックリくるのね。
シンプルで高速にってのがLinuxのモットーだしね。VM論争だってRikのロバスト
なVMよりAndreaの高速なVMの方が採用されてしまった。まぁそれもアリだとう思う。
既存のUnix的なものを求めるのならLinuxは向かないのかも知れない。
0192login:Penguin01/11/20 10:07ID:VDFNCHJf
質問です。
Linuxのソースコードの中で読むと勉強になるファイルを紹介してください。
個人的にはlist.h、ghash.hが大変為になりました。
0193login:Penguin 01/12/07 04:50ID:pUngVfZJ
マルチメディア対応ってよく言われるけど、
スケジューラのどこをどう換えればよくなるの?
0194生徒A01/12/07 12:06ID:Gi93BTz7
懐かしいスレageたな.

>193 リアルタイム化ってことでいいんじゃない? 具体的には,
カーネルプリエンティブにして優先度付きスケジューラ(Linuxで
言う優先度とはちょっと違う)を搭載すればマルチメディア対応で
いいのかな.

優先度継承機能とかもいるね.
0195縞栗鼠(シマリス)の親方01/12/07 12:19ID:ohUthW+y
中央高等学院の従業員「西部」が女子トイレに闖入し
汚物入れを物色して女子生徒の使用済みタンポン・ナプキン等を
個人的に収集しているというのは事実。

中央高等学院では
生徒及びその保護者の個人情報を名簿図書館等に売却しています。

中央高等学院
http://www.chuo-school.ac/
http://chs-f.com/index.html 中央高等学院福岡校
0196login:Penguin01/12/11 19:44ID:PbCyuzo0
> 優先度継承機能とかもいるね.

割り込み処理に優先度をつけるのも必要でしょ。
割り込み処理を、優先度付きのスレッド化するってのでもいいけど。
0197login:Penguin01/12/12 20:53ID:VRHOlTvG
『詳細 LINUX カーネル』
買った age 。
0198login:Penguin01/12/12 21:32ID:6ixMAsTN
>>197
ずいぶん前に買ったけど、まだ読んでないや。
細かいけど詳細ではなく詳解です。

#それじゃあLinuxJapan 10月号と同じ間違いだよ。(w
019919701/12/12 21:50ID:VRHOlTvG
>>198
やっちゃった…。 訂正ありがとう。
0200login:Penguin 01/12/13 04:48ID:GDrY1kNC
おれも今同じの読んでる。
これとソースコードをつき合わせてるから、
年内かかりそうなかんじ。
がんばりましょう!
0201login:Penguin01/12/13 07:24ID:nHHZmC7z
本屋に行って実物見ると、禿厚だったのでウトゥ。
あんなのいつ読み終わるやら…。
現在、1章読み終わる!
残りページ見てまたウトゥ。

ま、ゆっくりと行きますか。
がんばりましょう。
0202login:Penguin01/12/13 07:26ID:nHHZmC7z
なんとなく。

『速読ってどう?』
http://ebi.2ch.net/test/read.cgi/rikei/969547091/l50
0203login:Penguin 01/12/13 07:31ID:GDrY1kNC
モノホンのハッカーはソースを読むのが早いね。
もうあっという間に理解してたりする。
あういった技能は本を速読するのとは
また別の能力の気がするよ。
0204login:Penguin01/12/13 17:28ID:3ZNfl0lP
でも『詳細 LINUX カーネル』ってカーネル2.2対応でしょ?
2.4もあまり変わりないの?
0205login:Penguin01/12/13 19:35ID:P41LkMkd
>>204
執筆の時点の安定版カーネルが、 2.2 だったらしい。
でも、初版が 2001 年 7 月だから、本としては
カナーリ新しいんじゃなかろうか。
漏れなんかには違い分からないだろうし…。
0206login:Penguin01/12/13 20:20ID:jXJ+WFgy
大まかな構造とかは同じだろうけど、
詳細な部分が違うだろうから本の趣旨からすると…
0207login:Penguin 01/12/13 20:35ID:GDrY1kNC
>>204
一応各章の最後に2.4.*のことについて書かれてる。
ほんの少しだけど。
>>205
原書は2001/1って書いてある。ってことは発売されたのは去年かな?
>>206
もとのタイトルには詳解なんて言葉はないです。日本のオライソーが
勝手につけた言葉です。

この本の目的はカーネルのソースを読めるようにすること
って書いてあるから、本だけ見て細部を隈なく理解できるように
なると期待するほうが間違ってると思う。
0208login:Penguin 01/12/14 09:22ID:pLOVOTkt
マルチメディア用のIOとは何ですか?
特別にシステムに関数とかを用意したりするんでしょうか?
0209login:Penguin 01/12/24 12:51ID:UsKcZqV7
パラダイムシフトはまだですか?
0210login:Penguin01/12/29 11:32ID:QLo22gE5
デバイスにアクセスするには
/dev以下のノードを介する方法しかないのでしょうか?
よろしくお願いします。
0211login:Penguin01/12/29 12:03ID:mYAbtgDl
>>210
/dev 以下以外にもデバイスファイルは作れます。
man mknod
0212login:Penguin01/12/29 12:19ID:4LQmsDwQ
他のマシンの/devをNFSマウントして、そこの/dev/hdcとかを直接
フォーマットとかしようと思ってmke2fsとかやったら
自分のところのマシンをフォーマットしちゃったわけよ。

デバイスファイルって結局そこにあるメジャー番号とかマイナー番号
とかしか参考にしないわけで、誰のものかなんて考慮してないよね。
(かならず自分のデバイスだと思ってる)

たしかネットワーク経由で他のマシンのデバイスを直接操作する
機能というか仕組みがあったと思うんだけど、なんて名前だっけ?
0213login:Penguin01/12/30 00:17ID:5UM9dPtt
>>210
最近はデバイスファイルでは扱いにくいハードが増えたから
(マルチメディア系・プラグアンドプレイ)
なんで、デバイスファイルじゃなくて、
そのハードを扱うシステムコール作って、
システムコールであつかうのもいいんじゃないかな?
0214login:Penguin01/12/30 00:30ID:vlB/mJ24
ネットナンパ必勝法を格安販売中!


出会いを求める男性へ!!


http://chevy.sites.cc/
0215login:Penguin01/12/30 00:55ID:L5DsFMps
みなさんレスありがとうございます。

>そのハードを扱うシステムコール作って、
>システムコールであつかうのもいいんじゃないかな?

これはカーネルに手をつけるということですよね。
そこまでしなければデバイスファイルを経由しないといけないという事でよろしいのでしょうか?
0216login:Penguin01/12/30 02:50ID:FBPpTPsC
>>212

>他のマシンの/devをNFSマウントして、そこの/dev/hdcとかを直接
>フォーマットとかしようと思ってmke2fsとかやったら
>自分のところのマシンをフォーマットしちゃったわけよ。

最初UNIX Kernelをわかってないなぁって思ったんだけど、でも、確かにネットワーク越しに相手のデバイスファイルを触るという発想はちょっと面白いかも。
Kernel側がどう一貫性を維持しようとするかが問題だけど。
021721201/12/30 03:07ID:UzGpkVqi
>>216
ネットワークブロックデバイス というのがあるみたいッスね。
(ようやく名前がわかったですよ)

カーネル2.2にもあるみたいなんだけど試すのおっかないなぁ
0218login:Penguin02/01/01 12:59ID:fIVu4F/o
カーネル空間とユーザー空間というのは頻繁に交代されているのですか?
また交換するには具体的にどのような過程を通しているのでしょうか?
お願いします。
0219login:Penguin02/01/01 20:33ID:BcEtv31+
しょっちゅう切り替わっているよ。切替えのタイミングは
ハードウェアによる割込み、ソフトウェア割込み (システムコールはこれ)、
モード切替え用の命令、メモリ保護違反、不正な命令の実行、等いろいろ。
まずは JF の
http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel.html
読んで勉強しな。
0220login:Penguin02/01/01 20:57ID:fIVu4F/o
ありがとぅ
0221login:Penguin02/01/05 15:23ID:7OyjHkMf
カーネル初心者です。
以下の本は買う価値あるでしょうか?
実習Linuxカーネル 理論と実習カーネルを効率的に理解するための実習書
出版社名 : ピアソン・エデュケーション
0222login:Penguin02/01/06 03:54ID:Dq18r+Gi
っていうか、お前らLinuxカーネルの解析に役立つツール
カキコしてください。

とりあえず、global
0223login:Penguin02/01/06 03:56ID:I+MzFQ0/
>>222
grep
0224login:Penguin02/01/06 04:06ID:Yl828KDR
>>222
echo, printf
0225login:Penguin02/01/06 04:18ID:OZczuKpf
printk
0226login:Penguin02/01/06 04:51ID:QV/kUS0W
http://www.vogue.is.uec.ac.jp/~koike/papers/bit/vlinda.gif
↑こんな感じでLinuxカーネルを激しいインパクトと共に
表示してくれるツールないのか?
0227TOM02/01/06 05:29ID:VAV/Hk1R
インストール済みのlinuxでwindows同様にIPアドレスとサブネット
マスクを設定したいのですが、どのようにやればいいのでしょうか?
0228TOM02/01/06 05:31ID:VAV/Hk1R
すみません書くところ間違えました(m--m)。
0229global02/01/06 07:29ID:6O0PvUPf
cd /usr/src/linux
gtags
htags
って何時間ぐらいかかりますか?

5時間動かしてて、まだ、終らないんですけど。
0230login:Penguin02/01/07 02:12ID:9E3jZ+kY
っていうか、お前らglobalのオプションカキコしてください。
とりあえず、

htags -aF
-a:英字インデックス
-F:フレーム対応

linux2.4.17、Pen�V733で4時間ぐらいだった気がする。
023122902/01/07 20:12ID:hX8x2Oiv
再挑戦して半日経ちますが、まだgtagsが終りません。
linux2.4.17をPentium3 500でやってます。

よかったら
GPATH
GRTAGS
GSYMS
GTAGS
のサイズ教えてください。
僕のは今のところ
2 MB
92 MB
13 MB
19 MB
で、GSYMSがちょっとづつ増えています。

sortが遅いのかな?(2.0.16)
0232login:Penguin02/01/09 14:16ID:YpXVFRRT
task_struct構造体とproc構造体の違いと役割を教えてください。よろしくお願いします。
0233login:Penguin02/01/11 10:22ID:aBKMHgnQ
ISAボードのデバイスの自動検出ってどうやってやってるんですか?
やっぱり片っ端からチェックしてるだけなんでしょうか?
0234login:Penguin02/01/11 22:24ID:VauQghNo
interfaceでLinuxのデバイスドライバーの特集やってたね。
みんな買って読んでる?
0235login:Penguin02/01/11 22:34ID:OhKVZ3uP
デバドラのデバッグ方法がわかりやすくてベネ
0236login:Penguin02/01/11 22:43ID:J9+ERyxt
>>233
個々のドライバの初期化処理で、ありそうなアドレスを片っ端からチェックしてる。
0237デフォルトの名無しさん02/01/12 21:54ID:Osm3xSog
http://pc.2ch.net/test/read.cgi/os/996204956/27-
0238SsS02/01/13 16:44ID:1HgPfsgv
>234
デバックにprintfk を使うってほんと???
0239login:Penguin02/01/13 17:17ID:ften7Xof
>>238
ほんとう
0240セマフォ02/01/13 22:51ID:byNjLBNZ
セマフォについてわかりやすく実装方法を教えて!
0241デビットカトラー02/01/13 23:12ID:byNjLBNZ
Linux のスケジューラは、どのプロセスを走らせるかを一つのファイルの中で処理しているおもしろいプログラムだから。

といいますが、具体的にどのファイルで処理しているのでしょうか?
0242login:Penguin02/01/13 23:30ID:QSg7wIlW
>>241 SDのインタビュー記事からか?
linux/kernel/sched.o だろ(藁
ソースコードはlinux/kernel/sched.c だな
0243super02/01/14 00:12ID:d6cd8xHD
デバイスドライバを作るということは
open やclose などに対応したデバイス独自の関数を
作成しそれらへの関数ポインタをひとまとめにしたテーブルを
作成するということ
といいますが、
もうすこし、わかりやすく説明してください
0244login:Penguin02/01/14 00:34ID:/7fIIVht
qsort(3)は、第三引数に関数へのポインタをわたすよね。
これは「比較を行う関数」というものをqsort本体からは
抽象化して、実装は別にしているわけだ。

同様に、あるキャラクタディバイスに対してread()やwrite()
を行った際の動作を、カーネルが扱う際に抽象化する為に
関数へのポインタを渡すことで実現している。
0245login:Penguin02/01/14 01:00ID:HmpJulBQ
>>240
semaphoeで検索すれば、いくらでもヒットするんでは?
もしかして、test and set命令とか、そのレベルから
教えてという話?
0246login:Penguin02/01/14 01:24ID:qUNfVGwW
semaphore
0247login:Penguin02/01/14 05:38ID:yv5BYGJ8
>>243
そういうテーブルを作ると、ドライバの親分が
必要に応じて呼び出してくれるんです。
0248super02/01/14 22:10ID:hh4sVRcA
age
0249login:Penguin 02/01/15 21:02ID:blfk2QjY
>242

http://pc1.peanuts.gr.jp/~kei/Kernel-Snapshot/linux/kernel/sched.c

Lion みたいにわかりやすく解説して!
0250login:Penguin02/01/15 21:07ID:blfk2QjY
sched.c は
1269ステップ数あります

みなさん249のページをコピーして
秀丸に貼り付けて下さい!
0251login:Penguin02/01/15 21:08ID:blfk2QjY
98行目
static union {
struct schedule_data {
struct task_struct * curr;
cycles_t last_schedule;
} schedule_data;
char __pad [SMP_CACHE_BYTES];
} aligned_data [NR_CPUS] __cacheline_aligned = { {{&init_task,0}}};

では何をやっているのでしょうか?
0252login:Penguin02/01/15 21:13ID:blfk2QjY
static inline struct task_struct *find_process_by_pid(pid_t pid)

は何を意味していますか?
0253login:Penguin02/01/15 21:43ID:blfk2QjY
あげ
0254名無しさん@お腹いっぱい。 02/01/15 23:02ID:myRSFpvn
>251
具体的にどの部分が分からないのか不明。

currにn番目のプロセッサで実行中のタスクが入る。
unionで__pad入れてるのは、構造体のサイズをcache境界の単位にあわせるため。
__cacheline_aligned は構造体そのものをcache境界に整合した番地に置くため。
NR_CPUS定数はCPUの数。

>252
>find_process_by_pid
関数名そのまんま。PIDからタスク構造体を取得するだけだと思うが。
0255login:Penguin02/01/15 23:06ID:iytjqY0j
>> 251
/*
* We align per-CPU scheduling data on cacheline boundaries,
* to prevent cacheline ping-pong.
*/

>>252
pidが0なら、現在のタスク情報の構造体へのポインタを、
そうでないなら、指定されたpidがしめすタスクの構造体への
ポインタを返してる。
0256login:Penguin02/01/16 00:02ID:NXnK8I7n
sched.c について

Lionsに紹介されている(P94)のsched.c
とLinuxのSched.cとは全然違うように思います

これはLinuxが独自の仕様ということでしょうか?

Bach本でスケジューリングのアルゴリズムを説明しているソース
はLion本に近いソースで説明しているのですが
0257login:Penguin02/01/16 00:03ID:NXnK8I7n
unionで__pad入れてるのは、構造体のサイズをcache境界の単位に
あわせるため

もう少し詳しく!
0258名無しさん@お腹いっぱい。 02/01/16 00:13ID:MlDa/kr2
>>257
http://lse.sourceforge.net/counters/statctr.html
#Statistics Counter Maintenance
のところに詳しく書かれてる。
0259login:Penguin02/01/16 00:15ID:lZaXRnQU
>>257
cacheの問題だっていってるんだから、そこに因われることは
無いと思われ。
「あー、高速化の為に、unionつかってイイ感じにやってんのねー」で
十分じゃねーの?
0260login:Penguin02/01/16 00:38ID:NXnK8I7n
smpって言葉がでてるけど、mp環境だから
256のいうように、ソースが複雑になっていると
いうことでしょうか?

ちなみにSCHED.C ってlINUXの中ではわかりずらいソースなのでしょうか?
0261名無しさん@お腹いっぱい。 02/01/16 00:58ID:MlDa/kr2
__padによるCache単位(キャッシュライン)への整合はMP環境で大きな意味を持つ。
つまり、キャッシュラインに対して構造体1つがピッタリはまっていれば
その構造体以外のアクセスで、その構造体があるキャッシュラインがフラッシュされることがなくなる。
もし、構造体のサイズ!=キャッシュラインサイズであれば、
あるプロセッサによって無関係のデータの読み込みが行われた場合でも
他のプロセッサ全てのキャッシュラインの更新が行われてしまう可能性がある。
そしてメモリアクセスが増えて性能が落ちる。わずかだけど。

キャッシュラインのイメージ図(*が構造体の部分 Xが無関係のデータ)
(1). [**********][XXXX] <-構造体のサイズ!=キャッシュラインサイズの場合
(2). [****************] <-構造体のサイズ==キャッシュラインサイズの場合
(1)の場合は無関係のデータにアクセスされてもそのキャッシュラインがフラッシュされてしまうので無駄。
(2)の場合は構造体にアクセスする場合だけそのキャッシュラインがフラッシュされるので効率がいい。

       ∧_∧
       ( ´Д`)  <わかったかな?
      /    \ 
   _  | |  ∬ | |_..∬
  |\ ̄ ̄ ̄旦 ̄ ̄ 旦.\
 ./..\\          \  
/   \|================| 
\    ノ             \
  \                .\
    \               ..\_
      """"""""""""""""""″″′
0262login:Penguin02/01/16 01:09ID:DfshrX4d
>261
thank you
0263Be名無しさん02/01/16 22:11ID:NXnK8I7n
あげあげ
0264Be名無しさん02/01/16 22:31ID:NXnK8I7n
static inline int goodness(struct task_struct * p, int this_cpu, struct mm_struct *this_mm)
{
int weight;

/*
* select the current process after every other
* runnable process, but before the idle thread.
* Also, dont trigger a counter recalculation.
*/
weight = -1;
if (p->policy & SCHED_YIELD)
goto out;

/*
* Non-RT process - normal case first.
*/
if (p->policy == SCHED_OTHER) {
/*
* Give the process a first-approximation goodness value
* according to the number of clock-ticks it has left.
*
* Don't do any other calculations if the time slice is
* over..
*/
weight = p->counter;
if (!weight)
goto out;

#ifdef CONFIG_SMP
/* Give a largish advantage to the same processor... */
/* (this is equivalent to penalizing other processors) */
if (p->processor == this_cpu)
weight += PROC_CHANGE_PENALTY;
#endif

/* .. and a slight advantage to the current MM */
if (p->mm == this_mm || !p->mm)
weight += 1;
weight += 20 - p->nice;
goto out;
}

/*
* Realtime process, select the first one on the
* runqueue (taking priorities within processes
* into account).
*/
weight = 1000 + p->rt_priority;
out:
return weight;
}


なにをやっているか解説して下さい

140行目からです
sched.c
0265Be名無しさん02/01/16 23:00ID:NXnK8I7n
struct mm_struct {
int count;
pgd_t * pgd;
unsigned long context;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack, start_mmap;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
struct vm_area_struct * mmap;
struct vm_area_struct * mmap_avl;
struct semaphore mmap_sem;
};

構造体の中に構造体がある場合はどう理解すればいいのでしょうか?

sched.h
http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-15.html
0266もなー君@お腹いっぱい。 02/01/16 23:37ID:MlDa/kr2
>264
goodnessは、指定されたタスクが実行し続けるにふさわしいか判断するための関数。
戻り値が大きいほど「実行しつづけた方がいいよ」という意味になる。

この関数だけ見てもしょうがないので全体的に説明すると。
#RTプロセス周りは省略

> weight = p->counter;
このcounterは可変優先度式スケジューラの動的優先度に相当する。
動的優先度については>171あたりを参照。

>#ifdef CONFIG_SMP
> (省略)
> if (p->processor == this_cpu)
> weight += PROC_CHANGE_PENALTY;
>#endif
プロセッサはそれぞれにcacheとTLBを持っているため、
1つのタスクがいくつものプロセッサにまたがって実行されると性能が低下してしまう。
従って、「なるべく同じプロセッサ上で実行し続けた方がいいよ」という意味。

>if (p->mm == this_mm || !p->mm)
> weight += 1;
これも同様に、別のメモリ空間(ページテーブル)に切り替えるとTLBが無駄になってしまうから
「なるべく切り替えない方がいいよ」という意味。

       ∧_∧
       ( ´Д`)  <PROC_CHANGE_PENALTYとかの値は推測的に決められているから
      /    \  <どれほど性能が改善されるのかをLinus君に問いたい、問い詰めたい、
   _  | |  ∬ | |_..∬ <小一時間ほど問い詰めたいところではある。
  |\ ̄ ̄ ̄旦 ̄ ̄ 旦.\
 ./..\\          \ 
/   \|================|
\    ノ             \
  \                .\
    \               ..\_
      """"""""""""""""""″″′
0267あげあげ02/01/17 13:09ID:fKwmqdxC
>266

Thank You
0268login:Penguin02/01/17 20:28ID:P7SYmdjd
Linuxカーネル2.5.2がUSB 2.0をサポート
http://www.zdnet.co.jp/news/0201/17/e_usb.html
...カーネル2.5.2には,OSの重要な部分となる「スケジューラ」も実装されている。

ワロタ
0269名無しさん@XEmacs02/01/17 22:57ID:MexfPvJZ
実際に使っているけど、結構いい感じ。
気に入った。
0270Be名無しさん02/01/18 23:07ID:SjcLc3oq
>linux/kernel/sched.o だろ(藁
>ソースコードはlinux/kernel/sched.c だな

自分で,sched.c を一部書き換えて、sched.o を作って
linux/kernel/sched.o と置き換えてもうまく動作しますか?

ソースを一部書き換えて、それをリナックスでコンパイル
させる方法教えて下さい。
例えば、sched.c
0271login:Penguin02/01/18 23:11ID:SjcLc3oq
C勉強中です

http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-5.html#ss5.5

にある図表(4.2) プロセスの仮想メモリ
は構造体が二つネストして、task struct から3階層目で
実際のメモリにアクセスしていると考えればいいのでしょうか?

struct
(struct
(struct
ってかんじですか?
027227002/01/18 23:21ID:SjcLc3oq
例えば
sched.c の
http://pc1.peanuts.gr.jp/~kei/Kernel-Snapshot/linux/kernel/sched.c
1157行目
if (xtime.tv_usec >= 1000000) {
を
if (xtime.tv_usec >= 900000) {

に変更して、これをLinuxに組み込みたいときは具体的に
どういう手続きでできますか?

0273名無しさん@Emacs02/01/18 23:51ID:YW/sCNj0
>>272
1. time.c を編集
2. /usr/src/linux あたりで make vmlinux
でダメかい?

027427002/01/19 00:44ID:jiC3xKcw
>273

sched.cを編集したので、sched.c をコンパイルして
sched.o をつくってと言う流れにはならないのでしょうか?
0275名無しさん@Emacs02/01/19 00:58ID:qDPmIUv5
>>274
sched.c編集後に kernel/
でmakeって打ったらどうなる?
0276 02/01/19 03:29ID:EPNncPjO
親切な分厚い本が何冊かでているから、それを読んで勉強
するのがもっとも効率がよいぞ。それでも判らないところは
メーリングリストや掲示板で尋ねなさい。
■ このスレッドは過去ログ倉庫に格納されています