[Armadillo:08476] Re: armadillo440でのμsleep実行時の精度について

h.kondo email@hidden
2012年 12月 19日 (水) 15:50:38 JST


竹之下様
古賀様

情報のご提供ありがとうございます。

nanosleep()、μsleep()、sleep()と試してみて、
nanosleep()とμsleep()では同じような挙動に見え、
sleep()の場合だけ異なる挙動に見えたもので、
質問させていただきました。

ただ、sleep()は1秒単位の指定となるため異なるように
見えたのかもしれません。

High Resolution Timerを使っていても、結局は、HZの値に依存し、
デフォルト値(10ms)で使用していると、10ms単位でしかスリープが
できないということでしょうか。現状はデフォルト値です。

nanosleep()、μsleep()を使用して1秒のスリープを試してみます。

占有率は、ご推察の通り「プロセス・トレース」機能を使用しています。
また、独自のユーザランドを使用し、1つのテストプログラムのみ起動して
以下のような処理を実装し計測しています。

テストプログラム起動後の処理
while(1){ usleep(100*1000); }

以上です。


-----Original Message----- 
From: Shin-ya Koga
Sent: Wednesday, December 19, 2012 2:13 PM
To: email@hidden
Subject: [Armadillo:08475] Re: armadillo440でのμsleep実行時の精度について

サムシングプレシャスの古賀です。

# アットマークテクノの竹之下さんからも、「usleep() じゃ
# なくて nanosleep() を使ってみては」というフォローが
# 入りましたので、一部重複する内容ですが、出します。

近藤さん([Armadillo:08473]):
>ちょっと調べたのですが、μsleep()は、sleep()と違い、
>「プロセスの実行を遅延する」ようですが、
>これは「休止状態」となるのではなく、「実行状態」のままで
>いるということなのでしょうか。
>μsleep()を実行しても、タイムスライスの割り当て時間分は
>そのプロセスが占有することになるのでしょうか。

usleep() と sleep() も、[Armadillo:08469] で紹介した
ページに書かれているように、libc で実装されているライブラリ
関数です:
http://d.hatena.ne.jp/naoya/20080122/1200960926

Armadillo-400 シリーズの Linux のユーザランドでは、マニュア
ルによれば、デフォルトでは libc として glibc を使います:
http://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_software_manual_ja-1.1.0/ch06.html

で、Armadillo-400 シリーズのユーザランド(atmark-dist)に
入っている glibc のソースを見ると、上のページにある通り、
usleep() も sleep() も、どちらも Linux カーネルのシステム
コールである nanosleep() を呼び出す実装となっています:
atmark-dist-20121023/glibc/sysdeps/unix/sysv/linux/
sleep.c
usleep.c

ですので、usleep() と sleep() で、それを呼び出したスレッド
の扱いが違うということは、ないと思われます。Linux カーネル
のスケジューラの動作については、以下のページが参考になるで
しょう:
http://sourceforge.jp/projects/linux-kernel-docs/wiki/1.6%E3%80%80プロ
セススケジューラの実装
http://www.makelinux.net/books/lkd2/ch04lev1sec2

>「アプリケーションデバッガ」は、
>Armadilloに添付されている評価版のC-Sharkです。
…
>上記の通りだとすると、何となく合点がいきそうな気がしますが、
>その場合、msオーダー単位でプロセスを休止状態にすることは
>できないのでしょうか。sleep()は秒単位のようですので。

ms 単位での待ち動作には、nanosleep() を使うのが常道のようです。
usleep() の man ページにも、nanosleep() の使用を推奨する旨が
書かれています:
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/usleep.3.html
http://linux.die.net/man/3/usleep

僕は C-Shark を使ったことがないので、詳細が分からないのですが、
コンピューテックス社のサイトにある製品紹介ページを見ると、
「プロセス・トレース」機能を使って、テストプログラムの CPU 占
有率を見ていらっしゃるのでしょうか。
http://www.computex.co.jp/products/c_shark/index.htm

・・・もしかすると、トレース対象から、テストプログラム以外の
プロセスが外れてしまっていて、そのために、テストプログラムの
プロセスから他の(アイドルプロセス以外の)プロセスへの遷移が
捕獲されず、結果として、アイドルプロセスへの遷移のみが記録さ
れたために実際とは違うように見えている、ということがあったりは、
しませんよね。

ちなみに、この観測に使っていらっしゃる Linux は、Armadillo-400
シリーズ標準のユーザランドでしょうか?それとも、テストプログ
ラムしか入っていない、独自のユーザランドなんでしょうか。標準の
ユーザランドであれば、テストプログラムのプロセスとアイドルプロ
セス以外のプロセスが全く動作していないように見えるのは、少し不
思議だなと思った次第です。

--
古賀信哉 (株)サムシングプレシャス

_______________________________________________
armadillo mailing list
email@hidden
http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo





armadillo メーリングリストの案内