易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux内核的同步机制(一):原子操作

原子操作:UP和SMP的异同
原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断。在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。但是,在对称多处理器(Symetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。我们以decl(递减指令)为例,这是一个典型的"读-改-写"过程,涉及两次内存访问。设想在不同CPU运行的两个进程都在递减某个计数值,可能发生的情况是:
1. CPU A(上的进程,以下同)从内存单元把当前计数值(2)装载进它的寄存器中;
2. CPU B从内存单元把当前计数值(2)装载进它的寄存器中。
3. CPU A在它的寄存器中将计数值递减为1;
4. CPU B在它的寄存器中将计数值递减为1;
5. CPU A把修改后的计数值(1)写回内存单元。
6. CPU B把修改后的计数值(1)写回内存单元。
我们看到,内存里的计数值应该是0,然而它却是1。如果该计数值是一个共享资源的引用计数,每个进程都在递减后把该值与0进行比较,从而确定是否需要释放该共享资源。这时,两个进程都去掉了对该共享资源的引用,但没有一个进程能够释放它--两个进程都推断出:计数值是1,共享资源仍然在被使用。
原子性不可能由软件单独保证--必须需要硬件的支持,因此是和架构相关的。在x86平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。
Linux内核中的原子操作
Linux 2.4.21中,原子类型的定义和原子操作API都放在内核源码树的include/asm/atomic.h文件中,大部分使用汇编语言实现,因为c语言并不能实现这样的操作。
在x86的原子操作实现代码中,定义了LOCK宏,这个宏可以放在随后的内联汇编指令之前。如果是SMP,LOCK宏被扩展为lock指令;否则被定义为空--单CPU无需防止其它CPU的干扰,锁内存总线完全是在浪费时间。
#ifdef CONFIG_SMP
#define LOCK "lock ; "
#else
#define LOCK ""
#e


相关文档:

1)Linux程序设计入门

·     linux操作系统下c语言编程入门
(一)目录介绍
1)Linux程序设计入门--基础知识
2)Linux程序设计入门--进程介绍
3)Linux程序设计入门--文件操作
4)Linux程序设计入门--时间概念
5)Linux程序设计入门--信号处理
6)Linux程序设计入门--消息管理
7)Linux程序设计入门--线程 ......

linux串口应用开发

linux串口应用开发
2009年10月20日 星期二 14:16
1、串口概述
    用户常见的数据通信的基本方式有两种:并行通信和串行通信。
    串行通信是计算机常用的接口,如:RS-232-C接口。该标准规定采用一个DB25芯引脚连接器或DB9芯引脚连接器。芯片内部常具有UART控制器,其可工作于Interrup ......

在Linux上交叉编译pppd 2.4.4

在Linux上交叉编译pppd 2.4.4
1. 下载pppd 2.4.4的源代码
ftp://ftp.samba.org/pub/ppp/
2. 直接编译
#./configure
#make clean
#make
3. 交叉编译
修改./pppd-2.4.4/pppd/Makefile, 注释两行:
#wenxy comment #LIBS    += -lpcap
#wenxy comment #CFLAGS  += -DPPP_FILTER
cross compile ......

在Linux命令行下安装Oracle 10g

Oracle 10g支持在命令行下用静默模式(Silent)安装,给那些没有安装图形界面的Linux系统提供了极大的便利。
下面以Fedora Core 6为例,介绍在命令行下安装OracleOracle 10g的方法。
1 安装前的准备
准备工作要用登录为root用户来进行。
1.1 选择安装环境的语言
Oracle安装时可以通过环境变量LANG指定安装语言,如果Linu ......

linux进程间通信方式之匿名管道

linux的进程间通信方式主要有:匿名管道、有名管道、消息队列、共享内存、信号、信号量及信号灯、socket网络通信。近日由于项目需要,用linux编写arm的应用程序,里面有几个功能模块,若干进程,进程间的通信方式选择了管道、共享内存和信号量的配合。这几天终于把程序的框架搭建好了,而我也对管道通信有了进一步的认识。 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号