Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->内核研究 ->正文

Linux 和对称多处理

来源:linux.chinaunix.net 作者:M. Tim Jones  时间:2007-04-22 点击: [收藏] [投稿]
内核中的 SMP
为了理解怎么样为特定架构启用 SMP 功能,请在 ./linux/arch/<arch>/kernel/ 查看内核中的 smp.c 或 smpboot.c 文件(适于大多数架构和平台)。

2.6 内核为每个处理器维护两个 runqueue(过期的和活动的 runqueue)。每个 runqueue 支持 140 个优先级,前面的 100 个用于实时任务,而后面的 40 个用于用户任务。任务分时间片执行,在使用它们分配到的时间片时,这些任务被从活动的 runqueue 移至过期的 runqueue。这就为所有的任务提供了公平访问 CPU 的机会(仅根据每个 CPU 锁定)。

利用每个 CPU 的任务队列,可以根据系统中所有 CPU 的负载进行负载平衡。每 200 毫秒,调度程序就执行一次负载平衡调节,以便重新分配任务负载,维持处理器之间的平衡。有关 Linux 2.6 调度程序的更多信息,请参阅 参考资料 部分。

用户空间线程:使用 SMP 的功能

为使用 SMP,需要在 Linux 内核中执行大量工作,但仅靠操作系统本身还不够。回顾一下,SMP 的能力取决于 TLP。单个单片(非线程化的)程序不能使用 SMP,但是 SMP 可在由核心之间分布的多个线程组成的程序中使用。当一个线程由于等待完成 I/O 处理而被延迟时,另一个线程可执行一些有用的工作。这样,线程之间互相协作,隐藏了各自的延迟时间。

Portable Operating System Interface(POSIX)线程是构建可利用 SMP 的线程化应用程序的一种好方法。POSIX 线程提供了线程化机制和共享内存。当调用程序创建若干线程时,每个线程得到自身的堆栈(本地变量和状态),但共享父线程的数据空间。创建的所有线程共享这个相同的数据空间,但是问题就出在这里。

为支持多线程访问共享内存,需要具备协调机制。POSIX 提供了互斥函数来创建临界区,用于实施单线程对对象(一块内存)的独占访问。不这样做可能导致内存破坏(由于多个线程执行了不同步的操作)。清单 2 演示了怎么样使用 POSIX 互斥函数创建临界区。


清单 2. 使用 pthread_mutex_lock 和 pthread_mutex_unlock 创建临界区

  
pthread_mutex_t crit_section_mutex = PTHREAD_MUTEX_INITIALIZER;

...

pthread_mutex_lock( &crit_section_mutex );

/* Inside the critical section. Memory access is safe here
 * for the memory protected by the crit_section_mutex.
 */

pthread_mutex_unlock( &crit_section_mutex );

如果多个线程在完成上面的初始调用后尝试锁定信号量,则这些线程会被阻塞,它们的请求进入队列,直到执行 pthread_mutex_unlock 调用。

SMP 的内核变量保护

如果处理器中的多个核心为内核并发运作,则希望避免共享那些特定于给定核心的数据。出于此原因,2.6 内核引入了 per-CPU 变量的概念,这些变量与单个 CPU 相关联。这允许将某个 CPU 通常访问的变量声明为该 CPU 专有的变量。使用此方法使锁定需求最小化并提高了性能。

per-CPU 变量由 DEFINE_PER_CPU 宏进行定义,需要为该宏提供类型和变量名称。由于宏的运作方式与 l-value 类似,因此也可在宏中进行变量的初始化。下面的示例(来自 ./arch/i386/kernel/smpboot.c)定义了一个变量,它用于表示系统中每个 CPU 的状态。

/* State of each CPU. */
DEFINE_PER_CPU(int, cpu_state) = { 0 };

该宏创建了一个变量数组(每个 CPU 一个变量)。要访问 per-CPU 变量,需将 per_cpu 宏和 smp_processor_id 结合使用,后者是一个函数,用于返回当前执行代码的当前 CPU 的标识符。

per_cpu( cpu_state, smp_processor_id() ) = CPU_ONLINE;

内核提供了用于 per-CPU 锁定和变量动态分配的其他函数。可在 ./include/linux/percpu.h 中查找这些函数。

结束语

当处理器频率达到其极限时,一种流行的提高性能的方法是添加更多的处理器。在早期,这就意味着将更多的处理器添加到主板上,或将多个独立计算机集群到一起。现在,芯片级多处理能够在单个芯片上提供更多的 CPU,由于减少了内存延迟,因而可获得更高的性能。

您会发现 SMP 系统不仅存在于服务器中,还存在于桌面上,特别是在引入虚拟化以后。跟大多数先进技术一样,Linux 提供 SMP 支持。内核负责完成可用 CPU 间的负载优化(从线程到虚拟化操作系统)。惟一要做的就是确保应用程序可被充分地多线程化以便使用 SMP 的能力。

原文链接:http://www.ibm.com/developerworks/cn/linux/l-linux-smp/index.html



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2 3下一页


上一篇:Relay:一种高效的数据传输技术   下一篇:使用 Linux 系统调用的内核命令

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
·使用 Linux 系统调用的内核命令
·Linux 和对称多处理
·Relay:一种高效的数据传输技术
·使用 SystemTap 调试内核
·配置FreeBSD内核
·在FreeBSD4.x中制作启动菜单
·制作软盘上运行的FreeBSD系统
·FreeBSD光盘运行版的制作过程
·制作RAMDISK in KERNEL的NetBSD
·制作RAMDISK in KERNEL的OpenBSD
推荐文章
·几个重要的RedHatLinux内核文件介绍
·深入浅出分析Linux系统内核漏洞的问
·内核稳定版Linux 2.6.16.8正式发布
·定制Linux内核 充分发挥系统的潜能
·关于Linux系统内核抢占补丁的原理说
·精华:升级Linux操作系统内核奋斗记
·重新编译Linux操作系统的内核指南
·通过Linux内核观察/proc/pid/statm
精彩文章
·Linux内核源代码的目录结构简单介绍
·怎么样编译一个操作系统内核-Ubuntu
·开源技术评论:Unix内核的“新生命
·基于Linux操作系统内核汉化大揭秘
·深入浅出分析Linux系统内核漏洞的问
·架设基于Linux(2.6.14内核)服务器集
·Linux系统内核中的Device Mapper机
·改善Linux内核和可伸缩性适应企业环
·高手讲道:怎么样编译linux操作系统
·详细解析Linux操作系统的内核空间保
·学习指导:关于Linux内核学习的误区
·Linux系统内核抢占补丁的原理(代码
·剖析Linux 2.6内核移植-内核设置篇
·剖析Linux 2.6内核移植—系统移植篇
·Linux内核可装载模块对设备驱动的影
·Linux内核怎么样接收不同类型以太帧
·Linux系统内核网络参数的意义及应用
·制作软盘上运行的FreeBSD系统
·Linux操作系统内核和设备文件对话
·调整内核网络参数提高Linux系统安全
·红帽子发布安全公告 修补16个内核漏
·开源空间:自己做个迷你型linux内核
·奇妙的 sys 请求
·Linux可加载内核模块:入侵响应分析
·Linux系统内核新型包过滤结构的使用
·使用异步 I/O 大大提高应用程序的性
Power by linux-cn.com 粤ICP备05006655号