Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B;~9o$H;~4V$N4IM}(B
2011$BG/(B02$B7n(B22$BF|(B
$B>pJs2J3XN`(B $B%*%Z%l!<%F%#%s%0%7%9%F%`(B II
$BC^GHBg3X(B $B%7%9%F%`>pJs9)3X8&5f2J(B
$B%3%s%T%e!<%?%5%$%(%s%9@l96(B, $BEE;R!&>pJs9)3X7O(B
$B?7>k(B $BLw(B
<yas@is.tsukuba.ac.jp>
$B$3$N%Z!<%8$O!"
http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-02-22
$B$"$k$$$O!"
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
$B;n83$K$D$$$F(B
- $B;n83$O!"(B3$B7n(B8$BF|(B($B2P(B)$B!#9V5A$HF1$8;~4V!&65<<$G9T$&!#(B
- $B$N;qNA$r;}$A9~$s$G$b$h$$!#(B
- $B%3%s%T%e!<%?!"7HBSEEOCEy$NDL?.5!4o$OMxMQ$7$F$O$$$1$J$$!#(B
- $B;n83$K2rEz$9$k;~$K$O!"LdBjJ8$r$h$/FI$_!"$=$l$K=>$C$FEz$($k$3$H!#;q(B
$BNA$NJ8=q$r%3%T!
$B7g@J$7$?;~$N%/%$%:$N2sEz$r!"%l%]!<%H$7$F$B"#:#F|$NBg;v$JOC(B
- $B%b%N%H%K%C%/;~9o$N9M$(J}(B
- jiffies $B$H(B HZ
- PIT$B$N@_Dj(B
- $B;~4V@Z$l=hM}$NJ}K!(B
- $BCY1d=hM}$NJ}K!(B
- $B%7%9%F%`!&%3!<%k(B
- $B%+%l%s%@;~9o$NDs6!(B: gettimeofday(), settimeofday(),
time(), adjtime()$B!#@_Dj2DG=!#(B
- $B%b%N%H%K%C%/;~9o(B(monotonic time)$B$NDs6!(B:
$B7h$7$F8eLa$j$9$k$3$H$,$J$$!#(Bclock_gettime() $B$G;H$($k!#(B
- $B%$%s%?!<%P%k%?%$%^(B: setitimer(), sigaction().
- $B;~4V@Z$l(B: select(), poll(), sleep(), usleep()
- $B%+!<%M%kFb$N;E;v(B
- $B%7%9%F%`!&%3!<%k$N $B%W%m%;%9$N%"%+%&%s%F%#%s%0!#%9%1%8%e!<%j%s%0!#(B
- $B;~4V@Z$l=hM}!#%b%N%H%K%C%/;~9o(B(monotonic time)$B$G;XDj$9$k$3$H$,IaDL!#(B
$B%+%l%s%@;~9o$,;H$($k$3$H$b$"$k!#C10L$O!"IC!J%J%NIC!K$N$3$H$b$"$k$,!"<~(B
$B4|E*$J%?%$%^3d$j9~$_$N4V3V(B(tick)$B$N$3$H$b$"$k!#(B
gettimeofday() $B$O!"&L(B($B%^%$%/%m(B)$BICC10L$N;~9o$r07$&!#(B
struct timeval {
long tv_sec; /* seconds since Jan. 1, 1970 */
long tv_usec; /* and microseconds */
};
int gettimeofday(struct timeval *tp, struct timezone *tzp);
int settimeofday(const struct timeval *tp, const struct timezone *tzp);
$B;H$$J}(B
struct timeval tv;
gettimeofday(&tv, NULL);
POSIX 1003.1, 2003 $B$N(B
struct timespec
$B$G$O!"%J%NICC10L!#(B
struct timespec {
time_t tv_sec; /* Seconds. */
long int tv_nsec; /* Nanoseconds. */
};
int clock_settime(clockid_t clock_id, const struct timespec *tp);
int clock_gettime(clockid_t clock_id, struct timespec *tp);
int clock_getres(clockid_t clock_id, struct timespec *res);
$B%+%l%s%@;~9o$O!"JQ99$G$-$k!#5UAv$5$;$k$3$H$b2DG=!#(B
$B=gJ}8~$N%8%c%s%W$d5UAv$rHr$1$F!"%+%l%s%@;~9o$r9g$o$;$k$K$O!"(Badjtime()
$B$r;H$&!#(B
int adjtime(const struct timeval *delta, struct timeval *olddelta);
- $B30It$N;~9o%5!<%P$+$i;~9o$rF@$k!#(B
- $B<+J,<+?H$N;~9o$,CY$l$F$$$?;~(B:
adjtime() $B$G?J$_J}$N%Z!<%9$r>e$2$k!#(B
- $B<+J,<+?H$N;~9o$,?J$_$9$.$F$$$?;~(B:
adjtime() $B$G?J$_J}$N%Z!<%9$r2<$2$k!#(B
$BDj4|E*$J;E;v$r$7$?$$;~$K;H$&(B
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
int setitimer(int which, const struct itimerval *value,
struct itimerval *ovalue);
- $B$^$:!"(Bit_value $B$G;XDj$5$l$?;~4V$,7P$D$H!"%7%0%J%k$,DLCN$5$l$k!#(B
- $B0J8e!"(Bit_interval $BKh$K%7%0%J%k$,DLCN$5$l$k!#(B
$B
- $BFbIt$K%+%&%s%H%@%&%s$7$F$$$/JQ?t$,$"$k!#(B
- $B=i4|CM$H$7$F!"(Bit_value $B$r@_Dj$9$k!#(B
- $BJQ?t$,(B 0 $B$K$J$k$H!"%7%0%J%k$,DLCN$5$l$k!#(B
- $BJQ?t$NCM$r!"(Bit_interval $B$K@_Dj$9$k!#(B
- 3. $B$r!"2r=|$5$l$k$^$G7+$jJV$9!#(B
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
$B%M%C%H%o!<%/!&%W%m%0%i%`$G$h$/;H$&!#J#?t$NF~NO$r4F;k$9$k!#;XDj$5$l$?;~(B
$B4V!"F~NO$,$J$1$l$P!"%7%9%F%`!&%3!<%k$+$iI|5"$9$k!#(B
$B$J$K$b$7$J$$;~4V@Z$l!#(B
unsigned int sleep(unsigned int seconds);
int usleep(useconds_t usec)
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
$B%3%s%T%e!<%?$K$h$C$F0c$&!#$3$3$G$O!"(BPC/AT $B$NOC!#(B
$B%O!<%I%&%'%"$O!"4JC1!#H/?64o$H%+%&%s%H%@%&%s$9$k%+%&%s%?$r;H$&!#(B

$B?^(B? $B%?%$%^4XO"$N%O!<%I%&%'%"$N4pK\%b%G%k(B
- $BH/?64o$O!"0lDj$N<~GH?t$G%+%&%s%?$K?.9f$rAw$k!#(B
- $BH/?64o$N<~GH?t$O!"%=%U%H%&%'%"$G@_Dj2DG=$J>l9g$,$"$k!#(B
- $B%+%&%s%?$O!"%=%U%H%&%'%"$GFI$_=q$-$G$-$k!#(B
- $B%+%&%s%?$O!"#0$K$J$C$?$i!"?.9f$r@8@.$9$k!#$=$l$K$h$j!"(B
CPU $B$K3d9~$_$,$+$+$k!#(B
- $B%+%&%s%?$N%b!<%I$,0l2s@Z$j(B(one shot mode)$B$J$i!"$3$l$G=*$o$j!#(B
- $B%+%&%s%?$N%b!<%I$,Dj4|E*(B(periodic mode)$B$J$i!"JL$N%l%8%9%?$+$iCM$r(B
$B:F@_Dj$9$k!#(B
$B%+%&%s%H%@%&%s$G$O$J$/%+%&%s%H%"%C%W$9$k$b$N$b$"$k!#(B
$B8E$$%?%$%^!&%G%P%$%9!#(B
- $BH/?64o$N<~GH?t$O!"(B 1193182Hz$B!#(B
NTSC $B?.9f$N(B 1/3$B!#Ev;~!" $B%+%&%s%?!":F@_DjMQ$N%l%8%9%?$O!"(B16$B%S%C%H!#(B
- PIT $B%G%P%$%9$O!"(B3 $B$D$N%?%$%^$r;}$D!#(B
- 0: $B3d9~$_@8@.2DG=!#(BOS$B$N;~4V4IM}$KE,$9$k!#(B
- 1: Dynamic RAM $B$N%j%U%l%C%7%e!#(B
- 2: $B%9%T!<%+!<$N%H!<%s@8@.(B
$BEE8;%*%U;~$K$b!"%P%C%F%j$GF0:n$7$F$$$k!#(BBIOS $BMQ$N@_Dj$rJ];}$9$k%a%b%j$N(B
$B0lIt!#(B
$BEv;~!"(BCMOS $B$O!"!VDc>CHqEENO!WMQ$H$7$F$@$1;H$o$l$F$$$?!#(B
$B:#$O!"IaDL!#(B
$B!!(B
2$B$D$N5!G=$,$"$k!#(B
- TOD clock
- $B;~9o$r!"(Byear/month/day hour:minute:second $B$H$$$&7A<0$G;}$D!#(B
$BIC0J2<$OFI$a$J$$!#(B
- $BDj4|E*$J3d9~$_MQ(B
- 2Hz $B$+$i(B 8192Hz $B$NHO0O$G!"(B2 $B$NQQ>h$N<~4|$G3d9~$_$r5/$3$;$k!#(B
$B@)Ls(B
- $B%+%&%s%?$NCM$rFI$_=q$-$G$-$J$$(B
- $B=i4|CM$O!"(B2 $B$NQQ>h$7$+@_Dj$G$-$J$$!#(B
$B$=$NB>$N3d9~$_(B
- TOD $B%/%m%C%/$,99?7$5$l$?!#KhIC#12s!#(B
- $BL\3P$^$7!#(BTOD $B%/%m%C%/$,@_Dj$5$l$?;~9o$H0lCW$7$?;~!#(B
Local APIC $B$O!"3d9~$_$N%k!<%F%#%s%0$K;H$o$l$k!#(B
$B%^%k%A%W%m%;%C%5$G$b!"(BCPU $BKh$KFHN)!#(B
Pentium $B0J9_$G$O!"(BCPU $B$KFbB"!#(B
- $B%+%&%s%?$H=i4|CM$O(B 32 $B%S%C%H!#(B
- $BF~NO<~GH?t$O!"(BCPU $B$N%U%m%s%H%5%$%I!&%a%b%j!&%P%9$N<~GH?t$HF1$8!#(B
(DDR $BMQ0JA0(B)
- PIT $B$d(B CMOS RTC $B$h$j9b@:EY$@$,!"%=%U%H%&%'%"$+$i<~GH?t$rD4$Y$kJ}K!$,$J$$!#(B
(PIT $B$d(B CMOS RTC$B$r;H$C$FD4$Y$k$7$+$J$$!#(B)
$B%A%C%W%;%C%H!&%?%$%^$H$b8F$P$l$k!#(B
- $BH/?64o$O!"(B3579545 Hz (PIT $B$N(B 3 $BG\(B)
- $B%+%&%s%?$O!"(B24$B%S%C%H!#(B
- $B=i4|CM$rJ];}$9$k%l%8%9%?$,$J$$!#(B24 $B%S%C%H$G0l<~$9$k!#(B
- $B>e0L%S%C%H$,JQ2=$9$k$H3d9~$_$,$+$+$k!#(B
- $B>JEENO%b!<%I$G$b!"DL>oDL$jF0$-B3$1$k(B
- $BFI$_=q$-$9$k$K$b!"(B1-2$B%^%$%/%mIC$+$+$k$3$H$,$"$k!#(B
Pentium $B0J9_$GMxMQ2DG=!#(B
- $BH/?64o$O!"(BCPU $B%/%m%C%/!#9b@:EY!#(B
- $B%+%&%s%?$O!"(B64 $B%S%C%H!#0l<~$9$k$N$K!"?tG/$+$+$k!#(B
- $B3d$j9~$_$r5/$3$95!G=$O$J$$!#(B
- $B=i4|CM$rJ];}$9$k%l%8%9%?$,$J$$(B
- $B%=%U%H%&%'%"$+$iFI$_=P$;$k!#(B(Pentium 4 $B$G$O!"CY$$!#(B)
- $B%f!<%6$+$i$b%"%/%;%92DG=$K$9$k$N$,IaDL!#(B
- $B%=%U%H%&%'%"$+$i<~GH?t$rD4$Y$kJ}K!$,$J$$!#(B
(PIT $B$d(B CMOS RTC$B$r;H$C$FD4$Y$k$7$+$J$$!#(B)
- $B>JEENO$G(B CPU $B$N<~GH?t$rMn$9$3$H$,$"$k!#(B
- SMP $B$G$b!"(BCPU $B$OF1$8H/?64o$N=PNO$r;H$&$N$GF1$8$h$&$KA}$($k!#(BNUMA $B$G$OF0$+$J$$!#(B
$B?7$7$$L\$N(B PC $B$GEk:\$5$l$F$$$k!#(B
- $BH/?64o$N<~GH?t$O(B10MHz$B0J>e!#(B
- 1$B8D$NA}2C$9$kCf1{$N%+%&%s%?$,$"$k!#(B32$B%S%C%H!"$^$?$O!"(B64 $B%S%C%HI}!#(B
$B%=%U%H%&%'%"$+$i%+%&%s%?CM$rFI$_!?=q$-!?A}2C$rDd;_$G$-$k!#(B
- $BHf3S4o!J%?%$%^!K$,!"J#?t$"$k!#:GBg(B32$B8D!#IaDL$O(B3$B8D0J>e$"$k!#(B
- $BHf3S4o$NCM$HCf1{$N%+%&%s%?$NCM$,0lCW$9$l$P!"$=$N%?%$%^$,H/2P$7!"3d(B
$B$j9~$_$r@8@.$G$-$k!#(B
- $BHf3S4o$,!VDj4|E*E*(B(periodic)$B!W$H$7$F@_Dj$5$l$F$$$k$H!" $BHf3S4o$,!V0l2s$-$j(B(one shot)$B!W$J$i!"H/2P$7$F=*$o$j!#(B
- $BFI$`$N$,CY$$(B(1-2$B%^%$%/%mIC$+$+$k(B)$B$3$H$,$"$k!#(B
- $B%=%U%H%&%'%"$GHf3S4o$r@_Dj$7$h$&$H$7$F$$$k;~$KH/2P$9$k$H!"4m$J$$!#(B
jiffies $B$O!"(BLinux $B$G!"%b%N%H%K%C%/;~9o$rDs6!$9$kJQ?t!#C10L$O!"(Btick$B!#(B
- PIT$BEy$N%O!<%I%&%'%"$N%$%s%?!<%P%k!&%?%$%^$r;H$C$F!"(Bjiffies $B$H$$$&(B
$BJQ?t$rA}$d$9!##12s$N3d9~$_$r(B tick $B$H$$$&!#(B
- $BEAE}E*$J(B Unix $B$G$O!"(B1$BIC4V$K(B 100 $B2s(B-120 $B2s$N%?%$%^3d9~$_$r5/$3$9!#(B
- Linux $B$G$O!"(BHZ $B$H$$$&%3%s%Q%$%k;~$NDj?t$G@_Dj$5$l$k!#(B
100, 250, 1000 $B$J$I$K@_Dj$9$k$N$,IaDL!#(B
$BMxMQNc(B
- time_stamp = jiffies; // $B8=:_$N%b%N%H%K%C%/;~9o$r next_tick = jiffies + 1; // 1 tick $B8e(B
- later = jiffies + 5*HZ; // 5$BIC8e!#(Bsettimeoday() $B$K$+$+$o$i$:!#(B
- later = jiffies + HZ/10; // 0.1 $BIC8e!#(B
$B
kernel/timer.c
53: u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES;
include/linux/jiffies.h
82: extern unsigned long volatile __jiffy_data jiffies;
- $B jiffies $B$H$$$&L>A0$G%"%/%;%9$9$k$H!"2<0L(B32$B%S%C%H$, 32$B%S%C%H$N(B jiffies $B$O%*!<%P%U%m!<$KCm0U$9$k!#$?$H$($P!"(BHZ $B$,(B 1000
$B$J$i!"(Bjiffies$B$H(Bjiffies_64 $B$O6&$K!"(B1$BIC4V$K(B1000$BA}$($k!#(B32 $B%S%C%H$N(B
jiffies $B$O!"(B2^32/1000 $BIC4V(B == $BLs(B50$BF|$G0l<~$9$k!#(B64$B%S%C%H$N(B jiffies_64
$B$J$i(B 5.8 $B2/G/DxEY$b$D!#(B
tick_periodic() $B$O!"%O!<%I%&%'%"$+$iFHN)$7$?(Btick $B$4$H$N=hM}$r9T$&4X?t(B
$B$G$"$k!#(B
- $B%O!<%I%&%'%"$K0MB8$7$?ItJ,$O!"MxMQ2DG=$J%?%$%^(B($B%$%s%?!<%P%k!&%?%$(B
$B%^(B) $B$r;H$C$F!"(B1$BIC4V$K(B HZ $B2s$@$1Dj4|E*$J3d$j9~$_$rH/@8$5$;$k!#(B
- $B$3$N3d$j9~$_$O!"EAE}E*$K(B IRQ0 $B$G$J$5$l$k!#(B
- IRQ0 $B$N3d$j9~$_%O%s%I%i(B($B%O!<%I%&%'%"0MB8(B)$B$,(B tick_periodic() $B$r8F$V!#(B
kernel/time/tick-common.c
60: static void tick_periodic(int cpu)
61: {
62: if (tick_do_timer_cpu == cpu) {
...
68: do_timer(1);
70: }
...
72: update_process_times(user_mode(get_irq_regs()));
...
74: }
1272: void update_process_times(int user_tick)
1273: {
1274: struct task_struct *p = current;
...
1278: account_process_tick(p, user_tick);
1279: run_local_timers();
...
1283: scheduler_tick();
...
1285: }
1303: void run_local_timers(void)
1304: {
1305: hrtimer_run_queues();
1306: raise_softirq(TIMER_SOFTIRQ);
1307: }
- tick_periodic() $B$O!"(Btick $B$4$H$K$J$5$l$k3d$j9~$_%O%s%I%i$+$i(B
$B8F$P$l$k!#0z?t$O!"(Bcpu $B$N(B ID$B!#(B
- $BJ#?t$N(B CPU $B$N$&$A!"(Btick_do_timer_cpu $B$J$i$P!"(Bdo_timer() $B$r8F$S!"(B
jiffies_64 $B$rA}$d$9!#(B
- update_process_times() $B$r8F$V!#(B
- account_process_tick() $B$G8=:_CHq$7$?;q8;NL(B(CPU
$B;~4V!"%f!<%6;~4V!"%+!<%M%k;~4V(B)$B$r5-O?$9$k!#(B
- run_local_timers() $B$G!"(BSoftirq $B$N0l $B%9%1%8%e!<%i$K$"$k4X?t(B sheduler_tick() $B$r8F$V!#(B
kernel/timer.c
53: u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES;
...
1315: void do_timer(unsigned long ticks)
1316: {
1317: jiffies_64 += ticks;
1318: update_wall_time();
...
1320: }
- do_timer() $B$G$O!"(B64 $B%S%C%H$NJQ?t(B jiffies_64 $B$,(B 1 $B$@$1A}$d$5$l$k!#(B
- update_wall_time() $B$G(B xtime $BJQ?t$r99?7$9$k!#(B
xtime $B$O!"(B1970$BG/(B1$B7n(B1$BF|(B00:00:00(GMT)$B$+$i$NIC?t$r%J%NICC10L$G9=B$BN(B
struct timespec $B$N7A<0$GJ];}$7$F$$$k!#(B
kernel/time/timekeeping.c
156: static struct timespec xtime __attribute__ ((aligned (16)));
- xtime $B$O!"(Bwall clock ($B3]$1;~7W(B) $B$H$b8F$P$l$k!#(B
- xtime $B$O!"(Btick $BC10L$G99?7$5$l$k$,!"$=$l$h$j:Y$+$$C10L$r(B TSC $BEy$N9b(B
$B@:EY$N(B clocksource $B$+$iFI$_9~$_Jd@5$9$k!#(B
- 1970$BG/(B1$B7n(B1$BF|(B00:00:00(GMT) $B$O!"(Bepoch $B$H8F$P$l$k!#(B
kernel/time.c
101: SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
102: struct timezone __user *, tz)
103: {
104: if (likely(tv != NULL)) {
105: struct timeval ktv;
106: do_gettimeofday(&ktv);
107: if (copy_to_user(tv, &ktv, sizeof(ktv)))
108: return -EFAULT;
109: }
110: if (unlikely(tz != NULL)) {
111: if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
112: return -EFAULT;
113: }
114: return 0;
115: }
kernel/time/timekeeping.c
293: void do_gettimeofday(struct timeval *tv)
294: {
295: struct timespec now;
296:
297: getnstimeofday(&now);
298: tv->tv_sec = now.tv_sec;
299: tv->tv_usec = now.tv_nsec/1000;
300: }
213: void getnstimeofday(struct timespec *ts)
214: {
...
223: *ts = xtime;
224: nsecs = timekeeping_get_ns();
227: nsecs += arch_gettimeoffset();
...
231: timespec_add_ns(ts, nsecs);
232: }
- gettimeofday() $B%7%9%F%`!&%3!<%k$N(B API $B$O!"(Bstruct timeval $B$G%^%$%/(B
$B%mICC10L$@$,!"FbItE*$K$O!"(Bstruct timespec $B$G!"%J%NICC10L$NJQ?t(B xtime $B$,(B
$B;H$o$l$k!#(B
- $BC1$K(B xtime $BJQ?t$NCM$r%3%T!<$9$k$N$G$O$J$/!"MxMQ2DG=$J$i$5$i$K9b@:(B
$BEY$N;~7W(B(TSC$BEy(B)$B$GJd@5$9$k!#(B
- xtime $BJQ?t$O!"(Bupdate_wall_time() $B$G99?7$9$k!#(Bupdate_wall_time() $B$O!"(B
$B%?%$%^3d$j9~$_$N3d$j9~$_%O%s%I%i$+$i8F$P$l$k!#(B
update_wall_time() $B$O!"(B
do_timer()
$B$+$i8F$P$l!"3]$1;~7W$N;~9o(B xtime $B$r99?7$9$k!#(B
734: void update_wall_time(void)
...
802: xtime.tv_nsec = ((s64) timekeeper.xtime_nsec >> timekeeper.shift) + 1;
...
811: if (unlikely(xtime.tv_nsec >= NSEC_PER_SEC)) {
812: xtime.tv_nsec -= NSEC_PER_SEC;
813: xtime.tv_sec++;
...
820: }
Linux $B%+!<%M%k$K$O!"$"$k;~4V$,7P2a$7$?$i!"4X?t$r
- struct timer_list: tick $BC10L(B
- struct hrtimer: $B%J%NICC10L(B
include/linux/timer.h
12: struct timer_list {
...
17: struct list_head entry;
18: unsigned long expires;
19: struct tvec_base *base;
20:
21: void (*function)(unsigned long);
22: unsigned long data;
...
34: };
jiffies $B$,A}2C$7$F(B expires $B$KC#$9$l$P!"(B(*function)(data) $B$r8F$V!#(B
$B
add_timer(), add_timer_on()
$B%?%$%^$NEPO?!#(B_on() $B$O!"(BCPU $B$4$H!#(B
mod_timer()
$B%?%$%^$N5/F0;~9o$NJQ99(B
del_timer(), del_timer_sync(), try_to_del_timer_sync()
$B%?%$%^$N%-%c%s%;%k!#(B
del_timer_sync() $B$O!"$b$74{$K
$BMxMQNc!#(B
{
struct timer_list my_timer; // $B9=B$BN$N@k8@(B
init_timer(&my_timer);$B!!!!!!!!!!!!!!!!(B// $B=i4|2=(B
my_timer.expires = jiffies + delay; // $B$I$N$/$i$$BT$A$?$$$+(B
my_timer.data = (unsigned long)data; // $BEO$7$?$$%G!<%?(B
my_timer.function = my_timer_func; // $B4X?t(B
add_timer(&my_timer); // $BEPO?(B
}
void my_timer_func(unsigned long data) {
...
}
- add_timer() $B$K$h$j!"(Bdelay tick $B8e$K(B my_timer_func() $B$,8F$P$l$k!#(B
- data
struct timer_list$B$N(BAPI$B$G$O!"(Btick$BC10L$@$,!"(Bstruct hrtimer $B$N(B API $B$G$O!"(B
$B%J%NICC10L$G;XDj$G$-$k!#$?$@$7!"e$N@:EY$O$J$$!#(B
$B
hrtimer_init()
struct hrtimer $B9=B$BN$N=i4|2=!#(B
hrtimer_start()
$B%?%$%^$N3+;O!#%b%N%H%K%C%/;~9o(B(CLOCK_MONOTONIC)$B$+!"%+%l%s%@(B
$B;~9o(B(CLOCK_REALTIME)$B$+A*$Y$k!#0z?t$O!"@dBP;XDj(B(HRTIMER_MODE_ABS)$B$+8=:_(B
$B$+$i$NAjBP(B(HRTIMER_MODE_REL)$B$+;XDj$G$-$k!#(B
hrtimer_cancel()
$B%?%$%^$N%-%c%s%;%k!#(B
schedule_hrtimeout()
$B;XDj$7$?;~4V$@$18=:_ ktime_get()
$B%b%N%H%K%C%/;~9o$N ktime_get_real()
$B%+%l%s%@;~9o$N
$BMxMQNc!#(B
struct hrtimer my_timer;
hrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
my_timer.function = my_timer_handler;
...
hrtimer_start(&my_timer, ktime_set(0, nano), HRTIMER_MODE_REL);
...
enum hrtimer_restart my_timer_handler(struct hrtimer *timer)
{
...
return HRTIMER_NORESTART;
}
$B%O%s%I%i$G(B HRTIMER_RESTART $B$r(B return $B$9$k$H!"%?%$%^$,:F@_Dj$5$l$k!#(B
hrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
my_timer.function = func;
...
hrtimer_start(&my_timer, ktime_add_ns(ktime_get(), period),
HRTIMER_MODE_ABS);
hrtimer $B$N4IM}$K$O!"(Bred-black tree $B$,;H$o$l$F$$$k!#(B
$B%G%P%$%9%I%i%$%P$G$O!"CY$$%G%P%$%9$K9g$o$;$k$?$a$K$7$P$i$/BT$C$F$+$i=h(B
$BM}$r$7$?$$$3$H$,B?$$!#F@$K3d$j9~$_$N8eH>It(B(bottom-half)$B$G!#(B
$BNc(B: Ethernet $B$N%I%i%$%P$G%b!<%I$rJQ99$7$F(B 2 $B%^%$%/%mIC$@$1BT$D!#(B
$BMM!9$JJ}K!$,$"$k!#(B
$BBT$D$?$a$NC1=c$JJ}K!$O!"6u%k!<%W$r2s$k$3$H!#(B
$BNc(B1: 10 tick ($B%$%s%?!<%P%k!&%?%$%^$K$h$k3d$j9~$_(B)$B$rBT$D!#(B
unsigned long timeout = jiffies + 10; // 10 ticks
while (time_before(jiffies,timeout))
continue;
$BNc(B1: 2$BICBT$D(B
unsigned long delay = jiffies + 2*HZ; // 2$BIC(B
while (time_before(jiffies,timeout))
continue;
jiffies $B$O!"(B32 $B%S%C%H$J$N$G!"%*!<%P%U%m!<$9$k2DG=@-$,$"$k!#(B
$B
unsigned long timeout = jiffies + 10; // 10 ticks
while (jiffies<timeout)
continue;
$B
include/linux/jiffies.h
106: #define time_after(a,b) \
107: (typecheck(unsigned long, a) && \
108: typecheck(unsigned long, b) && \
109: ((long)(b) - (long)(a) < 0))
110: #define time_before(a,b) time_after(b,a)
111:
112: #define time_after_eq(a,b) \
113: (typecheck(unsigned long, a) && \
114: typecheck(unsigned long, b) && \
115: ((long)(a) - (long)(b) >= 0))
116: #define time_before_eq(a,b) time_after_eq(b,a)
$B6u%k!<%W$O!"(BCPU $B$,L5BL$K$J$k$N$GNI$/$J$$!#$=$NBe$o$j$K
unsigned long delay = jiffies + 2*HZ; // 2$BIC(B
while (time_before(jiffies,timeout))
cond_resched();
$BB>$Kr7o(B)$B;~$K$O!"%9%1%8%e!<%i$r8F$s(B
$B$G!"$B"!>.$5$JCY1d(B
tick $BC10L(B (10$B%_%jIC(B-1$B%_%jIC(B) $B$G$OBg$-$9$.$k>l9g!">.$5$JCY1d$r
void ndelay(unsigned long nsecs)
void udelay(unsigned long usecs)
void mdelay(unsigned long msecs)
udelay() $B$O!"$"$k2s?t$N%k!<%W$G
udelay() $B$G(B1$B%_%jIC0J>eBT$C$F$O$$$1$J$$!#(B
$B%k!<%W$N%$%s%G%C%/%9$,%*!<%P%U%m!<$9$k2DG=@-$,$"$k!#(B
set_current_state( TASK_INTERRUPTIBLE ); // signal $B$G5/$-$k2DG=@-$,$"$k(B
schedule_timeout( s * HZ );
$Bstruct timer_list
$B$,;H$o$l$F$$$k!#(B
kernel/sched.c
3446: void account_process_tick(struct task_struct *p, int user_tick)
3447: {
3448: cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy);
3449: struct rq *rq = this_rq();
3450:
3451: if (user_tick)
3452: account_user_time(p, cputime_one_jiffy, one_jiffy_scaled);
3453: else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))
3454: account_system_time(p, HARDIRQ_OFFSET, cputime_one_jiffy,
3455: one_jiffy_scaled);
3456: else
3457: account_idle_time(cputime_one_jiffy);
3458: }
3320: void account_user_time(struct task_struct *p, cputime_t cputime,
3321: cputime_t cputime_scaled)
3322: {
...
3324: cputime64_t tmp;
3327: p->utime = cputime_add(p->utime, cputime);
3328: p->utimescaled = cputime_add(p->utimescaled, cputime_scaled);
3329: account_group_user_time(p, cputime);
...
3341: }
- account_process_tick() $B$O!"(Btick $B$4$H$K(B
tick_periodic()
$B$+$i8F$P$l$k!#(B
- $B%$%s%?!<%P%k!&%?%$%^$K$h$k3d$j9~$_$,9T$o$l$?;~(B CPU $B$,2?$r
- $B%f!<%6!&%b!<%I$N%f!<%6!&%W%m%;%9(B
- $B%+!<%M%k!&%b!<%I$N%f!<%6!&%W%m%;%9(B
- $B%"%$%I%k(B
$B%f!<%6!&%b!<%I$N%f!<%6!&%W%m%;%9$N>l9g$O!"(Btask_struct $B$N(B
utime $B%U%#!<%k%I$K(B 1 tick $BJ,$N;~4V$rB-$79~$`!#(B
PIT (Programmable Interval Timer)$B$G$O!"(B
$BH/?64o$N<~GH?t$O!"(B1193182Hz $B$G$"$k!#(B
$B:F@_DjMQ$N%l%8%9%?$r(B 11931 $B$K@_Dj$7$?$i!"(B
$B2?IC$K(B1$B2s!"3d$j9~$_$,H/@8$9$k$+!#(B
$B%+!<%M%k$NCf$G!"%+%l%s%@;~9o$G$O$J$/$F%b%N%H%K%C%/;~9o$,;H$o$l$F$$$k>l(B
$B=j$,$"$k!#$=$NM}M3$r4JC1$K@bL@$7$J$5$$!#$=$N>l=j$r%+%l%s%@;~9o$r;H$&$h(B
$B$&$K$9$k$H!"!V$I$N$h$&$J>l9g$K!W$I$N$h$&$JITET9g$,@8$8$k$+!#(B
$B4X?t(Bf()$B$r
void h(int a,int b, int c) {
....
}
$B$3$l$r
struct timer_list my_timer_list;
int my_arg_a,my_arg_b,my_arg_c;
void f(unsigned long data) {
init_timer( /*$B6uMs(B(b)*/ );
my_timer.expires = /*$B6uMs(B(c)*/;
my_timer.data = 0;
my_timer.function = /*$B6uMs(B(d)*/;
/*$B6uMs(B(e)*/;
}
void my_timer_func(unsigned long data) {
h( my_arg_a,my_arg_b,my_arg_c );
}
$B%P%0(B: 2011/02/22 my_timer $B$H(Bmy_timer_list $B$,:.:_$7$F$$$^$7$?!#$I$A$i$G(B
$B$b2D$H$7$^$9!#(B
Last updated: 2011/02/22 16:54:27
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>