Linux设备驱动中的互斥机制(1)
《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进程间同步机制一、进程间同步的概念在多进程系统中,进程间的通信是必要的,但同时也要防止进程间的相互干扰和数据污染。
进程间的同步机制就是用于解决这一问题的机制,它通过控制进程间的执行顺序、共享资源访问等方式,确保进程间的正确协作。
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提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。
利用这个机制“模块”(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的原理摘要: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系统线程创建及同步互斥方法简要说明(供查考)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 同步方法剖析内核原子,自旋锁和互斥锁你也许接触过并发(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中常用的同步机制,包括互斥锁、条件变量、信号量和屏障等。
一、互斥锁(Mutex)互斥锁是一种最常见的同步机制,用于保护共享资源的访问。
在互斥锁的帮助下,只有一个进程或线程能够获得锁,其他进程或线程需要等待锁的释放。
Linux提供了多种互斥锁的实现,如pthread_mutex_t和std::mutex等。
使用互斥锁需要注意避免死锁和竞态条件等问题。
二、条件变量(Condition Variable)条件变量是一种用于线程间通信的同步机制,它允许线程在满足特定条件之前等待,从而避免了忙等待的问题。
在Linux中,条件变量通常与互斥锁一起使用。
当某个线程发现条件不满足时,它可以调用条件变量的等待函数将自己阻塞,直到其他线程满足条件并发出信号,唤醒等待的线程。
三、信号量(Semaphore)信号量是一种用于控制并发访问的同步机制,它可以实现对资源的计数和管理。
Linux提供了两种类型的信号量:二进制信号量和计数信号量。
二进制信号量只有两种状态(0和1),用于互斥访问共享资源;计数信号量可以有多个状态,用于限制并发访问的数量。
通过使用信号量,可以实现进程或线程之间的同步和互斥。
四、屏障(Barrier)屏障是一种用于线程同步的机制,它在多个线程到达指定点之前将它们阻塞,直到所有线程都到达后才继续执行。
屏障可以用于并行计算中的阶段同步,确保每个阶段的计算完成后再进行下一阶段的计算。
在Linux中,可以使用pthread_barrier_t来创建和操作屏障。
五、读写锁(ReadWrite Lock)读写锁是一种特殊的锁机制,用于在读操作和写操作之间提供更好的并发性。
读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。
linux驱动面试题
linux驱动面试题Linux驱动是指在Linux操作系统中,用于控制与硬件之间的交互和通信的软件模块。
在Linux的工作环境中,驱动程序起着至关重要的作用。
如果你准备参加Linux驱动的面试,以下是一些常见的Linux驱动面试题,希望可以对你有所帮助。
一、简述Linux驱动的作用和功能。
Linux驱动是一种软件模块,用来控制硬件设备与操作系统之间的通信和交互。
它负责将输入/输出请求传递给硬件设备,并处理来自硬件设备的中断和事件。
Linux驱动的功能包括设备初始化和配置、数据传输和处理以及错误处理等。
二、请简要介绍Linux驱动程序的加载过程。
当系统启动时,Linux内核首先会加载核心模块和驱动程序模块。
驱动程序模块是以目标硬件设备为基础的,它们包含了与设备通信所需的函数和数据结构。
一般情况下,系统会根据硬件设备信息自动加载对应的驱动程序模块。
加载驱动程序模块需要通过insmod或modprobe命令进行,这些命令可以在启动时自动执行。
三、请简述Linux驱动程序的实现方式。
Linux驱动程序的实现方式包括内核空间驱动和用户空间驱动。
内核空间驱动是指驱动程序运行在内核空间,直接与硬件设备进行交互。
用户空间驱动是指驱动程序运行在用户空间,通过系统调用和内核模块实现与硬件设备的通信。
内核空间驱动的优势是性能更好,但需要对内核进行编译和加载,而用户空间驱动的优势是开发更加容易,但性能会稍差。
四、请介绍Linux驱动程序中常用的数据结构和函数。
在Linux驱动程序中,常用的数据结构有file结构体、inode结构体和cdev结构体等。
file结构体用于表示一个打开的设备文件,可以通过它传递与设备相关的信息。
inode结构体用于表示一个文件的元数据信息,包括文件的权限、大小和创建时间等。
cdev结构体用于表示一个字符设备,包含了设备文件的操作函数和设备号等信息。
常用的函数包括register_chrdev、unregister_chrdev、request_irq和release_irq等。
linux线程间同步和互斥的方法
linux线程间同步和互斥的方法随着计算机技术的飞速发展,多线程应用已经变得越来越普遍。
在Linux操作系统中,多线程是一种强大的工具,它允许程序同时执行多个任务,从而提高系统的并发性和效率。
然而,多线程应用也带来了一些挑战,如线程间的同步和互斥问题。
本文将介绍Linux线程间同步和互斥的方法。
一、互斥(Mutex)互斥是最基本的同步机制之一,用于保护共享资源,防止多个线程同时访问同一资源而造成数据混乱。
在Linux中,可以使用pthread_mutex_t类型来创建互斥锁。
使用pthread_mutex_lock()函数来锁定互斥锁,确保同一时刻只有一个线程可以访问被保护的资源;使用pthread_mutex_unlock()函数来解锁互斥锁,允许其他线程访问该资源。
二、条件变量(ConditionVariable)条件变量是一种更复杂的同步机制,它允许一个或多个线程在满足某个条件时被唤醒。
在Linux中,可以使用pthread_cond_t类型来创建条件变量。
线程可以通过pthread_cond_wait()函数进入等待状态,直到条件满足时被唤醒。
使用pthread_cond_signal()或pthread_cond_broadcast()函数来通知其他等待的线程。
三、读写锁(Read-WriteLock)读写锁是一种更高效的同步机制,它允许多个读线程同时访问共享资源,但在写操作时只允许一个写线程访问。
在Linux中,可以使用pthread_rwlock_t类型来创建读写锁。
读线程可以同时获取读锁,而写线程必须获取写锁。
当写线程释放写锁时,读线程可以再次获取读锁。
这种机制可以提高并发性能,降低资源争用的开销。
四、信号量(Semaphore)信号量是一种用于控制并发访问的计数器。
它通常用于计数有限的资源数量,如文件描述符或磁盘空间。
在Linux中,可以使用sem_t 类型来创建信号量。
使用sem_wait()函数来减少信号量的值,表示消耗了一个资源;使用sem_post()函数来增加信号量的值,表示释放了一个资源。
linux 互斥锁 信号量 自旋锁 实现原理
Linux中的互斥锁、信号量和自旋锁都是常用的同步机制,用于协调多个线程或进程对共享资源的访问。
1. 互斥锁(Mutex):也称为互斥量,是最基本的锁机制。
它提供了互斥访问共享资源的能力,当一个线程获得互斥锁后,其他线程将被阻塞,直到该线程释放锁为止。
在Linux内核中,mutex 的实现原理基于底层硬件的支持,通过使用汇编指令实现锁的获取和释放。
2. 信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问次数。
在Linux内核中,信号量的实现原理基于系统调用和内核函数,通过维护一个计数器来记录可用资源数量。
当一个线程需要访问共享资源时,会尝试获取信号量,如果计数器为正数,则该线程可以访问共享资源,否则该线程将被阻塞。
3. 自旋锁(Spinlock):自旋锁是一种基于忙等待的同步机制。
当一个线程尝试获取自旋锁时,如果锁已经被其他线程持有,则该线程将自旋(忙等待)直到锁被释放。
自旋锁适用于保护临界区代码较短且短暂占用共享资源的情况。
在Linux内核中,自旋锁的实现原理基于底层硬件的支持,通过使用汇编指令实现锁的获取和释放。
需要注意的是,以上三种锁机制都是通过系统调用或特定的库函数在用户空间或内核空间实现的。
在使用锁的过程中,需要注意
避免死锁(Deadlock)和饥饿(Starvation)等并发编程中常见的问题。
linux pthread_mutex的原理 -回复
linux pthread_mutex的原理-回复Linux中的pthread_mutex是一种用于多线程编程的同步原语,它提供了互斥锁的功能,用于保护共享资源的访问。
在本文中,我们将深入探讨pthread_mutex的原理,并逐步回答有关它的关键问题。
一、什么是pthread_mutex?pthread_mutex是POSIX标准中定义的一种多线程同步机制,pthread_mutex用于协调多个线程对共享资源的访问。
它提供了两种主要的操作:锁定(lock)和解锁(unlock)。
线程在访问共享资源之前必须先锁定互斥锁,然后在完成访问后再解锁互斥锁,以确保只有一个线程可以同时访问共享资源。
二、pthread_mutex的类型pthread_mutex有几种不同的类型,包括普通锁(PTHREAD_MUTEX_NORMAL)、错误检查锁(PTHREAD_MUTEX_ERRORCHECK)、递归锁(PTHREAD_MUTEX_RECURSIVE)以及默认类型(PTHREAD_MUTEX_DEFAULT)等。
每种类型都有其特定的用途和行为。
1. 普通锁(PTHREAD_MUTEX_NORMAL):该类型的锁没有死锁检测机制,如果一个线程重复锁定同一个互斥锁,则会导致死锁。
因此,开发者需要自行确保在使用该类型锁时避免死锁的情况发生。
2. 错误检查锁(PTHREAD_MUTEX_ERRORCHECK):该类型的锁提供了死锁检测功能。
当一个线程试图再次锁定已经被其自身所锁定的互斥锁时,将返回一个错误码,并不会导致死锁。
这种类型可以帮助开发者在调试过程中尽早发现潜在的死锁问题。
3. 递归锁(PTHREAD_MUTEX_RECURSIVE):该类型的锁可以被同一个线程多次锁定,而不会导致死锁。
每次锁定时都会增加一个计数器,只有当计数器归零时才会解锁。
这种类型的锁适用于那些需要在递归调用中保护共享资源的情况。
4. 默认类型(PTHREAD_MUTEX_DEFAULT):该类型会根据具体的实现选择合适的类型,可能是锁定或递归锁。
Linux操作系统的面试题大全及技巧
Linux操作系统的面试题大全及技巧在面试相关岗位时经常会遇到Linux操作系统的相关问题。
下面由店铺为大家整理了Linux操作系统的面试题大全及技巧,希望对大家有帮助!Linux操作系统的面试题大全及技巧Linux操作系统的面试题大全一1、进程管理1、进程是具有独立功能程序在某个数据集合上的一次执行过程。
线程是进程内的一个执行实体或执行单元。
进程和线程的区别:(a)不同进程的地址空间是独立的,而同一进程内的线程共享同一地址空间。
一个进程的线程在另一个进程内是不可见的。
(b) 在引入线程的操作系统中,进程是资源分配和调度的单位,线程是处理机调度和分配的单位,资源是分配给进程的,线程只拥有很少资源,因而切换代价比进程切换低。
区别版本二1)调度方面。
在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。
而在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位。
在同一进程中,线程的切换不会引起进程的切换。
在不同的进程中进行线程切换,将会引起进程切换。
2)拥有资源。
不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点必不可少的资源),但线程可以访问其隶属进程的系统资源。
3)并发性。
在引入线程的操作系统中,不仅进程之间可以并发执行,而且同一进程内的多个线程之间也可以并发执行。
4)系统开销。
由于创建进程或撤销进程时,系统都要为之分配或回收资源,操作系统所付出点开销远大于创建或撤销线程时的开销。
在进行进程切换时,涉及到整个当前进程CPU环境的保护及新调度到新进程的CPU环境设置;而线程切换时,只需保护和设置少量寄存器内存,因此开销很小。
另外,由于同一进程内的多个线程共享进程的地址空间,因此,多线程之间的同步与通信非常容易实现,甚至无需操作系统的干预。
程序与进程的区别(1)进程是一个动态概念,而程序是一个静态概念。
(2)进程具有并行特征,而程序不反映执行所以没有并行特征(3)进程是竞争计算机系统资源的基本单位,而程序不反映执行也就不会竞争计算机系统资源(4)不同的进程可以包含同一程序,只要该程序所对应的数据集不同。
Linux互斥锁、条件变量和信号量
Linux--Linux互斥锁、条件变量和信号量进行多线程编程,最应该注意的就是那些共享的数据,因为无法知道哪个线程会在哪个时候对它进行操作,也无法得知哪个线程会先运行,哪个线程会后运行。
所以,要对这些资源进行合理的分配和正确的使用。
在Linux下,提供了互斥锁、条件变量和信号量来对共享资源进行保护。
一、互斥锁互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。
需要的头文件:pthread.h互斥锁标识符:pthread_mutex_t(1)互斥锁初始化:函数原型:int pthread_mutex_init (pthread_mutex_t* mutex,const pthread_mutexattr_t* mutexattr);函数传入值:mutex:互斥锁。
mutexattr:PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁。
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁。
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 创建检错互斥锁。
函数返回值:成功:0;出错:-1(2)互斥操作函数int pthread_mutex_lock(pthread_mutex_t* mutex); //上锁int pthread_mutex_trylock (pthread_mutex_t* mutex); //只有在互斥被锁住的情况下才阻塞int pthread_mutex_unlock (pthread_mutex_t* mutex); //解锁int pthread_mutex_destroy (pthread_mutex_t* mutex); //清除互斥锁函数传入值:mutex:互斥锁。
函数返回值:成功:0;出错:-1使用形式:pthread_mutex_t mutex;pthread_mutex_init (&mutex, NULL); /*定义*/...pthread_mutex_lock(&mutex); /*获取互斥锁*/... /*临界资源*/pthread_mutex_unlock(&mutex); /*释放互斥锁*/备注:互斥锁MUTEX的使用注意lock和unlock的配对使用,否则容易出现死锁发生。
linux驱动工程师面试题整理
1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。
评:这只是其中一种方式,也叫手动创建设备文件。
还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV 是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。
那么在系统启动期间还有devfs创建了设备文件。
一共有三种方式可以创建设备文件。
2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。
评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。
也就是中断上半部和下半部。
第二:中断服务程序中不能有阻塞操作。
为什么?大家可以讨论。
第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL之类的。
3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。
中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。
页脚内容14、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行?答:原子操作指的是无法被打断的操作。
我没懂第二句是什么意思,自己定义一个变量怎么可能标记资源的使用情况?其他进程又看不见这个变量评:第二句话的意思是:定义一个变量,比如int flag =0;if(flag == 0){flag = 1;操作临界区;flag = 0;}这样可否?5、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?答:insmod调用init函数,rmmod调用exit函数。
原子嵌入式linux驱动开发详解
原子嵌入式linux驱动开发详解原子嵌入式Linux驱动开发详解:Linux操作系统一直都是工业控制、物联网、安防等领域中嵌入式设备的首选操作系统。
Linux系统的优良特性使其成为用户和开发者的首选,而Linux内核驱动则是面向嵌入式应用领域核心技术之一。
它是嵌入式设备在硬件及软件之间接口的重要组成部分。
本文将详细介绍使用原子嵌入式Linux驱动进行嵌入式设备驱动的开发,并且介绍使用原子嵌入式Linux驱动实现并行的多线程驱动。
一、嵌入式设备驱动的基本原理:所谓嵌入式设备驱动,就是处理器与外部设备之间进行数据传递的程序,将设备中的信息读取到处理器中,或将处理器中的信息发送至设备中。
嵌入式设备驱动的核心逻辑是控制输入输出模块,以完成外部信息的读取和发送任务。
在Linux系统下,设备驱动一般以内核模块存在,片上驱动是一个相对独立的模块,不妨做一番详细的介绍。
二、原子嵌入式Linux驱动的使用:原子嵌入式Linux驱动根据功能的不同划分成了两类,即原子操作和读写自旋锁。
这两类驱动的使用方法不同,且有自己的特殊应用场景。
1、原子操作:在多线程的情况下,通过锁来保证同一时间只能有一个线程操作共享资源是一种常见的方法。
原子操作则是一种替代锁的方式,在多线程操作共享资源的情况下采用原子操作方式相对于锁来说会更加高效。
原子操作是一种特殊的指令操作,执行完原子操作之后,CPU不允许其他线程读写该地址的值,因此可以避免竞争。
下面是一个使用原子操作的例子:radio_chan = atomic_read(&radio->chan);digital_chan =atomic_read(&radio->digital_chan);radio_write_register(radio, 0x0011, 2,&radio_chan);radio_write_register(radio, 0x5111, 2,&digital_chan);在上述代码中,使用了atomic_read来获得变量radio_chan和digital_chan的值,这两个变量是共享资源,这里使用原子操作来避免竞争和冲突。
linux内核开发面试题
linux内核开发面试题一、简介Linux内核是开源操作系统Linux的核心组成部分,负责管理计算机的硬件资源并提供各种系统服务。
Linux内核开发面试题是在面试过程中常见的一种考察方式,用于评估面试者对Linux内核的理解与掌握程度。
二、常见面试题1. 请简述Linux内核的架构及其组成部分。
2. 什么是进程和线程?它们在Linux内核中的实现方式是什么?3. 请解释虚拟内存的概念,并描述它在Linux内核中的实现原理。
4. Linux内核采用的调度算法有哪些?请分别介绍它们的特点。
5. 请描述Linux内核中的文件系统及其实现原理。
6. 什么是系统调用?请举例说明Linux内核中常用的系统调用接口。
7. 请解释Linux内核中的中断处理机制,并描述硬中断和软中断的区别。
8. 请简述Linux内核的设备驱动模型,并介绍驱动程序的开发流程。
9. 请阐述Linux内核的网络子系统及其组件,包括网络协议栈、套接字和网络设备驱动等。
10. 在进行Linux内核开发时,经常使用的调试技术有哪些?请简要说明它们的作用。
三、回答示范1. Linux内核的架构及组成部分Linux内核的架构主要由五个模块组成,分别是进程管理、内存管理、文件系统、设备驱动和网络子系统。
其中,进程管理模块负责创建、调度和销毁进程,内存管理模块负责管理系统的内存资源,文件系统模块提供了对文件和目录的操作接口,设备驱动模块负责管理硬件设备的访问,网络子系统模块提供了网络通信功能。
2. 进程和线程及其实现方式进程是计算机中正在运行的程序的实例,拥有独立的内存空间和执行上下文。
线程是进程内的一个执行单元,共享进程的资源。
在Linux 内核中,进程通过task_struct结构来表示,线程则通过clone系统调用来创建。
3. 虚拟内存的概念及实现原理虚拟内存是一种对物理内存的抽象和扩展,它为每个进程提供了独立的地址空间。
Linux内核通过页表将虚拟地址映射到物理地址,并采用页面置换算法(如LRU)来管理内存的使用。
嵌入式考试名词解释.docx
名词解释:(1)硬实时:通常将采用优先级驱动的、具有时间确定性的、可抡占调度的RTOS而设计的实时系统称为硬实时系统。
(2)优先级驱动:在一个多任务系统屮,正在运行的任务总是优先级最高的任务。
在任何给定的时间内,总是把处理器分配给最高优先级的任务。
⑶优先级反转:当一个任务等待比它优先级低的任务释放资源而被阻塞吋,就会发生优先级反转。
优先级继承技术可以解决优先反转问题。
⑷优先级继承:当优先级反转发生时,较低优先级任务的优先级被暂时捉高,以匹配较高优先任务的优先级。
这样,就可以使较低优先级任务尽快地执行、并且禅放较高优先级所需要的资源。
⑸实时执行体:实吋执行程序包括一套支持实吋系统所必需的机制,如多任务支持、CPU 调度、通信和存储分配等。
在嵌入式应用中,这一套机制被称为实时操作系统或实时执行体或实时内核° VxWorks就是一个实时执行体,编程人员根据实时执行体棊础构造自己的应用。
⑹重调度过程:重调度过程是一段系统程序,用于判定任务优先级和任务的执行状态。
一旦任务的状态发生变化,就会引起切换⑺任务:RTOS中的任务相当于一般操作系统的进程,一个任务就是RTOS的-个可以独立运行的例程。
在程序设计时,任务被设计成无限循环程序(过程)⑻任务上下文:任务上下文是指一个未运行的任务的状态,如堆栈指针、计数器、内存字段和通用寄存器等。
(9)高度延迟:(调度延吋)(10)可伸缩的体系结构:可伸缩的体系结构是指一个软系统能够支持多种应用而无需在接口上做很大的变动。
这种结构往往提供可选用的系统组件,供开发者量体裁衣。
(11)屮断延迟:屮断延迟是指屮断发生到开始执行屮断处理程序的这一段时间。
(12)互斥:互斥是用于控制多任务对共享数据进行顺序访问的同步机制。
在多任务应用中, 当两个或更多的任务同吋访问-•数据区吋,就会造成访问冲突。
互斥能便它们依次访问共享数据而不引起冲突。
(13)抢占:抢占是指当系统在处于核心态的内核运行时,允许任务重新调度。
2022年东北电力大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案)
2022年东北电力大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、某文件系统中,针对每个文件,用户类别分为4类:安全管理员、文件上、文件主的伙伴、其他用户:访问权限分为5类:完全控制、执行、修改、读取、写入。
若文件控制块中用:进制位串表示文件权限,为表示不同类别用户对一个文件的访问权限,则描述文件权限的位数至少应为()。
A.5B.9C.12D.202、下面关于文件系统的说法正确的是()。
A.文件系统负责文件存储空间的管理,但不能实现文件名到物理地址的转换B.在多级目录结构中,对文件的访问是通过路径名和用户目录名进行的C.文件可以被划分成大小相等的若干物理块,且物理块大小也可以任意指定D.逻辑记录是对文件进行存取操作的基本单位3、进程调度算法中,可以设计成可抢占式的算法有()。
A.先来先服务调度算法B.最高响应比优先调度算法C.最短作业优先调度算法D.时间片轮转调度算法4、采用资源剥夺法可以解除死锁,还可以采用()方法解除死锁。
A.执行并行操作B.撤销进程C.拒绝分配新资源D.修改信号量5、某计算机系统中有8台打印机,有K个进程竞争使用,每个进,程最多需要3台打印机,该系统可能会发生死锁的K的最小值是()A.2B.3C.4D.56、假定有个请求分页存储管理系统,测得系统各相关设备的利用率为:CPU为10%,磁盘交换区为99.7%:其他1/O设备为5%。
试问:下面()措施可能改进CPU的利用率?I.增大内存的容量II.增人磁盘交换区的容量III.减少多道程序的度数IV.增加多道程序的度数V.使用更快速的磁盘交换区VI.使用更快速的CPUA.I、II、III、IVB.I、IIC.II、III、VD. II、VI7、下列选项中,属于多级页表优点的是()。
A.加快地址变换速度B.减少缺页中断次数C.减少页表项所占字节数D.减少页表所占的连续内存空间8、实时操作系统必须在()内处理完来白外部的事件。
2022年东南大学成贤学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)
2022年东南大学成贤学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、操作系统为了管理文件,设计了文件控制块(FCB),文件控制块的建立是().A.在调用create()时B.在调用open()时C.在调用read()时D.在调用write()2、下列算法中,用于磁盘调度的是(),A.时间片轮转法B.LRU算法C.最短寻道时间优先算法D.高优先级算法3、进行P0和P1;的共享变量定义及其初值为:boolean flag[2];int turn=0;flag[0]=false;flag[1]=false;若进行P0和P1,访问临界资源的类C代码实现如下:void Po()//进程Po{while(TRUE){flag[0]=TRUE;turn=1;While(flag[1]&&(turn==l));临界区;flag[0]=FALSE;}}void P1()//进程P1{while(TRUE){flag[1]=TRUE;turn=0;While(flag[0]&&(turn==0));临界区;flag[1]=FALSE;}}并发执行进程P0和P1时产生的情况是()。
A.不能保证进程互斥进入临界区、会出现“饥饿”现象,B.不能保证进程互斥进入临界区、不会出现“饥饿”现象C.能保证进程互斥进入临界区、会出现“饥饿”现象D.能保证进程互斥进入临界区、不会出现“饥饿”现象4、作业8:00到达系统,估计运行时问为1h。
若从10:00开始执行该作业,其响应比为()。
A.2B.1C.3D.0.55、在使用信号量机制实现互斥时,互斥信号量的初值一般为():而使用信号量机,制实现同步时,同步信号量的初值般为()。
A.0:1B.1:0C.不确定:1D.1:不确定6、在一个操作系统中对内存采用页式存储管理方法,则所划分的页面大小()。
A.要依据内存大小而定B.必须相同C.要依据CPU的地址结构而定D.要依据内存和外存而定7、对重定位存储管理方式,应()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行 。 这样 ,考虑这几方面的因素 ,通过判断要互斥
的数据会被这 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)如果临界区存在引起阻塞的代码 ,阻塞则意 味着进程的切换 ,这时使用自旋锁就不合适了 ,因 为如果切换出去的进程再企图获得本自旋锁 ,就会 引起死锁 。