質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

581閲覧

SLABアロケータについて

curl

総合スコア19

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2019/03/17 10:39

編集2019/03/27 03:28

お世話になります。

※質問内容を修正いたしました。

linuxのメモリ管理について調べていたら
PageSize未満のメモリ割当はSLABアロケータが管理するという情報をみつけました。

また、下記のサイトをみたところ、
プロセスがpage size(4KB)未満のメモリーを要求した際には、Buddyシステムから
4KBの領域が払い出されて、次にslabアロケータがBuddyシステムが確保した4KBを
細かくして必要な分だけをプロセスにわたすのかなと思いました。

上記の認識で間違いがないか教えて頂けると助かります。

参考にさせて頂いたサイト
>https://qiita.com/atsisy/items/05b47056c0c057f05d79

以上、よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2019/03/20 06:26

調べるにあたって参考にした資料を明記してください。書籍なら著者名、標題、出版社名です。ウェブサイトならURLです。
curl

2019/03/26 16:17 編集

ikedas様 ご返信が遅くなり失礼しました。 https://qiita.com/atsisy/items/05b47056c0c057f05d79 > ユーザランドのmallocやfreeのような関数がカーネル内に存在していて、それを提供するのがスラブアロケータです。カーネル空間でのmalloc, freeはそれぞれkmalloc, kfreeと呼ばれています。 上記記事を見て、SLABアロケータはkernel空間プロセスでmallocがユーザー領域なのかと思いました。 自分の方で再度色々調べたところ、下記の様なことなのかと思っています。 kernel空間プロセス、ユーザプロセスに関係なく、 4K(page size)未満のメモリーをプロセスが欲した時は、BuddySystemで いったん4Kを確保して、さらにslabアロケータが4Kを分割してプロセスに渡す。 ただ、slabアロケータを呼び出すのがkernel側の仕事というだけなのかと思っています。 間違っていたらご指摘頂けるとありがたいです。 ※質問内容がざっくりで申し訳ございませんでした。
ikedas

2019/03/26 21:29

質問文を編集して追記いただけますか。この欄に書いてもかくれてしまってほかの人が気づきません。
guest

回答1

0

ベストアンサー

まず、「カーネル空間プロセス」というものはありません。カーネルはオペレーティングシステムが起動したときからずっとメモリ上にいて、シャットダウンまで終了しません。カーネルの外の、プロセスが起動したり終了したりしている部分を比喩的に「ユーザランド」などと呼びます (「ユーザ空間」でもいいです)。

で、ご提示の資料にはこう書いてあります。

ユーザランドのmallocやfreeのような関数がカーネル内に存在していて、それを提供するのがスラブアロケータです。カーネル空間でのmalloc, freeはそれぞれkmalloc, kfreeと呼ばれています。

スラブアロケータが用いられるのはカーネル内でのメモリ確保・解放のときだけです。カーネルのソースコードの中では、上の通りkmalloc, kfreeというCの関数として表されます。これらはカーネルの中でのみ呼び出されます。

いっぽう、これも上の通り、ユーザランドではプロセスの中でメモリ確保・解放のときにmalloc, freeというCの関数が呼び出されています。これらはCの標準ライブラリ (glibcなど) の中に含まれていて、プログラムをソースコードからコンパイルしたときにこのライブラリがリンクされるため、使えるようになります。

kmalloc, kfreeもmalloc, freeも、バディシステムからメモリブロック (最低でも4 kB) を割り当ててもらい、それを必要に応じて細かく分けて使用します。まったく必要なくなったブロックはバディシステムに返します。

カーネルとユーザランドで別の関数を使っている理由ですが、第一にカーネル空間のメモリ領域をユーザランドから完全に切り離したいということがあります。これによって、プロセスがカーネルの動作に干渉しようとしてもできなくなるので、オペレーティングシステムの安全性が保てます。第二にはカーネルとユーザランドのプロセスではメモリの使い方が違うため、それぞれの用途に合ったメモリ割り当て・解放のアルゴリズムを適用したいということがあります。

独自に実装したスラブアロケータをカーネルに組み込めるのと同様に、malloc, freeに代わるプログラム独自の関数を実装してそのプログラムのプロセス中で用いることもできます。かつてC標準ライブラリのmalloc, freeのアルゴリズムが洗練されていなかったときは、メモリの効率的な利用が性能に影響しやすいプログラムでそのような実装がよくされました。

投稿2019/03/27 10:14

編集2019/03/28 04:02
ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

curl

2019/03/28 08:41

詳細で分かりやすいご説明ありがとうございます。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問