プロセス間の切替動作を調べてみた [Raspberry Pi]
(2013.09.05)
JAVAからBCM2835ライブラリを呼び出すプログラムで、プロセス間の切替が思うようにいかない件について調べてみました。
上に示したテスト・プログラムで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”にならないのは何故でしょうか?
謎です。
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”にならないのは何故でしょうか?
謎です。
|
|
|
コメント 0