ひらちゃんの日記 2007年5月号

1999年5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2000年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2001年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2002年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2003年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2004年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2005年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2006年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2007年1月号 | 2月はサボり | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 10月号 | 11月号 | 12月号
2008年1月号 | 2月号 | 3月号 | 4月号 | 5月号 | 6月号 | 7月号 | 8月号 | 9月号 | 10月号 | 11月号 | 12月号
2009年1月号 | 2月号 | 4月号 | 5月号 | 8月号 | 9月号 | 11月号 | 12月号
2010年1月号 | 2月号 | 3月号 | 5月号 | 6月号 | 8月号 | 9月号 | 10月号 | 12月号
2011年1月号 | 3月号 | 4月号 | 8月号
ひらちゃんのホーム | 感想はこちら
★つっこみ、質問、意見、ちょっとした感想など、「つっこむ」ボタンでつっこんでね。

Counter
5/13(日)
DSCF0134.JPG
★タイフェスティバル
今日はタイフェスティバルに行ってみた。 ちょっと人多すぎであった。 昨年は雨でも降っていたのだろうか、タイが人気になったのだろうか。 とにかく人多すぎ・・・。
名前


5/1(火)
★マルチスレッドにはまる。
ただの理解不足だとも言うが、今日は、マルチスレッドにはまった。 まずは、Pythonでマルチスレッドのプログラムを書いていたのだが、threadを多く生成すると、やたらと仮想メモリを使う。 1個のthreadで10M近く使っているようで、200個程作るとあっという間に、2Gの壁にぶつかってしまうのだ。 一体誰がこんなに無駄なメモリを使うのか、ということで、
import threading
import time

class T(threading.Thread):
    def run(self):
        time.sleep(10)

def main():
    ts = []
    for i in xrange(100):
        t = T()
        t.start()
        ts.append(t)

    for t in ts:
        t.join()

if __name__ == r"__main__":
    main()
というような、超シンプルな物を作ってみた。 しかし、ダメであった。 仮想メモリを808Mも消費している。

Pythonのthreadは使えないのか、ということで、Cで試してみた。

#include <stdio.h>
#include <pthread.h>

void mysleep()
{
    sleep(10);
}

main()
{
    pthread_t thread[100];
    int i;
    int ret;

    for (i = 0; i < 100; i++) {
        pthread_create(&thread[i], 0,
                        (void *)&mysleep, NULL);
    }

    for (i = 0; i < 100; i++) {
        pthread_join(thread[i], NULL);
    }
    sleep(15);
}
しかし、これもダメであった。 801Mも消費している。 Pythonは悪くなかった。 どちらも、800M位になるので、thread 1つあたり8Mという数値に何か秘密がありそうだ。

で、いろいろ、調べてみると、この8Mというのは、stackのサイズであることが判明した。

% limit stacksize
stacksize    8192 kbytes
ということで、limit (bashの人はulimit)でstacksizeを小さくして実行すると、それにあわせて小さくなった。 (あまり小さくすると、core吐いたけど・・・。)

ということで、threadを大量にあげるときはstackを小さくしましょう。 合ってる?!

名前
・200コもスレッドを作るやつがいるとは思ってなかったんじゃろね [2007/5/3 00:01:39] (by 百舌鳥)
・お久しぶりです。Cでスレッド利用できるなんて知りませんでした(汗 [2007/5/5 01:48:24] (by ごーぎゃん)
・おー、百舌鳥さんごぶさたです。こんな話に反応するとは全くマニアックになりましたねぇ。^^ サーバのデーモンなので大量にあげたかったんですねぇ。 [2007/5/5 04:12:47] (by ひらちゃん)
・おー、ごーぎゃんもごぶさたです。Cでもスレッド出来ますよ。気を付けないと標準ライブラリがスレッドセーフじゃなかったりするのがあるけどね。 [2007/5/5 04:14:27] (by ひらちゃん)


homeひらちゃんのホーム
ひらの yo@hirano.cc