- 论坛徽章:
- 3
|
本帖最后由 compare2000 于 2012-12-25 13:03 编辑
5)实时优先级
5.1)实时优先级概述:
linux提供了一个实时调度策略,提供了100个额外优先级别,以保证系统能及时响应进程.
5.2)实时优先级和普通优先级的区别:
实时优先级比普通优先级高,普通优先级是0-39.而实时优先级是(41-139),优先级一般不用40.
实时优先级在整个进程的生命周期里是不变的,所以实时进程没有nice值,也没有额外值.它的有效优先级就是静态优先级.
5.3)POSIX标准为实时进程指定了两种策略:先进先出(FIFO),时间片法(Round_Robin,简称RR)
5.3.1)先进先出(FIFO)调度
如果有两个同优先级的进程位于就绪队列,通常情况下,排在前面的先被执行
FIFO的策略要求进程不能抢占CPU,除非另一个实时进程有更高优先级
5.3.2)FIFO调度的例子
这个程序将永远不会退出.系统将会死机.
新建chewer脚本
#!/bin/sh
(sleep 50;kill -ALRM $$) &
while true;do
true;
done
程序为什么不在50秒之后退出呢,原因是一个fifo的调度,是不会运行(sleep 5;kill -ALRM $$),而永远进入了一个死循环.
在2.6.18的内核中,这个会造成死机,而新的2.6.32内核则不会,我们依然有机会终止它.
我们在2.6.32的内核中看下它的优先级
指定调度策略为FIFO,优先级为50
chrt -f 50 ./chewer &
[2] 2414
查看优先级,CLS显示了调度策略,chewer的调度策略是FF,FF表示FIFO,PTRPIO是实时优先级,这里chewer是50,
PRI是有效优先级,在实时系统里也叫绝对优先级,有效优先级是实时优先级与40的和,所以这里是90.
ps -eo pid,ppid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,command
PID PPID TID CLS RTPRIO NI PRI PSR %CPU STAT WCHAN COMMAND
1 0 1 TS - 0 19 0 0.0 Ss poll_schedule_ init [2]
2 0 2 TS - 0 19 0 0.0 S kthreadd [kthreadd]
3 2 3 FF 99 - 139 0 0.0 S migration_thre [migration/0]
4 2 4 TS - 0 19 0 0.0 S ksoftirqd [ksoftirqd/0]
5 2 5 TS - 0 19 0 0.0 S worker_thread [events/0]
6 2 6 TS - 0 19 0 0.0 S worker_thread [khelper]
11 2 11 TS - 0 19 0 0.0 S async_manager_ [async/mgr]
58 2 58 TS - 0 19 0 0.0 S bdi_sync_super [sync_supers]
60 2 60 TS - 0 19 0 0.0 S bdi_forker_tas [bdi-default]
62 2 62 TS - 0 19 0 0.0 S worker_thread [kblockd/0]
64 2 64 TS - 0 19 0 0.0 S worker_thread [kacpid]
65 2 65 TS - 0 19 0 0.0 S worker_thread [kacpi_notify]
66 2 66 TS - 0 19 0 0.0 S worker_thread [kacpi_hotplug]
118 2 118 TS - 0 19 0 0.0 S serio_thread [kseriod]
168 2 168 TS - 0 19 0 0.0 S kswapd [kswapd0]
169 2 169 TS - 0 19 0 0.0 S worker_thread [aio/0]
170 2 170 TS - 0 19 0 0.0 S worker_thread [crypto/0]
552 2 552 TS - 0 19 0 0.0 S scsi_error_han [scsi_eh_0]
812 2 812 TS - 0 19 0 0.0 S kjournald [kjournald]
902 1 902 TS - -4 23 0 0.0 S<s poll_schedule_ udevd --daemon
1035 2 1035 TS - 0 19 0 0.0 S worker_thread [kpsmoused]
1551 2 1551 TS - 0 19 0 0.0 S worker_thread [kstriped]
1562 2 1562 TS - 0 19 0 0.0 S worker_thread [ksnapd]
1588 2 1588 TS - 0 19 0 0.0 S kjournald [kjournald]
1589 2 1589 TS - 0 19 0 0.0 S kjournald [kjournald]
1659 1 1659 TS - 0 19 0 0.0 Ss poll_schedule_ dhclient3 -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclie
1675 1 1675 TS - 0 19 0 0.0 Ss poll_schedule_ /sbin/portmap
1839 1 1839 TS - 0 19 0 0.0 Sl poll_schedule_ /usr/sbin/rsyslogd -c3
1852 1 1852 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/acpid
2127 1 2127 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/exim4 -bd -q30m
2139 1 2139 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/inetd
2158 1 2158 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/sshd
2162 1 2162 TS - 0 19 0 0.0 Ss poll_schedule_ /sbin/rpc.statd
2163 2158 2163 TS - 0 19 0 0.0 Ss poll_schedule_ sshd: root@pts/0,pts/1
2172 1 2172 TS - 0 19 0 0.0 Ss hrtimer_nanosl /usr/sbin/atd
2192 1 2192 TS - 0 19 0 0.0 Ss hrtimer_nanosl /usr/sbin/cron
2206 2163 2206 TS - 0 19 0 0.0 Ss wait -bash
2211 1 2211 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/apache2 -k start
2228 1 2228 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty1
2229 1 2229 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty2
2230 1 2230 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty3
2231 1 2231 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty4
2232 1 2232 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty5
2233 1 2233 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty6
2236 2211 2236 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2237 2211 2237 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2238 2211 2238 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2239 2211 2239 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2240 2211 2240 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2276 2163 2276 TS - 0 19 0 0.0 Ss wait -bash
2280 2276 2280 TS - 0 19 0 0.1 S+ poll_schedule_ top
2347 2 2347 TS - 0 19 0 0.0 S bdi_writeback_ [flush-8:0]
2414 2206 2414 FF 50 - 90 0 112 R - /bin/sh ./chewer
2415 2414 2415 FF 50 - 90 0 0.0 R - /bin/sh ./chewer
5.3.3)时间片调度(RR)
用时间片调度来执行chewer程序,则不会出现死机的情况.因为它在运行一段时间后,会根据时间片释放自己,这样就会fork出sleep进程,最后kill掉自己(chewer).
依然用chrt程序,-r表示用实时时间片调度,级别依然是50
chrt -r 50 ./chewer &
用ps命令查看有sleep 50的进程,同时chewer的调度状态CLS为RR
ps -eo pid,ppid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,command
PID PPID TID CLS RTPRIO NI PRI PSR %CPU STAT WCHAN COMMAND
1 0 1 TS - 0 19 0 0.0 Ss poll_schedule_ init [2]
2 0 2 TS - 0 19 0 0.0 S kthreadd [kthreadd]
3 2 3 FF 99 - 139 0 0.0 S migration_thre [migration/0]
4 2 4 TS - 0 19 0 0.0 S ksoftirqd [ksoftirqd/0]
5 2 5 TS - 0 19 0 0.0 S worker_thread [events/0]
6 2 6 TS - 0 19 0 0.0 S worker_thread [khelper]
11 2 11 TS - 0 19 0 0.0 S async_manager_ [async/mgr]
58 2 58 TS - 0 19 0 0.0 S bdi_sync_super [sync_supers]
60 2 60 TS - 0 19 0 0.0 S bdi_forker_tas [bdi-default]
62 2 62 TS - 0 19 0 0.0 S worker_thread [kblockd/0]
64 2 64 TS - 0 19 0 0.0 S worker_thread [kacpid]
65 2 65 TS - 0 19 0 0.0 S worker_thread [kacpi_notify]
66 2 66 TS - 0 19 0 0.0 S worker_thread [kacpi_hotplug]
118 2 118 TS - 0 19 0 0.0 S serio_thread [kseriod]
168 2 168 TS - 0 19 0 0.0 S kswapd [kswapd0]
169 2 169 TS - 0 19 0 0.0 S worker_thread [aio/0]
170 2 170 TS - 0 19 0 0.0 S worker_thread [crypto/0]
552 2 552 TS - 0 19 0 0.0 S scsi_error_han [scsi_eh_0]
812 2 812 TS - 0 19 0 0.0 S kjournald [kjournald]
902 1 902 TS - -4 23 0 0.0 S<s poll_schedule_ udevd --daemon
1035 2 1035 TS - 0 19 0 0.0 S worker_thread [kpsmoused]
1551 2 1551 TS - 0 19 0 0.0 S worker_thread [kstriped]
1562 2 1562 TS - 0 19 0 0.0 S worker_thread [ksnapd]
1588 2 1588 TS - 0 19 0 0.0 S kjournald [kjournald]
1589 2 1589 TS - 0 19 0 0.0 S kjournald [kjournald]
1659 1 1659 TS - 0 19 0 0.0 Ss poll_schedule_ dhclient3 -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclie
1675 1 1675 TS - 0 19 0 0.0 Ss poll_schedule_ /sbin/portmap
1839 1 1839 TS - 0 19 0 0.0 Sl poll_schedule_ /usr/sbin/rsyslogd -c3
1852 1 1852 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/acpid
2127 1 2127 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/exim4 -bd -q30m
2139 1 2139 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/inetd
2158 1 2158 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/sshd
2162 1 2162 TS - 0 19 0 0.0 Ss poll_schedule_ /sbin/rpc.statd
2163 2158 2163 TS - 0 19 0 0.0 Ss poll_schedule_ sshd: root@pts/0,pts/1
2172 1 2172 TS - 0 19 0 0.0 Ss hrtimer_nanosl /usr/sbin/atd
2192 1 2192 TS - 0 19 0 0.0 Ss hrtimer_nanosl /usr/sbin/cron
2206 2163 2206 TS - 0 19 0 0.0 Ss wait -bash
2211 1 2211 TS - 0 19 0 0.0 Ss poll_schedule_ /usr/sbin/apache2 -k start
2228 1 2228 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty1
2229 1 2229 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty2
2230 1 2230 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty3
2231 1 2231 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty4
2232 1 2232 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty5
2233 1 2233 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty6
2236 2211 2236 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2237 2211 2237 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2238 2211 2238 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2239 2211 2239 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2240 2211 2240 TS - 0 19 0 0.0 S inet_csk_accep /usr/sbin/apache2 -k start
2276 2163 2276 TS - 0 19 0 0.0 Ss wait -bash
2280 2276 2280 TS - 0 19 0 0.1 S+ poll_schedule_ top
2434 2 2434 TS - 0 19 0 0.0 S bdi_writeback_ [flush-8:0]
2456 2206 2456 RR 50 - 90 0 141 R - /bin/sh ./chewer
2457 2456 2457 RR 50 - 90 0 0.0 S wait /bin/sh ./chewer
2458 2457 2458 RR 50 - 90 0 0.0 S hrtimer_nanosl sleep 50
2459 2206 2459 TS - 0 19 0 0.0 R+ - ps -eo pid,ppid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wc
注:
实时时间片调度进程的时间片与普通进程的时间片不一样,实时进程的时间片法,如果该进程被另一个更高优先级的进程抢占,
在高优先级执先完后,允许该进程用完剩余的时间片,如果普通进程则它的时间片将会缩短.
5.3.4)批处理调度(BATCH)
这种调度算法不是实时调度策略,这种调度策略和实时调度策略相反,因为只会在没有其他进程占用CPU时间时,它才会运行.
但与nice值设成最大不同,因为即便是优先权最低还是有可能轮到它.
下面指定批处理调度来运行chewer
chrt -b 0 ./chewer &
[1] 2508
可以看到chewer进程的CLS一列为B,它的实时优先级只能是0.
ps -eo pid,ppid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:30,command
PID PPID TID CLS RTPRIO NI PRI PSR %CPU STAT WCHAN COMMAND
1 0 1 TS - 0 19 0 0.0 Ss poll_schedule_timeout init [2]
2 0 2 TS - 0 19 0 0.0 S kthreadd [kthreadd]
3 2 3 FF 99 - 139 0 0.0 S migration_thread [migration/0]
4 2 4 TS - 0 19 0 0.0 S ksoftirqd [ksoftirqd/0]
5 2 5 TS - 0 19 0 0.0 S worker_thread [events/0]
6 2 6 TS - 0 19 0 0.0 S worker_thread [khelper]
11 2 11 TS - 0 19 0 0.0 S async_manager_thread [async/mgr]
58 2 58 TS - 0 19 0 0.0 S bdi_sync_supers [sync_supers]
60 2 60 TS - 0 19 0 0.0 S bdi_forker_task [bdi-default]
62 2 62 TS - 0 19 0 0.0 S worker_thread [kblockd/0]
64 2 64 TS - 0 19 0 0.0 S worker_thread [kacpid]
65 2 65 TS - 0 19 0 0.0 S worker_thread [kacpi_notify]
66 2 66 TS - 0 19 0 0.0 S worker_thread [kacpi_hotplug]
118 2 118 TS - 0 19 0 0.0 S serio_thread [kseriod]
168 2 168 TS - 0 19 0 0.0 S kswapd [kswapd0]
169 2 169 TS - 0 19 0 0.0 S worker_thread [aio/0]
170 2 170 TS - 0 19 0 0.0 S worker_thread [crypto/0]
552 2 552 TS - 0 19 0 0.0 S scsi_error_handler [scsi_eh_0]
812 2 812 TS - 0 19 0 0.0 S kjournald [kjournald]
902 1 902 TS - -4 23 0 0.0 S<s poll_schedule_timeout udevd --daemon
1035 2 1035 TS - 0 19 0 0.0 S worker_thread [kpsmoused]
1551 2 1551 TS - 0 19 0 0.0 S worker_thread [kstriped]
1562 2 1562 TS - 0 19 0 0.0 S worker_thread [ksnapd]
1588 2 1588 TS - 0 19 0 0.0 S kjournald [kjournald]
1589 2 1589 TS - 0 19 0 0.0 S kjournald [kjournald]
1659 1 1659 TS - 0 19 0 0.0 Ss poll_schedule_timeout dhclient3 -pf /var/run/dhclient.eth0.pid -lf /var/
1675 1 1675 TS - 0 19 0 0.0 Ss poll_schedule_timeout /sbin/portmap
1839 1 1839 TS - 0 19 0 0.0 Sl poll_schedule_timeout /usr/sbin/rsyslogd -c3
1852 1 1852 TS - 0 19 0 0.0 Ss poll_schedule_timeout /usr/sbin/acpid
2127 1 2127 TS - 0 19 0 0.0 Ss poll_schedule_timeout /usr/sbin/exim4 -bd -q30m
2139 1 2139 TS - 0 19 0 0.0 Ss poll_schedule_timeout /usr/sbin/inetd
2158 1 2158 TS - 0 19 0 0.0 Ss poll_schedule_timeout /usr/sbin/sshd
2162 1 2162 TS - 0 19 0 0.0 Ss poll_schedule_timeout /sbin/rpc.statd
2163 2158 2163 TS - 0 19 0 0.0 Ss poll_schedule_timeout sshd: root@pts/0,pts/1
2172 1 2172 TS - 0 19 0 0.0 Ss hrtimer_nanosleep /usr/sbin/atd
2192 1 2192 TS - 0 19 0 0.0 Ss hrtimer_nanosleep /usr/sbin/cron
2206 2163 2206 TS - 0 19 0 0.0 Ss wait -bash
2211 1 2211 TS - 0 19 0 0.0 Ss poll_schedule_timeout /usr/sbin/apache2 -k start
2228 1 2228 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty1
2229 1 2229 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty2
2230 1 2230 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty3
2231 1 2231 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty4
2232 1 2232 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty5
2233 1 2233 TS - 0 19 0 0.0 Ss+ n_tty_read /sbin/getty 38400 tty6
2236 2211 2236 TS - 0 19 0 0.0 S inet_csk_accept /usr/sbin/apache2 -k start
2237 2211 2237 TS - 0 19 0 0.0 S inet_csk_accept /usr/sbin/apache2 -k start
2238 2211 2238 TS - 0 19 0 0.0 S inet_csk_accept /usr/sbin/apache2 -k start
2239 2211 2239 TS - 0 19 0 0.0 S inet_csk_accept /usr/sbin/apache2 -k start
2240 2211 2240 TS - 0 19 0 0.0 S inet_csk_accept /usr/sbin/apache2 -k start
2276 2163 2276 TS - 0 19 0 0.0 Ss wait -bash
2280 2276 2280 TS - 0 19 0 0.1 S+ poll_schedule_timeout top
2491 2 2491 TS - 0 19 0 0.0 S bdi_writeback_task [flush-8:0]
2508 2206 2508 B 0 - 19 0 85.6 R - /bin/sh ./chewer
2509 2508 2509 B 0 - 19 0 0.0 S wait /bin/sh ./chewer
2510 2509 2510 B 0 - 19 0 0.0 S hrtimer_nanosleep sleep 50
|
|