网络安全 频道

Linux下的用户、进程的调配与查看

由于 I/O 绑定型的任务对于 CPU 访问来说是无私的,因此其优先级减少(奖励)最多 5 个优先级。CPU 绑定的任务会通过将其优先级增加最多 5 个优先级进行惩罚。

任务到底是 I/O 绑定的还是 CPU 绑定的,这是根据交互性 原则确定的。任务的交互性指标是根据任务执行所花费的时间与睡眠所花费的时间的对比程度进行计算的。注意,由于 I/O 任务先对 I/O 进行调度,然后再进行睡眠,因此 I/O 绑定的任务会在睡眠和等待 I/O 操作完成上面花费更多的时间。这会提高其交互性指标。

用户响应能力更好
与用户进行通信的任务都是交互型的,因此其响应能力应该比非交互式任务更好。
由于与用户的通信(不管是向标准输出上发送数据,还是通过标准输入等待输入数
据)都是  I/O 绑定型的,因此提高这些任务的优先级可以获得更好的交互式响应
能力。

有一点值得注意,优先级的调整只会对用户任务进行,对于实时任务来说并不会对其优先级进行调整。

SMP 负载均衡

在 SMP 系统中创建任务时,这些任务都被放到一个给定的 CPU 运行队列中。通常来说,我们无法知道一个任务何时是短期存在的,何时需要长期运行。因此,最初任务到 CPU 的分配可能并不理想。

为了在 CPU 之间维护任务负载的均衡,任务可以重新进行分发:将任务从负载重的 CPU 上移动到负载轻的 CPU 上。Linux 2.6 版本的调度器使用负载均衡(load balancing) 提供了这种功能。每隔 200ms,处理器都会检查 CPU 的负载是否不均衡;如果不均衡,处理器就会在 CPU 之间进行一次任务均衡操作。

这个过程的一点负面影响是新 CPU 的缓存对于迁移过来的任务来说是冷的(需要将数据读入缓存中)。

记住 CPU 缓存是一个本地(片上)内存,提供了比系统内存更快的访问能力。如果一个任务是在某个 CPU 上执行的,与这个任务有关的数据都会被放到这个 CPU 的本地缓存中,这就称为热的。如果对于某个任务来说,CPU 的本地缓存中没有任何数据,那么这个缓存就称为冷的。

不幸的是,保持 CPU 繁忙会出现 CPU 缓存对于迁移过来的任务为冷的情况

2.6 版本调度器的源代码都很好地封装到了 /usr/src/linux/kernel/sched.c 文件中。我们在表 1 中对在这个文件中可以找到的一些有用的函数进行了总结。

表 1. Linux 2.6 调度器的功能 函数名 函数说明

schedule 调度器主函数。调度优先级最高的任务执行。

load_balance 检查 CPU,查看是否存在不均衡的情况,如果不均衡,就试图迁移任务。

effective_prio 返回任务的有效优先级(基于静态策略,但是可以包含任何奖励和惩罚)。

recalc_task_prio 根据任务的空闲时间确定对任务的奖励或惩罚。

source_load 适当地计算源 CPU(任务从中迁移出的 CPU)的负载。

target_load 公平地计算目标 CPU(任务可能迁移到的 CPU)的负载。

migration_thread 在 CPU 之间迁移任务的高优先级的系统线程。

运行队列的结构也可以在 /usr/src/linux/kernel/sched.c 文件中找到。2.6 版本的调度器还可以提供一些统计信息(如果启用了 CONFIG_SCHEDSTATS)。这些统计信息可以从 /proc 文件系统中的 /proc/schedstat 看到,它为系统中的每个 CPU 都提供了很多数据,包括负载均衡和进程迁移的统计信息。 http://www.hacker.cn/News/xtaq/2006-9/13/0691308245317961_3.shtml

0
相关文章