SSブログ

プロセス間の切替動作を調べてみた [Raspberry Pi]

(2013.09.05)
JAVAからBCM2835ライブラリを呼び出すプログラムで、プロセス間の切替が思うようにいかない件について調べてみました。

<テスト・プログラム>
char test_buff[64];
char n_buff[] = "0123456789";

void test_func(int loop, char c)
{
    test_buff[0]= c;
    test_buff[1]= n_buff[loop];
    test_buff[2]=' ';
    test_buff[3]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));
    usleep(0);
}

void do_child( char *args )
{
    test_buff[0]= 'C';
    test_buff[1]=' ';
    test_buff[2]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));

//    usleep(0);  <== これと
    for(loop=0;loop<5;loop++)
    {
        test_func(loop,'C');
    }
}

void do_parent( char *args )
{
    child = fork();
    if( child < 0 )
    {
       printf("we can't create child\n");
    }
    else if( child == 0 )
    {
        do_child(args);
        exit(0);
    }

    test_buff[0]= 'P';
    test_buff[1]=' ';
    test_buff[2]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));

    usleep(0);    <== これを変えてみた
    for(loop=0;loop<5;loop++)
    {
        test_func(loop,'P');
    }
    sleep(1);
    w_buff->buff[w_buff->wp] = '\0';
    printf("result\n%s\n",w_buff->buff);
}

上に示したテスト・プログラムでusleep(0)を入れた場合と、コメント・アウトした場合で結果は次のようになりました。

P: usleep (Parent側だけusleepが入る場合)
result
P C C0 P0 C1 P1 C2 P2 C3 P3 C4 P4

P&C: usleep (どちらにもusleepが入る場合)
result
P C P0 C0 P1 C1 P2 C2 P3 C3 P4 C4

P&C: not usleep (どちらにもusleepが入らない場合)
result
P P0 C C0 P1 P2 C1 P3 C2 P4 C3 C4

ここまでの結果は、usleep(0)によって実行プロセスが切り替わったことを示しています。ところが・・・

C: usleep (Child側だけusleepが入る場合)
result
P P0 P1 P2 C P3 P4 C0 C1 C2 C3 C4  <== ???

これはいったいどういうことでしょうか?
P0->P1間あるいはP1->P2間に呼び出したusleep(0)では何も起きず、P2->P3間に呼び出したusleep(0)で漸くChildプロセスに切り替わっています。
”P P0 C P1 C0 P2 C1 P3 C2 P4 C3 C4”にならないのは何故でしょうか?

謎です。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。