『壹』 boost atomic 需要什么头文件
需定义相应的宏,如你不希望使用date_time库的动态链接库,你可以定义BOOST_DATE_TIME_SOURCE和BOOST_DATE_TIME_NO_LIB来使用切入源码的方式。不同库需要定义不同的宏
『贰』 请教linux下如何实现原子自增操作
Linux的源码中x86体系结构原子操作的定义文件为。linux2.6/include/asm-i386/atomic.h文件内定义了原子类型atomic_t,其仅有一个字段counter,用于保存32位的数据。typedef struct { volatile int counter; } atomic_t;其中原子操作函数atomic_inc完成自加原子操作。/** * atomic_inc – increment atomic variable * @v: pointer of type atomic_t * * Atomically increments @v by 1. */static __inline__ void atomic_inc(atomic_t *v){ __asm__ __volatile__( LOCK "incl %0" :"=m" (v->counter) :"m" (v->counter));}其中LOCK宏的定义为。#ifdef CONFIG_SMP #define LOCK "lock ; "#else #define LOCK ""#endif可见,在对称多处理器架构的情况下,LOCK被解释为指令前缀lock。而对于单处理器架构,LOCK不包含任何内容。
『叁』 linux源代码,求详细分析,代码如下,来自 /mm: filemap.h
找到了个帖子,你可以参考参考。原帖地址: 参考:如果你没有安装Berkeley db(8)库软件包,或不知是否拥有;你就需要在Makefile文件中去除对它的支持。编辑你的Makefile文件,查找以DBMDEF开始的行: DBMDEF= -DNDBM –DNEWDB –DINS ?这一行 删除这个部分 删除字符串“-DNEWDB”这个部分后,修改完成后,结果如下所示: DBMDEF= -DNDBM –DNIS ?删除以后 接着查找以LIBS开始的行: LIBS= -ldb -ldbm -lresolv?这一行(不完全准确) 删除这个部分 删除这行的字符串“-ldb”这个部分,修改完成后,结果如下所示: LIBS= -ldbm -lresolv ?删除以后 这样就完成了从你的Makefile中删除对Berkeley db的支持。 如果你的系统支持Berkeley db的话,则你还需要给Makefile一些消息。必须指定正确的头文件和库函数的路径,以便将其包含到sendmail中去。查找以INCDIRS开始的行: INCDIRS=-I/usr/sww/include ?这一行 # loader options LDOPTS= -Bstatic # Library directories LIBDIRS=-L/usr/sww/lib ?还有这一行 你需要将这两行中的路径名改为Berkeley db的库所在路径。如果你无法确定,最好去除对Berkeley db的支持。 INCDIRS=-I/usr/local/include/db ?新的 # loader options LDOPTS= -Bstatic # Library directories LIBDIRS=-L/usr/local/lib ?新的 上面这个修改的例子,是基于Berkeley db的头文件在/usr/local/include/db,库文件在/usr/local/lib目录下所做的,可供参考。希望以上内容对你有所帮助!
『肆』 初识电脑对电脑中的英文不了解.可以告诉一些常用的常见的电脑术语么
一群性质相近同的「东西」,如果译名一贯,阅读的感觉就很好。 一贯性的术语,扩充性高,延伸性高,系统化高。 ● 我喜欢「式」: constructor 建构式 declaration 宣告式 definition 定义式 destructor 解构式 expression 算式(运算式) function 函式 pattern 范式、模式、样式 program 程式 signature 标记式 ● 我喜欢「件」:(这是个弹性非常大的可组合字) assembly (装)配件 component 组件 construct 构件 control 控件 event 事件 hardware 硬件 object 物件 part 零件、部件 singleton 单件 software 软件 work 工件、机件 ● 我喜欢「器」: adapter 配接器 allocator 配置器 compiler 编译器 container 容器 iterator 迭代器 linker 联(连)结器 listener 监听器 ● 我喜欢「别」: class 类别 type 型别 ● 我喜欢「化」: generalized 泛化 specialized 特化 overloaded 多载化(重载) ● 我喜欢「型」: polymorphism 多型 genericity 泛型 ● 我喜欢「程」: process 行程(or 进程,大陆用语) thread 线程(大陆用语) programming 编程 ●英中繁简编程术语对照 英文 繁体译词 (有些是侯捷个人喜好,普及与否难说) 大陆惯用术语 ————————————————————————————— #define 定义 预定义 abstract 抽象的 抽象的 abstraction 抽象体、抽象物、抽象性 抽象体、抽象物、抽象性 access 存取、取用 存取、访问 access function 存取函式 存取函数 activate active adapter 配接器 适配器 address 位址 地址 address space 位址空间,定址空间 address-of operator 取址运算子 取地址运算符 aggregation 聚合 algorithm 演算法 算法 allocate 配置 分配 allocator (空间)配置器 分配器 application 应用程式 应用、应用程序 application framework 应用程式框架、应用框架 应用程序框架 argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头运算符 assembly 配件 assembly language 组合语言 汇编语言 assign 指派、指定、设值、赋值 赋值 assignment 指派、指定 赋值、分配 assignment operator 指派(赋值)运算子 = 赋值运算符 associated 相应的、相关的 相关的、关联、相应的 associative container 关联式容器(对应 sequential container) 关联式容器 atomic 不可分割的 原子的 attribute 属性 特性 background 背景 背景(用於图形着色) 后台(用於行程) base class 基础类别 基类 base type 基础型别 (等同於 base class) batch 批次(意思是整批作业) 批处理 best viable function 最佳可行函式 最佳可行函式 (从 viable functions 中挑出的最佳吻合者) binary search 二分搜寻法 二分查找 binary tree 二元树 二叉树 binary operator 二元运算子 二元运算符 binding 系结 绑定 bit 位元 位 bit field 位元栏 ? 位域 bitmap 位元图 ? 位图 bitwise 以 bit 为单元逐一┅ ? bitwise 以 bit 为单元进行复制;位元逐一复制 位拷贝 block 区块 块、区块、语句块 boolean 布林值(真假值,true 或 false) 布尔值 border 边框、框线 边框 brace(curly brace) 大括弧、大括号 花括弧、花括号 bracket(square brakcet) 中括弧、中括号 方括弧、方括号 breakpoint 中断点 断点 build-in 内建 内置 bus 汇流排 byte 位元组(由 8 bits 组成) 字节 cache 快取 高速缓存 call 呼叫、叫用 调用 callback 回呼 回调 call operator call(函式呼叫)运算子 () 调用运算符 (同 function call operator) candidate function 候选函式 候选函数 (在函式多载决议程序中出现的候选函式) chain 串链(例 chain of function calls) 链 character 字元 字符 check box 核取方块 (i.e. check button) 复选框 check button 方钮 (i.e. check box) 复选按钮 child class 子类别(或称为derived class, subtype) 子类 class 类别 类 class body 类别本体 类体 ? class declaration 类别宣告、类别宣告式 类声明 class definition 类别定义、类别定义式 类定义 class derivation list 类别衍化列 类继承列表 class head 类别表头 类头 ? class hierarchy 类别继承体系, 类别阶层 类层次体系 class library 类别程式库、类别库 类库 class template 类别模板、类别范本 类模板 class template partial specializations 类别模板偏特化 类模板部分特化 class template specializations 类别模板特化 类模板特化 cleanup 清理、善后 清理、清除 client 客端、客户端、用户端 客户端 client-server 主从架构 客户/服务器 clipboard 剪贴簿 剪贴板 clone 复制 克隆 (易与 混淆) collection 群集 集合 ? combo box 复合方块、复合框 组合框 command line 命令列 命令行 (系统文字模式下的整行执行命令) communication 通讯 通讯 compile time 编译期 编译期、编译时 compiler 编译器 编译器 component 组件 组件 composition 复合、合成、组合 组合 computer 电脑、计算机 计算机、电脑 concrete 具象的 实在的 concurrent 并行 并发 configuration 组态 配置 container 容器 容器 (存放资料的某种结构如 list, vector…) context 背景关系、周遭环境、上下脉络 环境、上下文 control 控制元件、控件 控件 const 常数(constant 的缩写,C++ 关键字) constant 常数(相对於 variable) 常量、常数 constructor(ctor) 建构式 构造函数、构造器 (与class 同名的一种 member functions) 复制、拷贝 拷贝 cover 涵盖 覆盖 create 产生、生成 创建、生成 creation 产生、生成 创建、生成 data 资料 数据 data member 资料成员、成员变数 数据成员、成员变量 data structure 资料结构 数据结构 datagram 资料元 数据报文 dead lock 死结 死锁 debug 除错 调试 declaration 宣告、宣告式 声明 dection 推导(例:template argument dection) 推导、推断 default 预设 缺省、默认 definition 定义、定义区、定义式 定义 delegate 委派、委托、委任 delegation (同上) dereference 提领(取出指标所指物体的内容) 解叁考 dereference operator dereference(提领)运算子 * 解叁考算符 derived class 衍生类别 派生类 design by contract 契约式设计 design pattern 设计样式 设计模式 ※ 最近我比较喜欢「设计范式」一词 destructor(dtor) 解构式 析构函数、析构器 device 装置、设备 设备 dialog 对话窗、对话盒 对话框 directive 指令(例:using directive) (编译)指示符 directory 目录 目录 distributed computing 分布式计算 (分布式电算) 分布式计算 分散式计算 (分散式电算) document 文件 文档 dot operator dot(句点)运算子 . (圆)点运算符 driver 驱动程式 驱动(程序) dynamic binding 动态系结 动态绑定 efficiency 高效、效率、效能 entity 物体 实体、物体 encapsulation 封装 封装 enclosing class 外围类别(与巢状类别 nested class 有关)外围类 enum (enumeration) 列举(一种 C++ 资料型别) 枚举 enumerators 列举元(enum 型别中的成员) 枚举成员、枚举器 equality operator equality(等号)运算子 == 等号运算符 evaluate 评估、求值、核定 评估 event 事件 事件 event driven 事件驱动的 事件驱动的 exception 异常情况 异常 exception declaration 异常宣告(ref. C++ Primer 3/e, 11.3) 异常声明 exception handling 异常处理、异常处理机制 异常处理、异常处理机制 exception specification 异常规格(ref. C++ Primer 3/e, 11.4) 异常规范 exit 退离(指离开函式时的那一个执行点) 退出 explicit 明白的、明显的、显式 显式 export 汇出 引出、导出 expression 运算式、算式 表达式 facility 设施、设备 设施、设备 feature 特性 field 栏位 字段 file 档案 文件 firmware 韧体 固件 flush 清理、扫清 刷新 form 表单(programming 用语) formal parameter 形式叁数 形式叁数 forward declaration 前置宣告 前置声明 fractal 碎形 分形 framework 框架 框架 full specialization 全特化(ref. partial specialization) ? function 函式、函数 函数 function call operator 同 call operator function object 函式物件(ref. C++ Primer 3/e, 12.3) 函数对象 function overloaded resolution 函式多载决议程序 函数重载解决(方案) function template 函式模板、函式范本 函数模板 functor 仿函式 仿函式、函子 generic 泛型、一般化的 一般化的、通用的、泛化 generic algorithm 泛型演算法 通用算法 global 全域性的(对应於 local) 全局的 global scope resolution operator 全域生存空间(范围决议)运算子 :: 全局范围解析运算符 group 群组 ? group box 群组方块 分组框 hand shaking 握手协商 handle 识别码、识别号、号码牌、权柄 句柄 handler 处理常式 处理函数 hardware 硬体 硬件 hash table 杂凑表 哈希表、散列表 header file 表头档、标头档 头文件 heap 堆积 堆 hierarchy 阶层体系 层次结构(体系) hook 挂钩 钩子 hyperlink 超链结 超链接 IDE 整合开发环境 集成开发环境 identifier 识别字、识别符号 标识符 immediate base 直接的(紧临的)上层 base class。 直接上层基类 immediate derived 直接的(紧临的)下层 derived class。 直接下层派生类 implement 实作 实现 implementation 实作品、实作物、实作体、实作码 实现 implicit 隐喻的、暗自的、隐式 隐式 import 汇入 导入 increment operator 累加运算子 ++ 增加运算符 information 资讯 信息 infrastructure 公共基础建设 inheritance 继承、继承机制 继承、继承机制 inline 行内 内联 inline expansion 行内展开 内联展开 initialization 初始化(动作) 初始化 initialization list 初值列 初始值列表 initialize 初始化 初始化 instance 实体 实例 (根据某种表述而实际产生的「东西」) instantiated 具现化、实体化(常应用於 template) 实例化 instantiation 具现体、具现化实体(常应用於 template) 实例 integrate 整合 集成 interface 介面 接口 invoke 唤起 调用 iterate 迭代(回圈一个轮回一个轮回地进行) 迭代 iterative 反覆的,迭代的 iterator 迭代器(一种泛型指标) 迭代器 iteration 迭代(回圈每次轮回称为一个 iteration) 迭代 item 项目、条款 项、条款、项目 laser 雷射 激光 level 阶 层 例 high level 高阶 高层 library 程式库、函式库 库、函数库 lifetime 生命期、寿命 生命期、寿命 link 联结、连结 连接 linker 联结器、连结器 连接器 literal constant 字面常数(例 3.14 或 "hi" 这等常数值) 字面常数 list 串列(linked-list) 列表、表、链表 list box 列表方块、列表框 列表框 load 载入 装载、加载 loader 载入器 装载器、载入器 local 区域性的(对应於 global) 局部的 lock 机锁 loop 回圈 循环 lvalue 左值 左值 macro 巨集 宏 maintain 维护 维护 manipulator 操纵器(iostream 预先定义的一种东西) 操纵器 mechanism 机制 机制 member 成员 成员 member access operator 成员取用运算子(有 dot 和 arrow 两种) 成员存取运算符 member function 成员函式 成员函数 member initialization list 成员初值列 成员初始值列表 memberwise 以 member 为单元┅、members 逐一┅ 以成员为单位 memberwise 以 members 为单元逐一复制 memory 记忆体 内存 menu 表单、选单 菜单 message 讯息 消息 message based 以讯息为基础的 基於消息的 message loop 讯息回圈 消息环 method (java) 方法、行为 micro 微 微 modeling 模塑 modeling language 塑模语言,建模语言 mole 模组 模块 most derived class 最末层衍生类别 最底层的派生类 mouse 滑鼠 鼠标 mutable 可变的 可变的 multi-tasking 多工 多任务 namespace 命名空间 名字空间、命名空间 nested class 巢状类别 嵌套类 object 物件 对象 object based 以物件为基础的 基於对象的 object model 物件模型 对象模型 object oriented 物件导向的 面向对象的 online 线上 在线 operand 运算元 操作数 operating system (OS)
『伍』 C++ 编译时提示 'xxx' does not name a type
ANode 是AClass中的一个private类型,find的返回参数是public的,却要用到private的类型,就有问题了。
在一个源文件中,要声明或定义一个类的指针时,必须在使用前声明或定义该类,因此下面的代码会报错:
class A{public: B *b;};class B{public: A *a;};int main(){ return 0;}12345678910111213141516
报错为“error: ‘B’ does not name a type”,就是因为在A类中使用B *b之前没有声明或定义B类,如果在第一行加上一句前置声明(forward declaration)“class B;”,就不会有这样的问题了。而在头文件互相包含时,也会引发“error: ‘xxx’ does not name a type”,其报错原因和上面的代码是相同的,请看下面的代码:a.h:
#ifndef A_H_INCLUDED#define A_H_INCLUDED#include "b.h"class A{public: B *b;};#endif // A_H_INCLUDED123456789101112
b.h:
#ifndef B_H_INCLUDED#define B_H_INCLUDED#include "a.h"class B{public: A *a;};#endif // B_H_INCLUDED123456789101112
main.cpp:
#include "a.h"#include "b.h"int main(){ return 0;}1234567
编译就会报错:“error: ‘A’ does not name a type”,为什么会这样呢?我们看看a.h经过预处理会展开成什么样子呢,预处理命令为“gcc -E -o a.i a.h”:
# 1 "a.h"# 1 "<built-in>"# 1 "<command-line>"# 1 "a.h"# 1 "b.h" 1# 1 "a.h" 1# 5 "b.h" 2class B{public: A *a;};# 5 "a.h" 2class A{public: B *b;};
忽略以“#”开头的行,我们发现它现在和开头的那个源文件几乎是一样的,只是类的顺序交换了,因此出错原因和开头的那个源文件是一样的。解决方法也很简单,把a.h的“#include “b.h””替换为B类的前置声明“class B;”,在b.h中也进行类似的修改。这样的话,就不会导致问题了。当然,这么做是有前提的:在A类中的成员只有B类的指针,而不能有B类的变量;同时不能在A类头文件中访问B类的成员或成员函数。无论哪种情况A类都需要知道B类的大小或其他细节,前置声明无法提供这些细节,又会出现类似“error: field ‘b’ has incomplete type ‘B’”这样的问题。
『陆』 "The first use of atomic weapon(原子弹)was in 1945, and their power _________ inc"
答案C本题考查动词的时态。ever since从那以后,指从1945以后到现在,所以句子应该用现在完成时态。
『柒』 电脑里常用的的英语有那些(汉语意思)
硬件类(Hardware) 软件类(Software) 网络类(Network) CPU(Center Processor Unit)中央处理单元 mainboard主板 RAM(random access memory)随机存储器(内存) ROM(Read Only Memory)只读存储器 Floppy Disk软盘 Hard Disk硬盘 CD-ROM光盘驱动器(光驱) monitor监视器 keyboard键盘 mouse鼠标 chip芯片 CD-R光盘刻录机 HUB集线器 Modem= MOlator-DEMolator,调制解调器 P-P(Plug and Play)即插即用 UPS(Uninterruptable Power Supply)不间断电源 BIOS(Basic-input-Output System)基本输入输出系统 CMOS(Complementary Metal-Oxide-Semiconctor)互补金属氧化物半导体 setup安装 uninstall卸载 wizzard向导 OS(Operation Systrem)操作系统 OA(Office AutoMation)办公自动化 exit退出 edit编辑 复制 cut剪切 paste粘贴 delete删除 select选择 find查找 select all全选 replace替换 undo撤消 redo重做 program程序 license许可(证) back前一步 next下一步 finish结束 folder文件夹 Destination Folder目的文件夹 user用户 click点击 double click双击 right click右击 settings设置 update更新 release发布 data数据 data base数据库 DBMS(Data Base Manege System)数据库管理系统 view视图 insert插入 object对象 configuration配置 command命令 document文档 POST(power-on-self-test)电源自检程序 cursor光标 attribute属性 icon图标 service pack服务补丁 option pack功能补丁 Demo演示 short cut快捷方式 exception异常 debug调试 previous前一个 column行 row列 restart重新启动 text文本 font字体 size大小 scale比例 interface界面 function函数 access访问 manual指南 active激活 computer language计算机语言 menu菜单 GUI(graphical user interfaces )图形用户界面 template模版 page setup页面设置 password口令 code密码 print preview打印预览 zoom in放大 zoom out缩小 pan漫游 cruise漫游 full screen全屏 tool bar工具条 status bar状态条 ruler标尺 table表 paragraph段落 symbol符号 style风格 execute执行 graphics图形 image图像 Unix用于服务器的一种操作系统 Mac OS苹果公司开发的操作系统 OO(Object-Oriented)面向对象 virus病毒 file文件 open打开 colse关闭 new新建 save保存 exit退出 clear清除 default默认 LAN局域网 WAN广域网 Client/Server客户机/服务器 ATM( Asynchronous Transfer Mode)异步传输模式 Windows NT微软公司的网络操作系统 Internet互联网 WWW(World Wide Web)万维网 protocol协议 HTTP超文本传输协议 FTP文件传输协议 Browser浏览器 homepage主页 Webpage网页 website网站 URL在Internet的WWW服务程序上 用于指定信息位置的表示方法 Online在线 Email电子邮件 ICQ网上寻呼 Firewall防火墙 Gateway网关 HTML超文本标识语言 hypertext超文本 hyperlink超级链接 IP(Address)互联网协议(地址) SearchEngine搜索引擎 TCP/IP用于网络的一组通讯协议 Telnet远程登录 IE(Internet Explorer)探索者(微软公司的网络浏览器) Navigator引航者(网景公司的浏览器) multimedia多媒体 ISO国际标准化组织 ANSI美国国家标准协会 able 能 activefile 活动文件 addwatch 添加监视点 allfiles 所有文件 allrightsreserved 所有的权力保留 altdirlst 切换目录格式 并能够解决更大范围内的磁盘问题 andotherinFORMation 以及其它的信息 archivefileattribute 归档文件属性 assignto 指定到 autoanswer 自动应答 autodetect 自动检测 autoindent 自动缩进 autosave 自动存储 availableonvolume 该盘剩余空间 badcommand 命令错 badcommandorfilename 命令或文件名错 batchparameters 批处理参数 binaryfile 二进制文件 binaryfiles 二进制文件 borlandinternational borland国际公司 bottommargin 页下空白 bydate 按日期 byextension 按扩展名 byname 按名称 bytesfree 字节空闲 callstack 调用栈 casesensitive 区分大小写 要求出现确认提示,在你想覆盖一个 centralpointsoftwareinc central point 软件股份公司 changedirectory 更换目录 changedrive 改变驱动器 changename 更改名称 characterset 字符集 checkingfor 正在检查 检查磁盘并显示一个状态报告 chgdrivepath 改变盘/路径 china 中国 chooseoneofthefollowing 从下列中选一项 clearall 全部清除 clearallbreakpoints 清除所有断点 clearsanattribute 清除属性 clearscommandhistory 清除命令历史 clearscreen 清除屏幕 closeall 关闭所有文件 codegeneration 代码生成 colorpalette 彩色调色板 commandline 命令行 commandprompt 命令提示符 compressedfile 压缩文件 配置硬盘,以为 MS-DOS 所用 conventionalmemory 常规内存 ***ceptemptyones 拷贝目录和子目录,空的除外 拷贝设置了归档属性的文件 把文件拷贝或搬移至另一地方 把一个软盘的内容拷贝到另一个软盘上 diskette 复制磁盘 C拷贝M移动 O比 F搜索R改名 D删除 V版本 E浏览A属性 W写字 P打印 L列表 rightc 版权(c 创建DOS分区或逻辑DOS驱动器 createextendeddospartition 创建扩展DOS分区 在扩展DOS分区中创建逻辑DOS驱动器 createprimarydospartition 创建DOS主分区 createsadirectory 创建一个目录 创建,改变或删除磁盘的卷标 currentfile 当前文件 currentfixeddiskdrive 当前硬盘驱动器 currentsettings 当前设置 currenttime 当前时间 cursorposition 光标位置 defrag 整理碎片 dele 删去 删除分区或逻辑DOS驱动器 删除一个目录和所有的子目录及其中的所有文件 deltree 删除树 devicedriver 设备驱动程序 dialogbox 对话栏 directionkeys 方向键 directly 直接地 directorylistargument 目录显示变量 directoryof 目录清单 directorystructure 目录结构 diskaccess 磁盘存取 disk 磁盘拷贝 磁盘服务功能: C拷贝 O比较 F搜索R改卷名V校验 浏览E编缉M图 L找文件 N格式化 diskspace 磁盘空间 displayfile 显示文件 displayoptions 显示选项 displaypartitioninFORMation 显示分区信息 显示指定目录和所有目录下的文件 显示指定属性的文件 显示或改变文件属性 displaysorsetsthedate 显示或设备日期 以单色而非彩色显示安装屏信息 显示系统中已用和未用的内存数量 显示磁盘上所有文件的完整路径和名称 显示或改变当前目录 doctor 医生 doesn 不 doesntchangetheattribute 不要改变属性 dosshell DOS 外壳 doubleclick 双击 你想显示逻辑驱动器信息吗(y/n)? driveletter 驱动器名 editmenu 编辑选单 emsmemory ems内存 endoffile 文件尾 endofline 行尾 enterchoice 输入选择 entiredisk 转换磁盘 environmentvariable 环境变量 esc esc everyfileandsubdirectory 所有的文件和子目录 existingdestinationfile 已存在的目录文件时 expandedmemory 扩充内存 expandtabs 扩充标签 explicitly 明确地 extendedmemory 扩展内存 fastest 最快的 fatfilesystem fat 文件系统 fdiskoptions fdisk选项 fileattributes 文件属性 fileFORMat 文件格式 filefunctions 文件功能 fileselection 文件选择 fileselectionargument 文件选择变元 filesin 文件在 filesinsubdir 子目录中文件 fileslisted 列出文件 filespec 文件说明 filespecification 文件标识 filesselected 选中文件 findfile 文件查寻 fixeddisk 硬盘 fixeddisksetupprogram 硬盘安装程序 fixeserrorsonthedisk 解决磁盘错误 floppydisk 软盘 FORMatdiskette 格式化磁盘 FORMatsadiskforusewithmsdos 格式化用于MS-DOS的磁盘 FORMfeed 进纸 freememory 闲置内存 fullscreen 全屏幕 functionprocere 函数过程 graphical 图解的 graphicslibrary 图形库 groupdirectoriesfirst 先显示目录组 hangup 挂断 harddisk 硬盘 hardwaredetection 硬件检测 ha**een 已经 helpfile 帮助文件 helpindex 帮助索引 helpinFORMation 帮助信息 helppath 帮助路径 helpscreen 帮助屏 helptext 帮助说明 helptopics 帮助主题 helpwindow 帮助窗口 hiddenfile 隐含文件 hiddenfileattribute 隐含文件属性 hiddenfiles 隐含文件 howto 操作方式 ignorecase 忽略大小写 在常规和上位内存 incorrectdos 不正确的DOS incorrectdosversion DOS 版本不正确 indicatesabinaryfile 表示是一个二进制文件 indicatesanasciitextfile 表示是一个ascii文本文件 insertmode 插入方式 请用scandisk,不要用chkdsk inuse 在使用 invaliddirectory 无效的目录 is 是 kbytes 千字节 keyboardtype 键盘类型 labeldisk 标注磁盘 laptop 膝上 largestexecutableprogram 最大可执行程序 largestmemoryblockavailable 最大内存块可用 lefthanded 左手习惯 leftmargin 左边界 linenumber 行号 linenumbers 行号 linespacing 行间距 listbyfilesinsortedorder 按指定顺序显示文件 listfile 列表文件 listof 清单 locatefile 文件定位 lookat 查看 lookup 查找 macroname 宏名字 makedirectory 创建目录 memoryinfo 内存信息 memorymodel 内存模式 menubar 菜单条 menucommand 菜单命令 menus 菜单 messagewindow 信息窗口 microsoft 微软 microsoftantivirus 微软反病毒软件 microsoftcorporation 微软公司 mini 小的 modemsetup 调制解调器安装 molename 模块名 monitormode 监控状态 monochromemonitor 单色监视器 moveto 移至 multi 多 newdata 新建数据 newer 更新的 newfile 新文件 newname 新名称 newwindow 新建窗口 norton norton nostack 栈未定义 noteusedeltreecautiously 注意:小心使用deltree onlinehelp 联机求助 optionally 可选择地 or 或 pageframe 页面 pagelength 页长 在显示每屏信息后暂停一下 pctools pc工具 postscript 附言 prefixmeaningnot 前缀意即"不 prefixtoreverseorder 反向显示的前缀 presetche** 用前缀和放在短横线-后的开关(例如/-w)预置开关 pressakeytoresume 按一键继续 pressanykeyforfilefunctions 敲任意键执行文件功能 pressentertokeepthesamedate 敲回车以保持相同的日期 pressentertokeepthesametime 敲回车以保持相同的时间 pressesctocontinue 敲esc继续 pressesctoexit 敲键退出 pressesctoexitfdisk 敲esc退出fdisk 敲esc返回fdisk选项
『捌』 新手求教LINUX下的原子操作该怎么写
linux中关于原子操作
2016年08月02日
原子操作:就是在执行某一操作时不被打断。
linux原子操作问题来源于中断、进程的抢占以及多核smp系统中程序的并发执行。
对于临界区的操作可以加锁来保证原子性,对于全局变量或静态变量操作则需要依赖于硬件平台的原子变量操作。
因此原子操作有两类:一类是各种临界区的锁,一类是操作原子变量的函数。
对于arm来说,单条汇编指令都是原子的,多核smp也是,因为有总线仲裁所以cpu可以单独占用总线直到指令结束,多核系统中的原子操作通常使用内存栅障(memory barrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内存操作或者不对指定的内存进行操作,这样才能避免数据竞争问题。但是对于load update store这个过程可能被中断、抢占,所以arm指令集有增加了ldrex/strex这样的实现load update store的原子指令。
但是linux种对于c/c++程序(一条c编译成多条汇编),由于上述提到的原因不能保证原子性,因此linux提供了一套函数来操作全局变量或静态变量。
一.整型原子操作定义于#include<asm/atomic.h>分为 定义,获取,加减,测试,返回。void atomic_set(atomic_t *v,int i); //设置原子变量v的值为iatomic_t v = ATOMIC_INIT(0); //定义原子变量v,并初始化为0;atomic_read(atomic_t* v); //返回原子变量v的值;void atomic_add(int i, atomic_t* v); //原子变量v增加i;void atomic_sub(int i, atomic_t* v); void atomic_inc(atomic_t* v); //原子变量增加1;void atomic_dec(atomic_t* v);int atomic_inc_and_test(atomic_t* v); //先自增1,然后测试其值是否为0,若为0,则返回true,否则返回false;int atomic_dec_and_test(atomic_t* v); int atomic_sub_and_test(int i, atomic_t* v); //先减i,然后测试其值是否为0,若为0,则返回true,否则返回false;注意:只有自加,没有加操作int atomic_add_return(int i, atomic_t* v); //v的值加i后返回新的值;int atomic_sub_return(int i, atomic_t* v); int atomic_inc_return(atomic_t* v); //v的值自增1后返回新的值;int atomic_dec_return(atomic_t* v);二.位原子操作定义于#include<asm/bitops.h>分为 设置,清除,改变,测试void set_bit(int nr, volatile void* addr); //设置地址addr的第nr位,所谓设置位,就是把位写为1;void clear_bit(int nr, volatile void* addr); //清除地址addr的第nr位,所谓清除位,就是把位写为0;void change_bit(int nr, volatile void* addr); //把地址addr的第nr位反转;int test_bit(int nr, volatile void* addr); //返回地址addr的第nr位;int test_and_set_bit(int nr, volatile void* addr);//测试并设置位;若addr的第nr位非0,则返回true; 若addr的第nr位为0,则返回false;int test_and_clear_bit(int nr, volatile void* addr);//测试并清除位;int test_and_change_bit(int nr, volatile void* addr);//测试并反转位;上述操作等同于先执行test_bit(nr,voidaddr)然后在执行xxx_bit(nr,voidaddr)举个简单例子:为了实现设备只能被一个进程打开,从而避免竞态的出现static atomic_t scull_available = ATOMIC_INIT(1);//init atomic在scull_open 函数和scull_close函数中:int scull_open(struct inode *inode, struct file *filp){ struct scull_dev *dev; // device information dev = container_of(inode->i_cdev, struct scull_dev, cdev); filp->private_data = dev;// for other methods if(!atomic_dec_and_test(&scull_available)){ atomic_inc(&scull_available); return -EBUSY; } return 0; // success}int scull_release(struct inode *inode, struct file *filp){ atomic_inc(&scull_available); return 0;}
假设原子变量的底层实现是由一个汇编指令实现的,这个原子性必然有保障。但是如果原子变量的实现是由多条指令组合而成的,那么对于SMP和中断的介入会不会有什么影响呢?我在看ARM的原子变量操作实现的时候,发现其是由多条汇编指令(ldrex/strex)实现的。在参考了别的书籍和资料后,发现大部分书中对这两条指令的描诉都是说他们是支持在SMP系统中实现多核共享内存的互斥访问。但在UP系统中使用,如果ldrex/strex和之间发生了中断,并在中断中也用ldrex/strex操作了同一个原子变量会不会有问题呢?就这个问题,我认真看了一下内核的ARM原子变量源码和ARM官方对于ldrex/strex的功能解释,总结如下:
一、ARM构架的原子变量实现结构
对于ARM构架的原子变量实现源码位于:arch/arm/include/asm/atomic.h
其主要的实现代码分为ARMv6以上(含v6)构架的实现和ARMv6版本以下的实现。
该文件的主要结构如下:
#if__LINUX_ARM_ARCH__>=6
……(通过ldrex/strex指令的汇编实现)
#else/*ARM_ARCH_6*/
#ifdef CONFIG_SMP
#errorSMPnotsupportedonpre-ARMv6 CPUs
#endif
……(通过关闭CPU中断的C语言实现)
#endif/*__LINUX_ARM_ARCH__*/
……
#ifndef CONFIG_GENERIC_ATOMIC64
……(通过ldrexd/strexd指令的汇编实现的64bit原子变量的访问)
#else/*!CONFIG_GENERIC_ATOMIC64*/
#include<asm-generic/atomic64.h>
#endif
#include<asm-generic/atomic-long.h>
这样的安排是依据ARM核心指令集版本的实现来做的:
(1)在ARMv6以上(含v6)构架有了多核的CPU,为了在多核之间同步数据和控制并发,ARM在内存访问上增加了独占监测(Exclusive monitors)机制(一种简单的状态机),并增加了相关的ldrex/strex指令。请先阅读以下参考资料(关键在于理解local monitor和Global monitor):
1.2.2.Exclusive monitors
4.2.12.LDREX和STREX
(2)对于ARMv6以前的构架不可能有多核CPU,所以对于变量的原子访问只需要关闭本CPU中断即可保证原子性。
对于(2),非常好理解。
但是(1)情况,我还是要通过源码的分析才认同这种代码,以下我仅仅分析最具有代表性的atomic_add源码,其他的API原理都一样。如果读者还不熟悉C内嵌汇编的格式,请参考《ARM GCC内嵌汇编手册》
二、内核对于ARM构架的atomic_add源码分析
/*
*ARMv6 UP 和 SMP 安全原子操作。 我们是用独占载入和
*独占存储来保证这些操作的原子性。我们可能会通过循环
*来保证成功更新变量。
*/
static inline void atomic_add(inti,atomic_t*v)
{
unsigned long tmp;
intresult;
__asm__ __volatile__("@ atomic_add"
"1: ldrex %0, [%3]"
" add %0, %0, %4"
" strex %1, %0, [%3]"
" teq %1, #0"
" bne 1b"
:"=&r"(result),"=&r"(tmp),"+Qo"(v->counter)
:"r"(&v->counter),"Ir"(i)
:"cc");
}
源码分析:
注意:根据内联汇编的语法,result、tmp、&v->counter对应的数据都放在了寄存器中操作。如果出现上下文切换,切换机制会做寄存器上下文保护。
(1)ldrex %0, [%3]
意思是将&v->counter指向的数据放入result中,并且(分别在Local monitor和Global monitor中)设置独占标志。
(2)add %0, %0, %4
result = result + i
(3)strex %1, %0, [%3]
意思是将result保存到&v->counter指向的内存中,此时Exclusive monitors会发挥作用,将保存是否成功的标志放入tmp中。
(4)teq %1, #0
测试strex是否成功(tmp == 0??)
(5)bne 1b
如果发现strex失败,从(1)再次执行。
通过上面的分析,可知关键在于strex的操作是否成功的判断上。而这个就归功于ARM的Exclusive monitors和ldrex/strex指令的机制。以下通过可能的情况分析ldrex/strex指令机制。(请阅读时参考4.2.12.LDREX和STREX)
1、UP系统或SMP系统中变量为非CPU间共享访问的情况
此情况下,仅有一个CPU可能访问变量,此时仅有Local monitor需要关注。
假设CPU执行到(2)的时候,来了一个中断,并在中断里使用ldrex/strex操作了同一个原子变量。则情况如下图所示:
虽然对于人来说,这种情况比较BT。但是在飞速运行的CPU来说,BT的事情随时都可能发生。
A:将该物理地址标记为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。
B:标记此物理地址为CPU1独占访问,并清除CPU1对其他任何物理地址的任何独占访问标记。
C:再次标记此物理地址为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。
D:已被标记为CPU0独占访问,进行存储并清除独占访问标记,并返回0(操作成功)。
E:没有标记为CPU1独占访问,不会进行存储,并返回1(操作失败)。
F:没有标记为CPU0独占访问,不会进行存储,并返回1(操作失败)。
当然还有其他许多复杂的可能,也可以通过ldrex/strex指令的机制分析出来。从上面列举的分析中,我们可以看出:ldrex/strex可以保证在任何情况下(包括被中断)的访问原子性。所以内核中ARM构架中的原子操作是可以信任的。