freeのshared

freeとかしてみるとsharedが0になっている。

$ free
             total       used       free     shared    buffers     cached
Mem:       3884436    3371444     512992          0       3492    1434784
-/+ buffers/cache:    1933168    1951268
Swap:      5000188          0    5000188

free(1)を見ても"The shared memory column should be ignored; it is obsolete."と書いてあるし、0固定なんでしょう。でも、なんで0なんでしょう。

freeはprocpsというパッケージのコマンドで proc/sysinfo.cの部分が値を取得するコードになっている。これは /proc/meminfo から情報を読んでいる。 sharedに対応する部分は "MemShared" というところだったのだけれど、これはすでに削除されている。

これよりも前のカーネルでも長い間 "MemShared"は表示されていても、0に固定されていた。

なぜかというと、sharedを計算するのはコストが高いから、だそーだ。

linux-2.3.12以前だとこんな感じでsharedramを計算している。

void si_meminfo(struct sysinfo *val)
{
        int i;

        i = max_mapnr;
        val->totalram = 0;
        val->sharedram = 0;
        val->freeram = nr_free_pages << PAGE_SHIFT;
        val->bufferram = atomic_read(&buffermem);
        while (i-- > 0)  {
                if (PageReserved(mem_map+i))
                        continue;
                val->totalram++;
                if (!page_count(mem_map+i))
                        continue;
                val->sharedram += page_count(mem_map+i) - 1;
        }
        val->totalram <<= PAGE_SHIFT;
        val->sharedram <<= PAGE_SHIFT;
        return;
}

ようするに、全てのメモリをいちいちなめてsharedを計算している これがlinux-2.3.13だと

void si_meminfo(struct sysinfo *val)
{
        val->totalram = totalram;
        val->sharedram = 0;
        val->freeram = nr_free_pages << PAGE_SHIFT;
        val->bufferram = atomic_read(&buffermem);
        return;
}

このように0固定されている。

3GBのメモリつんでたら、971109回ループがまわることになるし、より大きなシステムだともっと大変なことになってしまうだろう。


ちなみに、当時 これ聞かれまくったのかFAQにものってる http://www.tux.org/lkml/#s14-3