共享资源-> 竞态
自旋锁 信号量 是对 共享数据的保护,而不是对代码的保护。
感觉:
只要 掌握 自旋锁 spin_lock 这个 锁, 和 信号量 down_interruptible(&sem)这连个最常用的就可以了。
***********************************************************
信号量(semephore)是用于保护临界区的一种常用方法。他的使用方法与自旋锁类似。
相同之处:只有得到信号量的进程才能进入执行临界区代码。
不同之处:当获取不到信号量时,进程不会原地打转,而是进入 休眠 等待状 态。
获得信号量:
int down_interruptible(struct semaphore *sem);
该函数功能与down()类似,不同之处为,因为down()而进入睡眠状态的进程不能被信号打断,
而因为down_interruptible()而进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这时候函数的返回值非0
。。。。
if(down_interruptilble(&sem))
{
return -ERESTARTSYS;
}
。。。。
自己的理解:
首先执行 down_interruptible();
如果立即 获得信号量,则跳过if(),,向下继续执行。。
如果没有立即获得信号量,则进程进入睡眠等待状态,在进程睡眠等待的时候,可以响应中断,如果进程被信号打断,那么
函数down_interruptible(&sem) 返回一个非 0 的值,
-ERESTRATSYS,重新执行该系统调用(相当于重新启动)
互斥体:
int fastcall mutex_lock(struct mutex *lock)
***************************************************************************
当参数个数多于一个时,按照什么顺序把参数压入堆栈
函数调用后,由谁来把堆栈恢复原装 内存 还是 寄存器
在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:
stdcall
cdecl
fastcall
thiscall
naked call
fastcall
fastcall调用约定和stdcall类似,它意味着:
函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过
从右向左的顺序压栈
被调用函数清理堆栈
函数名修改规则同stdcall
其声明语法为:int fastcall function(int a,int b)
fastcall
1)参数压栈顺序从右到左。
2)如果可能使用寄存器(register)来传递参数。使用寄存器做参数比将参数压入堆栈(堆栈就是内存)快得多,所以叫fastcall。
http://tieba.baidu.com/f?kz=87050749 资料来源
***************************************************************************
**********************网上关于fastcall解答***************************************
最近在阅读Linux内核源代码的时候,发现有很多__attribute__其中有一个宏FASTCALL(x)或者fastcall用的就比较多,定 义如下:
#define FASTCALL(x)x __attribute__((regparm(3)))
#define fastcall __attribute__((regparm(3)))
意思是,最多可以使用3个寄存器(或许是eax,edx,ecx)来传送前3个参数,其他参数则压入栈中,而一般来说,函数的调用是基于栈的。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
意思就是使用0个寄存器来进行参数传递,顾名思义它是想使得调用这个函数时的所有参数都压入栈中,相对于FASTCALL的使用方式当然是要慢一些了
***************************the end************************************************