Linux设备驱动中的互斥机制(1)

合集下载

《Linux设备驱动开发》PDF课件

《Linux设备驱动开发》PDF课件

PDF 文件使用 "pdfFactory Pro" 试用版本创建
释 放
资可得 源获 内空 核间
华清远见
v 两个半部
中断
v 机制
Ø
tasklet 工作队列
1 /*定义tasklet和底半部函数并关联*/ 2 void xxx_do_tasklet(unsigned long); 3 DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);4 5 /*中断处理底半部*/ 6 void xxx_do_tasklet(unsigned long) 7 {... 9 } 11 /*中断处理顶半部*/ 12 irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs) 13 { 15 16 ...} ... tasklet_schedule(&xxx_tasklet);
驱中 立 设的 口 动 独于 备 接 硬 件 驱 中硬 操 动 的 件作 串 口 LD E FA LS H 硬 件
non-os驱动与应用
on-os驱动与应用
PDF 文件使用 "pdfFactory Pro" 试用版本创建
华清远见
并发和竞态
l 并发和竞态:
Ø 对称多处理器 (SMP)的多个CPU Ø 单CPU内进程与抢占它的进程 Ø 中断(硬中断、软中断、Tasklet、底半部)与进程之间
v v
v v
v
PDF 文件使用 "pdfFactory Pro" 试用版本创建
华清远见
Linux设备驱动的现状
v 高驱动的需求

linux进程间同步机制

linux进程间同步机制

linux进程间同步机制一、进程间同步的概念在多进程系统中,进程间的通信是必要的,但同时也要防止进程间的相互干扰和数据污染。

进程间的同步机制就是用于解决这一问题的机制,它通过控制进程间的执行顺序、共享资源访问等方式,确保进程间的正确协作。

1. 互斥锁(Mutex)互斥锁是一种常用的进程同步机制,用于保护共享资源,防止多个进程同时访问和修改共享资源,导致数据错误或不一致。

使用互斥锁时,进程需要先获取锁才能访问共享资源,释放锁后才能进行其他操作。

示例代码:```cpthread_mutex_t mutex;pthread_mutex_lock(&mutex);// 访问共享资源pthread_mutex_unlock(&mutex);```2. 信号量(Semaphore)信号量是一种计数器,用于控制对共享资源的访问。

它可以实现进程间的同步和互斥,确保在任何时刻只有一个进程可以访问共享资源。

示例代码:```c#define MAX_COUNT 5sem_t sem;sem_wait(&sem); // 等待信号量释放// 访问共享资源sem_post(&sem); // 释放信号量```3. 屏障(Barrier)屏障是一种用于同步进程的机制,用于确保所有进程在执行完一定操作后才能继续执行。

在多线程或多进程编程中,屏障可以用于确保所有线程或进程完成了某个阶段的准备工作后,再继续执行后续的操作。

示例代码:```cpthread_barrier_t barrier;pthread_barrier_wait(&barrier); // 等待所有线程或进程到达屏障位置```4. 管道(Pipe)和消息队列(Message Queue)管道和消息队列是用于进程间通信的机制,它们允许一个进程向另一个进程发送消息或数据。

通过管道和消息队列,进程间可以异步地交换数据,从而实现同步。

Linux设备驱动程序原理及框架-内核模块入门篇

Linux设备驱动程序原理及框架-内核模块入门篇

Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。

为此,的内核一般不能动态的增加新的功能。

为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。

利用这个机制“模块”(module)。

利用这个机制,可以)。

利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。

正是这种机制,走已经安装的模块。

正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。

和可扩充性。

内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。

严格来说,卸载的内核软件。

严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。

但是,另一方面,可安装模块的形式实现的。

但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。

密切相关的部分(如文件系统等)。

课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。

且创建好该系统中的硬件设备的列表树:/sys 文件系统。

(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。

)。

华科操作系统实验报告

华科操作系统实验报告

华科操作系统实验报告一、实验目的操作系统是计算机系统的核心组成部分,对于理解计算机的工作原理和提高计算机应用能力具有重要意义。

本次华科操作系统实验的主要目的是通过实际操作和实践,深入理解操作系统的基本概念、原理和功能,掌握操作系统的核心技术和应用方法,提高我们的实践能力和问题解决能力。

二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),开发工具包括 Visual Studio Code、GCC 编译器等。

实验硬件环境为个人计算机,配置为英特尔酷睿 i7 处理器、16GB 内存、512GB 固态硬盘。

三、实验内容1、进程管理进程创建与销毁进程调度算法模拟进程同步与互斥2、内存管理内存分配与回收算法实现虚拟内存管理3、文件系统文件操作与管理文件系统的实现与优化4、设备管理设备驱动程序编写设备分配与回收四、实验步骤及结果1、进程管理实验进程创建与销毁首先,使用 C 语言编写程序,通过系统调用创建新的进程。

在程序中,使用 fork()函数创建子进程,并在子进程和父进程中分别输出不同的信息,以验证进程的创建和执行。

实验结果表明,子进程和父进程能够独立运行,并输出相应的信息。

进程调度算法模拟实现了先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)三种进程调度算法。

通过模拟多个进程的到达时间、服务时间和优先级等参数,计算不同调度算法下的平均周转时间和平均等待时间。

实验结果显示,SJF 算法在平均周转时间和平均等待时间方面表现较好,而 RR 算法能够提供较好的响应时间和公平性。

进程同步与互斥使用信号量和互斥锁实现了进程的同步与互斥。

编写了生产者消费者问题的程序,通过信号量控制生产者和消费者对缓冲区的访问,避免了数据竞争和不一致的情况。

实验结果表明,信号量和互斥锁能够有效地实现进程间的同步与互斥,保证程序的正确性。

2、内存管理实验内存分配与回收算法实现实现了首次适应(First Fit)、最佳适应(Best Fit)和最坏适应(Worst Fit)三种内存分配算法。

linux pthread_mutex的原理

linux pthread_mutex的原理

linux pthread_mutex的原理摘要:1.引言2.pthread_mutex 的作用3.pthread_mutex 的工作原理4.pthread_mutex 的使用方法5.总结正文:Linux 中的pthread_mutex 是一种互斥锁,主要用于多线程程序中,以防止多个线程同时访问共享资源造成数据混乱。

pthread_mutex 提供了一种机制,使得在同一时刻只有一个线程可以访问共享资源。

pthread_mutex 的工作原理是通过对共享资源进行加锁和解锁来实现的。

当一个线程需要访问共享资源时,首先尝试对pthread_mutex 进行加锁,如果锁已经被其他线程占用,那么当前线程会被阻塞,等待锁被释放。

当锁被释放后,该线程会被唤醒,继续尝试加锁,直到成功为止。

当线程完成对共享资源的访问后,需要释放pthread_mutex,以便其他线程可以访问共享资源。

在Linux 中,pthread_mutex 有多种操作方法。

首先,需要使用pthread_mutex_init 函数初始化一个pthread_mutex,该函数需要传入两个参数,一个是互斥锁的名称,另一个是互斥锁的初始化模式。

其次,使用pthread_mutex_lock 函数尝试对pthread_mutex 加锁,如果加锁失败,函数会返回一个错误码。

然后,使用pthread_mutex_unlock 函数释放pthread_mutex,使得其他线程可以访问共享资源。

最后,使用pthread_mutex_destroy 函数销毁一个pthread_mutex,该函数会等待所有线程释放该互斥锁后才真正销毁。

Linux系统线程创建及同步互斥方法简要说明(供查考)

Linux系统线程创建及同步互斥方法简要说明(供查考)

Linux系统线程创建及同步互斥方法简要说明(供查考)1、.POSIX线程函数的定义在头文件pthread.h中,所有的多线程程序都必须通过使用#include<pthread.h>包含这个头文件2、用gcc编译多线程程序时,必须与pthread函数库连接。

可以使用以下两种方式编译(建议使用第一种)(1)gcc –D_REENTRANT -o 编译后的目标文件名源文件名-lpthread例如:gcc –D_REENTRANT -o pthread_create pthread_create.c -lpthread (执行该编译结果的方式为:./pthread_create)(2)gcc -pthread -o 编译后的文件名源文件名例如:gcc -pthread -o example example.c一、需要用到的函数的用法提示1、创建线程函数pthread_t a_thread; /*声明a_thread变量,用来存放创建的新线程的线程ID(线程标识符)*/int res=pthread_create(&a_thread,NULL,thread_function,NULL);/*创建一个执行函数thread_function的新线程,线程ID存放在变量a_thread */ 2、退出线程函数pthread_exit(NULL);/*那个线程在执行中调用了该方法,那个线程就退出*/创建和退出线程实例3、连接(等待)线程函数int error;int *exitcodeppthread_t tid; /*用来表示一个已经存在的线程*/error=pthread_join(tid,&exitcodep); /*执行该方法的线程将要一直等待,直到tid 表示的线程执行结束,exitcodep 存放线程tid退出时的返回值*/4、返回线程ID的函数pthread_t t/*声明表示线程的变量t */t=pthread_self( ) /*返回调用该方法的线程的线程ID*/5、判断两个线程是否相等的函数(pthread_equal)int pthread_equal(pthread_t t1, pthread_t t2);/*判断线程t1与线程t2是否线程ID相等*/二、线程同步1、使用互斥量同步线程(实现互斥)(1)互斥量的创建和初始化pthread_mutex_t a_mutex=PTHREAD_MUTEX_INITIALIZER/*声明a_mutex为互斥量,并且初始化为PTHREAD_MUTEX_INITIALIZER */ (2)锁定和解除锁定互斥量pthread_mutex_t a_mutex=PTHREAD_MUTEX_INITIALIZER/*声明互斥量a_mutex*/int rc=pthread_mutex_lock(&a_mutex) /*锁定互斥量a_mutex*/ ………………………………/*锁定后的操作*/int rd= pthread_mutex_unlock(&a_mutex) /*解除对互斥量a_mutex的锁定*/例子:利用互斥量来保护一个临界区pthread_mutex_t a_mutex=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_lock(&a_mutex) /*锁定互斥量a_mutex*//*临界区资源*/pthread_mutex_unlock(&a_mutex) /*解除互斥量a_mutex的锁定*/(3)销毁互斥量Int rc=pthread_mutex_destory(&a_mutex) /*销毁互斥量a_mutex*/2、用条件变量同步线程(实现真正的同步)条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。

Linux_C_同步_内核原子_自旋锁_互斥锁

Linux_C_同步_内核原子_自旋锁_互斥锁

Linux 同步方法剖析内核原子,自旋锁和互斥锁你也许接触过并发(concurrency)、临界段(critical section)和锁定,不过怎么在内核中使用这些概念呢?本文讨论了 2.6 版内核中可用的锁定机制,包括原子运算符(atomic operator)、自旋锁(spinlock)、读/写锁(reader/writer lock)和内核信号量(kernel semaphore)。

本文还探讨了每种机制最适合应用到哪些地方,以构建安全高效的内核代码。

本文讨论了 Linux 内核中可用的大量同步或锁定机制。

这些机制为 2.6.23 版内核的许多可用方法提供了应用程式接口(API)。

不过在深入学习 API 之前,首先需要明白将要解决的问题。

并发和锁定当存在并发特性时,必须使用同步方法。

当在同一时间段出现两个或更多进程并且这些进程彼此交互(例如,共享相同的资源)时,就存在并发现象。

在单处理器(uniprocessor,UP)主机上可能发生并发,在这种主机中多个线程共享同一个 CPU 并且抢占(preemption)创建竞态条件。

抢占通过临时中断一个线程以执行另一个线程的方式来实现 CPU 共享。

竞态条件发生在两个或更多线程操纵一个共享数据项时,其结果取决于执行的时间。

在多处理器(MP)计算机中也存在并发,其中每个处理器中共享相同数据的线程同时执行。

注意在 MP 情况下存在真正的并行(parallelism),因为线程是同时执行的。

而在 UP 情形中,并行是通过抢占创建的。

两种模式中实现并发都较为困难。

Linux 内核在两种模式中都支持并发。

内核本身是动态的,而且有许多创建竞态条件的方法。

Linux 内核也支持多处理(multiprocessing),称为对称多处理(SMP)。

临界段概念是为解决竞态条件问题而产生的。

一个临界段是一段不允许多路访问的受保护的代码。

这段代码能操纵共享数据或共享服务(例如硬件外围设备)。

linux中的同步机制

linux中的同步机制

linux中的同步机制Linux中的同步机制在Linux操作系统中,同步机制是一种重要的机制,用于控制并发访问共享资源的顺序和互斥。

它确保多个进程或线程能够有序地访问共享资源,避免数据竞争和不一致的结果。

本文将介绍Linux中常用的同步机制,包括互斥锁、条件变量、信号量和屏障等。

一、互斥锁(Mutex)互斥锁是一种最常见的同步机制,用于保护共享资源的访问。

在互斥锁的帮助下,只有一个进程或线程能够获得锁,其他进程或线程需要等待锁的释放。

Linux提供了多种互斥锁的实现,如pthread_mutex_t和std::mutex等。

使用互斥锁需要注意避免死锁和竞态条件等问题。

二、条件变量(Condition Variable)条件变量是一种用于线程间通信的同步机制,它允许线程在满足特定条件之前等待,从而避免了忙等待的问题。

在Linux中,条件变量通常与互斥锁一起使用。

当某个线程发现条件不满足时,它可以调用条件变量的等待函数将自己阻塞,直到其他线程满足条件并发出信号,唤醒等待的线程。

三、信号量(Semaphore)信号量是一种用于控制并发访问的同步机制,它可以实现对资源的计数和管理。

Linux提供了两种类型的信号量:二进制信号量和计数信号量。

二进制信号量只有两种状态(0和1),用于互斥访问共享资源;计数信号量可以有多个状态,用于限制并发访问的数量。

通过使用信号量,可以实现进程或线程之间的同步和互斥。

四、屏障(Barrier)屏障是一种用于线程同步的机制,它在多个线程到达指定点之前将它们阻塞,直到所有线程都到达后才继续执行。

屏障可以用于并行计算中的阶段同步,确保每个阶段的计算完成后再进行下一阶段的计算。

在Linux中,可以使用pthread_barrier_t来创建和操作屏障。

五、读写锁(ReadWrite Lock)读写锁是一种特殊的锁机制,用于在读操作和写操作之间提供更好的并发性。

读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文 ,不能进行上下文切换 ; 3) bottom _half,也没有进程上下文 ; 4) 相同的执行路径还可能在其他的 CPU 上
运行 。 这样 ,考虑这几方面的因素 ,通过判断要互斥
的数据会被这 4个因素中的哪几个来存取 ,就可以 决定具体使用哪种形式的 sp in lock。 (注意 :以下使 用 sp in_lock_ ×××等为自旋锁的衍生锁 [ 2 ] )
113 信号量 L inux中的信号量也是睡眠锁 。如果有一个任
务试图获得一个已被持有的信号量时 ,信号量会将 其推入等待队列 ,然后让其睡眠 。这时处理器获得 自由去执行其它代码 。当持有信号量的进程将信 号量释放后 ,在等待队列中的一个任务将被唤醒 , 从而便可以获得这个信号量 。
信号量用法如下 : DECLARE _MUTEX ( mount _ sem ) ; ∥定 义 信 号量 ∥获取信号量 ,保护临界区 down ( &mount_sem ) ; … critical section ∥临界区 … ∥释放信号量 ,撤销对临界区的保护 up ( &mount_sem ) 。
∥获得锁 ∥临界区 ∥释放锁 。
2 常见互斥情形分析
下面从内核代码执行路径 、临界区的大小和性 质分别对互斥情形进行分析 ,讨论如何选择最佳互 斥机制 。
211 内核执行路径 内核中的执行路径主要有以下几种情形 : 1)用户进程的内核态 ,有进程上下文 ,主要是
代表进程在执行系统调用等 ; 2)中断或者异常或者自陷等 ,没有进程上下
自旋锁用法如下 : sp inlock_t lock; ∥定义一个自旋锁 sp in_lock_init ( &lock) ; ∥初始化自旋锁
— 4 6 — D IG ITAL COMMUN ICAT ION /2009112
前沿技术
sp in_lock ( &lock) ; … sp in_unlock ( &lock) ;
与 CPU 架构密切相关 [ 2 ] 。其 AP I和原子类型的定 义都定义在内核源码树的 include / asm / atom ic. h文 件中 ,它们都使用汇编语言实现 ,原子操作主要用 于实现资源计数 ,很多引用计数 ( refcnt)就是通过原 子操作实现的 ,例如在 TCP / IP协议栈的 IP碎片处 理中 ,就使用了引用计数 ,当引用该 IP碎片时 ,就使 用函数 atom ic_ inc ( )把引用计数加 1,如果删除 IP 碎片时就使用函数 atom ic_dec ( )把引用计数减 1。
1)如果只要和其他 CPU 互斥 ,就要用 sp in_ lock 和 sp in_unlock;
2)如果要和 irq及其他 CPU 互斥 ,就要用 sp in_ lock_irq和 sp in_unlock_irq;
3)如果既要和 irq及其他 CPU 互斥 ,又要保存 EFLAG的状态 ,就要用 sp in_lock_irqsave和 sp in_un2 lock_irqrestore;
Exclusion m echan ism in L inux dev ice dr iver
ZHANG Yi, ZHAO Zi2gu
( Key Laboratory of Mobile Communications Technology, Chongqing University of Posts and Telecommunications, Chongqing 400065, P. R. China)
前沿技术
L inux设备驱动中的互斥机制
张 毅 ,赵子顾
(重庆邮电大学 移动通信重点实验室 ,重庆 400065)
摘 要 :首先介绍 L inux的设备驱动架构 ,引入设备驱动的并发控制机制 ,然后通过比较几种互斥机制的优缺点 ,重 点详述如何针对不同互斥场景选择最佳的互斥机制 ,最后简述了几种机制的使用方法及使用时要注意的问题 。 关键词 :中断屏蔽 ;原子操作 ;信号量 ;自旋锁 ;临界资源
4)如果要和 bh及其他 CPU 互斥 ,就要用 sp in_
lock_bh / sp in_unlock_bh; 5)如果不需要和其他 CPU 互斥 ,只要和 irq互
斥 ,则用 local_irq_disable和 local_irq_enable; 6)如果不需要和其他 CPU 互斥 ,只要和 bh互
L inux设备驱动程序包含中断处理程序和设备服 务子程序 2部分 。设备驱动程序屏蔽了设备的特殊 性 ,使用户可以像对待普通文件一样操作设备 [1 ] 。
设备控制器一般有 2种系统服务方式 :查询和 中断 ,由于查询方式低下 ,大多设备采用中断方式 , 然而不管是查询方式还是中断方式对设备进行访 问 ,都有可能是多进程并发访问 ,这样就产生了临 界资源 (设备 、变量 、缓冲区 )的竞态 [ 2 ] 。L inux提供 了驱动的并发控制机制 ,但不同的互斥情形所使用 的互斥手段不同 ,正确选择不同互斥情形的最佳互 斥机制 ,能大大节约系统资源 ,提高系统效率 。
( top half)和下半部 ( bottom half) ,如图 2所示 。
图 2 L inux中断处理机制
“上半部 ”用来快速处理硬件发出的请求 (登记 中断 ) ,把相应的中断例程的下半部挂到该设备的 下半部执行队列中去 ,因此上半部执行的速度就会 很快 ,可以服务更多的中断请求 ,用下半部来完成 中断事件的绝大部分使命 。下半部和上半部最大 的不同是下半部是可中断的 ,而上半部是不可中断 的 ,下半部相对来说并不是非常紧急的 ,通常还是 比较耗时的 。
2)自旋锁可能导致系统死锁 ,如以下情况 : 如果递归上锁 [ 6 ] ,即一个已经拥有某个自旋锁 的 CPU 想第二次获得这个自旋锁时 ;
3 使用自旋锁需注意的问题
以下几种情况在使用自旋锁时都可能发生死 锁 ,所以在使用时要注意 ,以免发生死锁 。
1)自旋锁实际上是忙等锁 , CPU 在等待自旋锁 时不做任何有用的工作而仅仅是等待 ,因此只有在 占用锁的时间极短的情况下 ,使用自旋锁才合理 。 当临界区很大或有共享设备的时候 ,需要较长占用 锁 ,使用自旋锁就会降低系统的性能 。
1 解决互斥问题的机制
在 L inux驱动层即内核态下解决互斥问题的机 制有 :中断屏蔽 、原子操作 、信号量和自旋锁及其他 衍生锁 。下面将详细介绍这几种互斥机制 。
111 中断屏蔽 在单 CPU 范围内避免竞态的简单方法就是进
入临界区之前屏蔽系统的中断 , CPU 一般都具有屏 蔽中断和打开中断的功能 ,这样可以保证正在执行
Abstract: This paper discusses the structure of L inux device driver. Then, the concurrency control mechanism of device driver was introduced. Through the comparison of the advantage kinds of exclusion mechanism , the paper exp laineds how to choose the best exclusion mechanism according to different scene. Finally, the paper p roposes the operation method and the instruction. Key words:mask interrup t; atom ic operation; semaphore; sinlock; critical resources
自旋锁主要针对 SM P或单 CPU 但内核可抢占 (216内核 )的情况 ,对于单 CPU 和内核不支持抢占 的系统自旋锁退化为空操作 。在单 CPU 和内核可 抢占的系统中 , 自旋锁持有期间内核的抢占将被 禁止 。
尽管用了自旋锁可以保证临界区不受别的 CPU 和本 CPU内的抢占进程打扰 ,但是得到锁的代码路 径在执行临界区的时候还可能受到中断和下半部 ( bottom half)的影响 。为了防止这种影响 ,就需要用 自旋锁的衍生 [5 ] 。
114 自旋锁 自旋锁 ( sp in lock)是一种对临界资源进行互斥
访问的典型手段 , 其名称来源它的工作方式 ,“自 旋 ”即“在 原 地 打 转 ”, 不 断 操 作 并 设 置 ( test2and2 test)内存变量 ,由于是原子操作而不被打断 ,直到成 功获得锁 。
理解自旋锁最简单的方法是把它看作一个信 号量 ,该信号量在临界区或标志自己“我当前在运 行 ,稍等一会 ”,或标志自己“我当前不运行 ,可以被 使用 ”,如果 A 执行单元进入例程 ,它将持有锁 ;当 B 执行单元进入同一例程时 ,将获知锁被持有而“自 旋 ”。
4)如果一个进程在执行一个临界区的代码时 , 发生了中断 ,而中断函数可能就会调用这个临界区 的代码 ,不让它进入的话就会产生死锁 ,这时一个 有效的方法就是关中断了 。
213 单 CPU和 SM P 在单 CPU 中 ,主要是中断和 bottom _ half的问
题 ,因此 ,开关中断就可以了 。在多 CPU 中 ,又加上 了其他 CPU 的干扰 ,因此需要 sp in lock来帮助 ,这 2 个部分结合起来使用 。
锁而“自旋 ”,要求锁不能在临界区停留太长 ,否则 会降低系统性能 。
2)如果对临界区锁定时间较长 ,或有共享设备 的时候 ,应使用信号量 ,当其他进程争夺资源时 ,如 果竞争不上 ,会有上下文切换 ,进程可以去睡眠 ,但 CPU 不会停 ,会接着运行其他的执行路径 。
3)如果临界区存在引起阻塞的代码 ,阻塞则意 味着进程的切换 ,这时使用自旋锁就不合适了 ,因 为如果切换出去的进程再企图获得本自旋锁 ,就会 引起死锁 。
相关文档
最新文档