信号量,中断和时间

第6章信号量,中断和时间信号量(Signal)是进程间通讯(IPC)的一种形式——是一个进程给另一个进程发送信息的方法。

但是信息不可能很多——一个信号量不可能携带详细的信息,即使是传送者的身份也不能被传递;唯一能够确定的事实是信号量的确被发送了。

(然而和经典信号量不同,POSIX实时信号量允许传送稍微多一点的信息。

)实际上,信号量对于双向通讯是没有用处的。

还有,根据某些限定,信号量的接受者不必以任何方式作出响应,甚至可以直接忽略大部分信号量。

虽然有这么多的限制,然而信号量仍然是一种功能强大的十分有用的机制——勿庸置疑,这是Unix IPC中使用最频繁的机制。

每当进程退出或者废弃一个空指针时,每当使用Ctrl+C键终止程序运行时,都要传递信号量。

第9章会更详细的讨论IPC机制。

对于本章的讨论来说,信号量的内容就足够讨论了。

正如在Linux内核本身的代码注释中所说明的一样,中断(Interrupt)对于内核来说和信号量是类似的。

中断一般都是从磁盘之类的硬件设备送往内核,用以提示内核该设备需要加以注意。

一个重要的硬件中断源就是定时器设备,它周期性地通知内核已经通过的时间。

如同第5章中阐述的一样,中断也可以由用户进程通过软件产生。

在本章中,我们首先讨论一下Linux中信号量和中断的实现,最后再浏览一下Linux的时间处理方式。

虽然内核对代码的要求标准非常严格,本章所涉及的代码仍然特别清晰明白。

本章使用的一般方法是首先介绍相关的数据结构和它们之间的关系,接下来讨论操纵和查询它们的函数。

锁的概述锁的基本思想是限制对共享资源的访问——共享资源包括共享的文件,共享的内存片,以及在一次只能由一个CPU执行的代码段。

概括的说,在单处理器上运行的Linux内核并不需要锁,这是因为在编写Linux内核时就已经注意到要尽量避免各种可能需要锁的情况了。

但是,在多处理器机器上,一个处理器有时需要防止其它处理器对它的有害的介入。

include/asm-i386/spinlock.h文件(从12582行开始)并不使用难看的#ifdef把所有对锁函数的调用封装起来,它包含一系列对单处理器平台(UP)基本为空的宏,然而在多处理器平台(SMP)上这些宏将展开成为实际代码。

因而内核的其它代码对UP和SMP(当涉及到这种特性时)都是相同的,但是它们两个的效果却是迥然不同的。

第10章中涉及SMP的部分会对锁做深入的介绍。

但是,由于你在代码中将到处都能够看到对锁宏的调用,特别是在本章所讨论到的代码中这一点尤为明显,所以你应该首先对宏的用途有初步了解——以及为什么现在在大多数情况下我们都可以安全地将其忽略(我们将在讨论的过程中对其中的异常情况进行说明)。

信号量Linux内核将信号量分为两类:非实时的(Nonrealtime)——大部分是些传统的信号量,例如SIGSEGV,SIGHUP和SIGKILL。

●实时的(realtime)——由POSIX 1003.1b标准规定,它们同非实时信号量有细微的区别。

特别是实时信号量具有进程可以配置的意义——就像是非实时信号量SIGUSR1和SIGUSR2一样——额外的信息能够和这些信号量一起传送。

它们也会排队,因此如果在第一个信号量处理完成之前有多个信号量实例到达,所有的信号量都能够被正确传送;这对于非实时信号量则是不可能的。

在第7章中我们将会对实时性对于Linux内核的意义进行更详细的介绍——特别是实时性所不能够说明的内容。

信号量数目的宏定义从12048行开始。

实时信号量的数目在SIGRTMIN和SIGRTMAX (分别在12087行和12088行)所定义的范围之内。

数据结构本节讨论信号量代码使用的最重要的数据结构。

sigset_t12035:sigset_t表示信号量的集合。

根据使用地点的不同,它的意思也不同——例如,它可能记录着正在等待某一个进程的信号量(如16425行struct task_struct的signal成员)的集合,也可能是某个进程已经请求阻塞了的信号量(如同一行中定义的同一结构的blocked成员)的集合。

随着本书的进行,我们会逐渐看到这些类似的应用。

12036:sigset_t的唯一一个组成部分是一组unsigned long(无符号长整型数),其中的每一位都代表一个信号量。

注意到无符号长整型类型在整个内核代码中是作为一个字来处理的,这和你所希望的可能有所出入——即使是在当前x86 CPU的讨论中,有时候字也被用于说明16位类型。

由于Linux是一个真32位操作系统,将32位看作是一个字在绝大多数情况下是正确的。

(将Linux称为真32位操作系统也有一些不准确,因为在64位CPU上它也是一个真64位操作系统。

)这个数组的大小_NSIG_WORDS在12031行直接计算。

(_NSIG_BPW中的“BPW”是“bits per word(每字位数)”的缩写。

)在不同的平台上,_NSIG_WORDS的大小从1(Alpha平台中)到4(MIPS平台中)不等。

如你所见,在x86平台中,该值正好是2,这意味着在x86平台上2个无符号数就可以包含足够的位数来代表所有Linux使用的信号量。

struct sigaction12165:struct sigaction代表信号量到达时进程应该执行的动作。

它被封装在struct k_sigaction(12172行)结构中,而该结构又是被封装在struct signal_struct 结构中的,后者是struct task_struct结构的sig成员所指向的一个实例(16424行)。

如果这个指针为空,进程就会退出而不必接受任何信号量。

否则,每个进程对于每个信号量数目都需要若干_NSIG struct sigaction结构和一个struct sigaction结构。

12166:sa_handler(__sighandler_t类型——一个在12148行定义的函数指针类型)描述了进程希望处理信号量的方式。

其值可以是下面中的一个:●SIG_DFL(12151行)申请处理信号量的缺省操作,不管该操作是什么——这是由信号量所决定的。

注意它和NULL是等同的。

●SIG_IGN(12153行)意味着信号量应该忽略。

但是,并不是所有的信号量都可以被忽略的。

●所有的其它值都是在信号量到达时所需要调用的用户空间函数的地址。

12167:sa_flags进一步调整信号量处理代码所完成的工作。

可能的标志集合从12108行开始定义。

这些标志允许用户代码在信号量实例发送以后(或者保留用户定制的操作时)请求恢复缺省操作,等等。

这一点在宏定义块前面的标签注释中已经说明了。

12168:sa_restorer是本书中所没有涉及的一些信号量处理代码细节所使用的。

12169:sa_mask是一系列其它信号量的集合,进程在处理这些信号量的过程中可能需要进行锁定。

例如,如果一个进程在处理SIGCHLD的时候希望锁定SIGHUP和SIGINT,进程的第SIGCHLD个sa_mask就会对与SIGHUP和SIGINT相关的位进行置位。

siginfo_t11851:struct siginfo(也称为siginfo_t)是伴随着信号量,特别是在实时信号量,所传递的额外信息。

11852:勿庸置疑,si_signo是信号量的数目。

11853:si_errno应该是信号量传递时传送者的errno的值,这样接收者就可以对它进行检测。

内核本身并不关心这个值;当在某些情况下需要设置这个值时,内核将其设置为0。

我推测如果这样,即使调用者没有设置这个值,它们仍然会发现si_error的值被设为已知状态。

11854:si_code记录了信号量的来源(不是发送者的进程ID号,也就是PID——它在别处记录)。

有效的信号量来源在11915行及其随后部分使用宏进行了定义。

11856:该结构的最后一部分是union类型的;该union类型依赖于si_code的值。

11857:union的第一部分是_pad,它将siginfo_t的长度扩展填充为128*sizeof(int)字节(在x86平台上一共是512个字节)。

留意一下这个数组的大小,也就是SI_PAD_SIZE(11849行),代表了该结构的前三个成员——如果增加了更多的成员,SI_PAD_SIZE就需要进行相应修改。

struct signal_queue17132:struct signal_queue结构用来确保所有的实时信号量都被正确传送了,如果可能,每一个都包含着额外信息(siginfo_t)。

如同后面你将会看到的一样,内核会为每个进程都设置一个队列,用来存放该进程的挂起的实时信号量。

这个队列类型本身很小,仅仅由一个指向下一个节点的指针和siginfo_t本身组成。

应用函数有关信号量的一个最重要的数据结构是sigset_t,它是由一系列在include/linux/signal.h 文件中定义的简单函数所操纵的,这些函数的定义从17123行开始。

在x86平台上,这些相同的函数可以——而且已经——使用汇编语言更加有效的实现了;这些更高效的版本从12204行开始。

(m68k端口是唯一一个例外的端口,它使用体系结构特有的代码实现。

)由于平台无关的版本和x86特有的版本都很重要,我们会对两者都加以介绍。

平台无关的sigset_t函数配合sigset_t使用的平台无关的函数在include/linux/sigal.h文件中,从17123行开始。

称为“bitops”(位级的操作)的函数将在后面介绍。

sigaddset17145:sigaddset把一个信号量加入集合——也就是说,它修改了集合中的一位。

17147:为了便于位操作,将基于0的信号量转化为基于1的信号量。

17149:如果信号量中填入一个无符号长整型数,恰当的位就会被设置。

17151:否则,sigaddset就需要绕很多弯路,首先装入恰当的数组元素,接着设置该元素中相关位。

17148行的代码和该文件中后面的其它代码一样,第一次见到时可能会令人感到有些困惑。

在内核代码中,速度是压倒一切的因素。

从而,也许你并不会看到类似于下面的运行期间进行决定的代码:if (_NSIG_WORDS == 1)set->sig[0] |=1UL << sig;elseset->sig[sig / NSIG BPW] |= 1UL << (sig % NSIG BPW);而你看到的是类似于下面的在编译期间决定的代码:#if (_NSIG_WORDS == 1)set->sig[0] |=1UL << sig;#elseset->sig[sig / NSIG BPW] |= 1UL << (sig % NSIG BPW);#endif难道这样不会运行的更快些吗?不要忘了,if条件是能够在编译期间进行计算的,因此预处理器可以使系统没有必要在运行期间执行检测工作。

合集下载

操作系统5--信号量机制

操作系统5--信号量机制
信号量是一个被保护的变量,并且只能通过初始化和两个标准
的原子操作来访问.
1、整型信号量机制 2、记录型信号量机制 3、信号量集机制
5.1/28 2011
操作系统
1、整型信号量机制
1).整型信号量 是一个整数,表示空闲资源总数(又称为“资源信号量”) ----若为非负值表示当前的空闲资源数, ----为负值其绝对值表示当前等待临界区的进程数 ----初值应该大于零。
5.19/28
2011
操作系统
A.采用记录型信号量机制
Wmutex:互斥信号量:表示“允许写”,初值是1。 公共变量Readcount表示“正在读”的进程数,初值是0; Rmutex:互斥信号量:表示对Readcount的互斥操作,初值是1。
reader writer
Wait(Wmutex); Write; Signal(Wmutex); wait(Rmutex); if(Readcount=0) then wait(wmutex) Readcount=Readcount+1; Signal(Rmutex); //关闭写的同时允许读(无上限) read; Wait(Rmutex); Readcount:=Readcount-1; if Readcount=0 then signal(Wmutex); Signal(Rmutex); //适当的时候打开写
两个原子操作即: P,V操作。也常称为wait(s),singal(s)
(P、V分别是荷兰语的test(proberen)和increment(verhogen)) 即: P(s): Wait(s): while s<=0 do no_op s:=s-1; V(s): Singal(s): s:=s+1;

计算机操作系统中的信号量

计算机操作系统中的信号量

计算机操作系统中的信号量计算机操作系统中的信号量是一种用于多进程同步和互斥访问共享资源的工具。

它是一种在计算机领域中广泛使用的概念,应用领域涉及操作系统、网络通讯、多进程编程等多个方面。

本文将对信号量做详细的介绍和分析,希望能够帮助读者更好地理解和应用信号量。

一、信号量的概念信号量是一种记录某个共享资源被使用情况的计数器,控制共享资源的访问并保证它被正确地使用。

信号量实际上是一个变量,但是它的值被限制为不能小于零。

如果一个进程或线程试图访问一个已被占用的信号量,它就会被阻塞,直到另一个进程或线程释放该信号量。

信号量被广泛地应用于操作系统中,它可以用来解决多个进程或线程之间的同步和互斥问题。

比如多个进程或线程共享一个文件资源,需要通过信号量来控制对该资源的访问,保证每次只有一个进程或线程可以访问它,从而避免数据的冲突和错误。

二、信号量的类型在计算机操作系统中,信号量分为两种类型:二元信号量和计数信号量。

1. 二元信号量二元信号量又称为互斥锁(Mutex),它只有两个值:0和1。

当互斥锁的值为0时,表示该资源正在被占用,其他进程或线程不能访问;当互斥锁的值为1时,表示该资源空闲,其他进程或线程可以访问。

2. 计数信号量计数信号量是指信号量的值可以大于1的一种信号量。

计数信号量允许多个进程或线程同时访问共享资源,但必须在规定的最大许可数量内。

比如,一个计数信号量的值为5,表明当前最多有5个进程或线程可以同时访问共享资源,超过5个之后就必须等待之前的进程或线程释放资源再进行访问。

计数信号量是用于维护系统中限制并发数量的上限问题。

三、信号量的操作信号量的主要操作分为两种:P操作和V操作。

1. P操作P操作用于占用一个信号量。

当进程或线程需要访问一个共享资源时,需要先对该信号量进行P操作,如果信号量的值大于0,则进程或线程可以继续访问,同时将信号量的值减1;如果信号量的值为零,则进程或线程必须等待其他进程或线程释放信号量后再进行占用。

liteos任务调度原则

liteos任务调度原则

liteos任务调度原则一、引言LiteOS是华为公司开发的一款轻量级操作系统,它具有高效、稳定、安全等特点,并且可以适应各种不同的硬件平台。

在LiteOS中,任务调度是非常重要的一个组成部分,它负责管理和调度系统中的所有任务,确保系统能够高效地运行。

因此,在LiteOS中,需要遵循一些任务调度原则,以确保系统能够正常运行。

二、 LiteOS任务调度原则1. 任务优先级在LiteOS中,每个任务都有一个优先级,优先级越高的任务会被更早地执行。

因此,在设计LiteOS时,需要根据不同任务的重要性来确定它们的优先级。

通常情况下,系统内核和驱动程序的优先级应该比较高,而用户应用程序的优先级则相对较低。

2. 时间片轮转时间片轮转是一种常见的任务调度算法,在LiteOS中也采用了这种算法。

时间片轮转可以确保每个任务都有机会得到执行,并且可以防止某个任务长时间占用CPU资源导致其他任务无法执行。

在LiteOS中,默认时间片为10ms。

3. 互斥锁和信号量在多线程环境下,数据竞争是一个非常常见的问题,为了避免数据竞争,LiteOS中采用了互斥锁和信号量机制。

互斥锁可以确保同一时间只有一个任务能够访问共享资源,而信号量则可以控制任务之间的同步与通信。

4. 任务挂起和恢复在LiteOS中,可以通过挂起和恢复任务来实现任务的动态管理。

当某个任务暂时不需要执行时,可以将其挂起;当需要重新执行时,则可以将其恢复。

这种机制可以有效地节省系统资源,并且可以提高系统的响应速度。

5. 中断处理在LiteOS中,中断处理是非常重要的一个环节。

当硬件设备产生中断时,系统需要快速地响应并且进行相应的处理。

因此,在设计LiteOS 时,需要考虑到中断处理程序的优先级,并且需要确保它们能够及时响应。

6. 堆栈管理在LiteOS中,每个任务都有自己的堆栈空间。

为了确保堆栈空间不会溢出或者出现其他问题,需要对堆栈进行管理。

具体来说,需要记录每个任务使用的堆栈空间大小,并且在堆栈空间即将溢出时及时进行调整。

操作系统(三)——信号量、死锁

操作系统(三)——信号量、死锁

操作系统(三)——信号量、死锁1、信号量信号量机制:概念:其实就是⼀个变量,可以⽤⼀个信号量来表⽰系统中某种资源的数量、⽤户进程通过使⽤操作系统提供的⼀对原语来对信号量进⾏操作,从⽽⽅便的实现了进程互斥。

这⾥的⼀对原语是指wait(S)和signal(S),也简写为P(S)和V(S),即申请和释放资源。

P、V操作必须成对出现。

整数型信号量:⽤⼀个整数作为信号量,数值表⽰某种资源数。

对信号量的操作只有三种:初始化、P操作、V操作。

不满⾜让权等待原则。

记录型信号量:S.value表⽰某种资源数,S.L指向等待该资源的队列。

P操作中,先S.value++,之后可能执⾏block阻塞原语。

V操作中,先S.value--,之后可能执⾏wakeup唤醒原语。

可以⽤记录型信号量实现系统资源的申请和释放,申请S.value--,然后如果S.value<0说明资源分配完了,就阻塞;释放S.value++,然后如果S.value<=0说明还有进程在等待队列中等待,就唤醒。

记录型信号量可以实现进程互斥、进程同步。

实现进程互斥:划定临界区。

设置互斥信号量mytex,初值为1。

在临界区之前执⾏P(mutex),在临界区之后执⾏V(mutex)。

实现进程同步:分析那些地⽅是必须保证⼀前⼀后执⾏的两个操作。

设置同步信号量S,初始值为0。

在“前操作”之后执⾏V(S)。

在“后操作”之前执⾏P(S)。

实现前驱关系:每⼀对前驱关系都是⼀个进程同步问题。

为每⼀对前驱关系设置⼀个同步变量,初始值为0。

在“前操作”之后执⾏V操作。

在“后操作”之前执⾏P操作。

⽣产者消费者问题:⽣产者每次⽣产⼀个产品放⼊缓冲区,消费者每次从缓冲区取出⼀个产品使⽤。

缓冲区满⽣产者必须等待(同步关系1),缓冲区空消费者必须等待(同步关系2)。

缓冲区是临界资源,必须被互斥访问(互斥关系)。

问题中的P、V操作:⽣产者每次P⼀个缓冲区,V⼀个产品。

消费者每次V⼀个缓冲区,P⼀个产品。

操作系统必备基础知识

操作系统必备基础知识

操作系统必备基础知识今天给大家推荐两份大佬们总结的PDF,一份是计算机基础知识,一份是操作系统,反正帅地看完之后,和面试官聊天,都有点飘了,废话不多说,下面就让小编带你去看看哪些操作系统必备基础知识,希望能帮助到大家!操作系统基础知识操作系统是计算机体系中必不可少的核心系统软件,其他软件(如编辑程序、汇编程序、编译程序、数据库管理系统等系统软件,以及大量应用软件)是建立在操作系统的基础上,并在操作系统的统一管理和支持下运行。

操作系统是用户与计算机之间的桥梁,用户可以通过操作系统提供的功能访问计算机系统中的软硬件资源。

操作系统的作用是通过资源管理提高计算机系统的效率,改善人机界面,为用户提供有好的工作环境。

有效地组织和管理系统中的各种软硬件资源,合理的组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。

简单的说,操作系统就是运行在计算机硬件和软件(其他系统软件和应用软件)之间的一个系统软件,它的主要作用就是让计算机能够运行的很好的同时让你觉得也不错。

操作系统分为这么几种:批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统、嵌入式操作系统、微机操作系统(这个我们就比较常见了,比如Linux、Windows、Unix、手机上的基于Unix的安卓系统等等)。

操作系统的功能可分为5大部分:处理机(CPU)管理、文件管理、存储管理、设备管理和作业管理。

下面说说处理机管理中的一些基础知识。

三态模型五态模型在多道程序环境的系统中,存在多个可以一起进行(并发执行)的进程,因此必然会存在进程之间的通信问题。

进程间的通信主要有同步、互斥、调度、死锁、信号量机制等问题进程间的同步多个进程都是独立进行的,有的时候需要在某些地方协调一下,比如进程A在生产一个原件,进程B要加工这个原件,这时候就需要进程B等待进程A完成后才能开始进行,这就是进程之间的同步。

进程间的互斥这就是指两个进程都想用同一个资源,但是这个资源同时只能被一个进程使用。

信号量底层原理

信号量底层原理

信号量底层原理
信号量是一种线程同步工具,用于控制多个线程间的并发访问。

信号量底层原理一般基于原子操作和操作系统的原语实现。

常见的实现方式有基于计数器的二进制信号量和计数信号量。

1. 二进制信号量:
二进制信号量只有两个状态,通常用0表示锁定状态,用1表示解锁状态。

其底层原理一般基于原子操作实现,在多线程访问时,先检查信号量的状态,如果为锁定状态则等待,直到状态被解锁,则将状态设置为锁定状态,并进行相应的操作。

2. 计数信号量:
计数信号量的状态是一个整数,通常表示资源的可用数量。

其底层原理也基于原子操作,它包括两个主要操作:P操作和V
操作。

- P操作(也称为wait操作):当一个线程想要访问一个资源时,首先检查计数信号量的状态,如果计数大于0,则将计数
减1,并继续执行该线程的任务,否则线程被阻塞直到计数大
于0。

- V操作(也称为signal操作):当一个线程使用完一个资源后,它会通过V操作来释放资源,将计数信号量的计数加1,表示该资源可用。

在操作系统中,信号量的实现通常依赖于硬件的原子操作或者操作系统提供的原语,例如使用特定的机器指令或系统调用来
保证原子性。

不同的操作系统和编程语言可能提供不同的信号量实现方式,但底层的原理类似。

freertos的中断管理及其他用法

FreeRTOS 是一个用于嵌入式系统的实时操作系统(RTOS),它提供了丰富的功能和API,方便开发者进行任务管理、中断管理和其他实时操作系统的相关操作。

以下是FreeRTOS 中断管理和其他用法的概述:1. 中断管理:- FreeRTOS 提供了`vPortEnterCritical()` 和`vPortExitCritical()` 函数来实现中断的临界区保护。

在进入临界区前调用`vPortEnterCritical()`,在离开临界区时调用`vPortExitCritical()`。

这样可以避免多个中断同时访问共享资源的竞态条件。

- FreeRTOS 还支持软件自动优先级调度(Priority Inheritance Protocol, PIP),这可以确保高优先级任务可以及时响应中断。

2. 任务管理:- 使用FreeRTOS,您可以使用`xTaskCreate()` 函数来创建任务。

每个任务都有自己的优先级和堆栈空间。

- FreeRTOS 提供了任务管理的API,例如:`vTaskDelay()` 用于延迟任务的执行,`vTaskDelete()` 用于删除任务,`vTaskSuspend()` 和`vTaskResume()` 用于暂停和恢复任务的执行等。

- 您可以使用`xTaskCreateStatic()` 函数创建静态任务,从而节省动态分配内存的开销。

3. 信号量和互斥量:- FreeRTOS 提供了两种同步机制:二进制信号量和计数信号量。

您可以使用`xSemaphoreCreateBinary()` 和`xSemaphoreCreateCounting()` 函数创建信号量。

- 使用`xSemaphoreTake()` 和`xSemaphoreGive()` 函数获取和释放信号量,以控制任务和中断之间的访问权。

- 互斥量是一种特殊的信号量,用于实现任务对共享资源的互斥访问。

您可以使用`xSemaphoreCreateMutex()` 函数创建互斥量。

信号量的作用与使用方法

信号量的作用与使用方法一、引言信号量是一种用于同步和协调多个进程或线程的工具,它在多任务环境下起着至关重要的作用。

通过使用信号量,我们可以控制对共享资源的访问,避免竞争条件和死锁等问题,提高系统的效率和稳定性。

本篇文章将详细介绍信号量的作用与使用方法。

二、信号量的基本概念信号量是一个整数值,用于表示系统中可供使用的资源数量。

它通常用两个值来表示:非零值表示可用资源数量大于零,而零或负值表示资源数量不足。

通常用一个P(Proberen)和V(Verwerken)操作来改变信号量的值,P操作用于减少信号量的值,表示请求资源,如果资源可用,则减少资源数量并返回成功;如果资源不可用,则等待资源可用后再执行后续操作。

V操作用于增加信号量的值,表示释放资源,当一个进程完成了对资源的占用后,它可以通过执行V操作来释放资源供其他进程使用。

三、信号量的作用1. 同步:通过使用信号量,可以控制多个进程或线程对共享资源的访问。

当一个进程需要访问共享资源时,它会等待信号量变为可用状态,然后进入临界区访问资源。

这样,多个进程或线程可以按照一定的顺序访问共享资源,避免竞争条件和死锁等问题。

2. 避免资源浪费:通过使用信号量,可以控制资源的分配和释放,避免不必要的资源浪费和系统负载过高。

3. 协调任务执行:信号量可以用来协调多个任务之间的执行顺序和时间分配,从而提高系统的整体效率。

四、信号量的使用方法1. 初始化信号量:在使用信号量之前,需要先对其进行初始化。

通常,我们会使用一个初始值为1的信号量来表示共享资源的可用数量。

2. 申请资源:当一个进程需要访问共享资源时,它会使用P操作来请求资源。

如果资源可用,则减少资源数量并允许进程进入临界区;如果资源不可用,则该进程会被阻塞,直到信号量变为可用状态后再继续执行。

3. 释放资源:当一个进程完成对共享资源的访问后,它会使用V操作来释放资源。

这会增加信号量的值,以便其他进程可以申请资源。

Linux之信号量,比较全面,个人总结。

信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。

信号量的值为正的时候,说明它空闲。

所测试的线程可以锁定而使用它。

若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

二.信号量的分类在学习信号量之前,我们必须先知道——Linux提供两种信号量:POSIX信号量又分为有名信号量和无名信号量。

有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。

无名信号量,其值保存在内存中。

倘若对信号量没有以上的全面认识的话,你就会很快发现自己在信号量的森林里迷失了方向。

三.内核信号量1.内核信号量的构成内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。

然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。

只有在资源被释放时,进程才再次变为可运行。

只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。

count:相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。

wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。

sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠。

2.内核信号量中的等待队列(删除,没有联系)上面已经提到了内核信号量使用了等待队列wait_queue来实现阻塞操作。

当某任务由于没有某种条件没有得到满足时,它就被挂到等待队列中睡眠。

当条件得到满足时,该任务就被移出等待队列,此时并不意味着该任务就被马上执行,因为它又被移进工作队列中等待CPU资源,在适当的时机被调度。

内核信号量是在内部使用等待队列的,也就是说该等待队列对用户是隐藏的,无须用户干涉。

由用户真正使用的等待队列我们将在另外的篇章进行详解。

3.内核信号量的相关函数(2)申请内核信号量所保护的资源:4.内核信号量的使用例程在驱动程序中,当多个线程同时访问相同的资源时(驱动中的全局变量时一种典型的共享资源),可能会引发“竞态“,因此我们必须对共享资源进行并发控制。

中断响应时间-中国科学技术大学

CPU的内部寄存器越多,额外负荷就越重。 还与指令周期长度有关


实时内核的性能不应该以每秒钟能做多少 次任务切换来评价。 RTOS中通常是1微秒左右
of Science and Technology of China
University
7
任务抢占时间

当一个事件引起更高优先级的任务TaskHigh就绪到 这个任务开始运行之间的时间。 Ttask_preemption=T4+Tsched+Tcontext_switch
2
操作系统关键指标有哪些?


最多支持进程/线程的个数 是否支持虚拟内存 System call time RTOS相关指标:
系统响应时间 上下文切换时间 中断延迟时间 中断响应时间 任务切换时间 调度器延迟时间 周期性抖动(jitter)

University
of

死锁解除时间反映了RTOS解决死锁的算法的效率。
1、任务切换时间(task switching time) : 即系统在两个独立的、处于就绪态并具有相同优 先级的任务之间切换所需要的时间。

包括三个部分:
保存当前任务上下文的时间 调度程序选中新任务的时间 恢复新任务上下文的时间。

此时间取决于 1)保存任务上下文所用的数据结构 2)操作系统采用的调度算法的效率。
China
5
中断响应时间

Linux2.4内核的中断处理
从计算机接收到中断信号到操作系统作出 响应,并完成切换转入用户中断处理程序 (即驱动程序注册的ISR)的时间。 中断响应时间Tresponse=T1+T2+T3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档