zoukankan      html  css  js  c++  java
  • Linux设备驱动程序 之 per-cpu变量

    数组形式

    支持SMP的现代操作系统使用每个cpu上的数据,对于给定的处理器其数据是唯一的;一般来说,每个cpu的数据存放在一个数组中,数组总的每一项对应着系统上的一个存在的处理器;按当前处理器号确定这个数组的当前元素;使用方式如下:

    1 unsigned long my_percpu[NR_CPUS];
    2 
    3 int cpu;
    4 
    5 cpu = get_cpu(); /* 获取当前处理器,并禁止抢占 */
    6 my_percpu[cpu]++; /* 对变量做处理 */
    7 put_cpu(); /* 激活内核抢占 */

    上面代码并没有出现锁,这是因为所操作的数据对当前处理器来说是唯一的;除了当前处理器之外,没有其他处理器可接触到这个数据,不存在并发访问的问题,所以当前处理器可以再不用锁的情况下安全访问它;

    现在,内核抢占成了唯一需要关注的问题了,内核抢占会引起下面的两个问题:

    1. 如果代码被其他处理器抢占并重新调度,那么这时cpu变量就会无效,因为它指向的是错误的处理器;(通常,代码获得当前处理器后是不可以睡眠的);

    2. 如果另一个任务抢占了代码,那么有可能在同一处理器上发生并发访问my_percpu的情况,显然属于一个竞态;

    上述代码中在调用get_put()时,禁止了内核抢占;相对的调用put_cpu()时又会重新激活当前处理器号;

    新的接口

    2.6内核开始为了方便创建和操作每个cpu数据,而引进了新的操作接口,称为percpu,该接口归纳了前面所述的操作行为,简化了创建和操作每个cpu的数据;

    但前面说的创建和访问每个cpu的方法仍然有效,不过大型对称多处理器计算机要求对每个cpu数据操作更简单,功能更强大,所以新接口应运而生;

    编译时的每个cpu数据

    编译期间定义每个cpu变量:

    1 DEFINE_PER_CPU(type,name)

    这个语句为系统中每个cpu都创建了一个类型为type,名称为name的变量实例,如果需要在别处声明变量,则应该使用下面的宏:

  • 相关阅读:
    postman的本地安装教程
    06-Hibernate中的持久化类
    05-Hibernate的核心API及使用c3p0连接池
    04-Hibernate的常见配置
    03-Hibernate的入门
    02-Hibernate的日志记录
    01-Hibernate框架的概述
    15-struts2 提供的异常处理
    14-struts2的表单标签
    13-struts2中json插件使用
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11761718.html
Copyright © 2011-2022 走看看