内容包括回调函数、死锁与线程同步、进程间通信等
树图思维导图提供 程序员知识点补充思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 程序员知识点补充思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:f3583af99ae43c6f353439932bd01232
程序员知识点补充思维导图模板大纲
应用层的函数A调底层的函数B,顺便把应用层的函数C当参数传给B,而B在底层执行的时候,需要回到应用层调用C,这个过程就叫回调,而函数C就是回调函数。
乙需要用到甲提供的接口,那么,甲的接口函数给到乙的这个过程就叫注册回调函数。注册的方式主要为两种,一种是独立出注册函数,另一种是直接在参数中接收
死锁
产生死锁的四个必要条件
互斥条件:一个资源一次只能被一个进程使用。
请求与保持条件: 进程已经保持了至少一个资源,又提出了新的资源请求,而该资源已经被其他进程占有。此时请求进程被阻塞,而对自己已获得的资源保持不放。
不可剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由进程自己主动释放。
循环等待条件:若干进程间形成首尾相接循环等待资源的关系。
死锁产生的主要原因
系统资源竞争:资源分配不当,以及系统资源的竞争导致系统资源不足,导致死锁;
进程运行推进顺序不合适:进程在运行过程中,请求和释放资源的顺序不当,导致死锁。
同步
互斥锁
(1) 首先申请互斥锁,如果该互斥锁处于锁定状态,默认阻塞当前线程;如果处于解锁状态,则申请到该锁并立即占有该锁,使锁处于锁定状态防止其他线程访问该资源。 (2) 只有锁定该互斥锁的线程才能释放该互斥锁,其他线程试图释放操作无效。
条件变量
条件变量不能单独使用,必须配合互斥锁一起实现对资源的互斥访问。
条件变量主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。
读写锁
适合于对数据结构读的次数远大于写的情况
读写锁可以有三种状态:读模式下加锁状态;写模式下加锁状态;不加锁状态
读模式:当读写锁在读模式下时,只要线程获取了读模式下的读写锁,该锁所保护的数据结构可以被多个获得读模式锁的线程读取。
写模式:当读写锁在写模式下时,它所保护的数据结构就可以被安全地修改,因为当前只有一个线程可以在写模式下拥有这个锁。
常见的通信方式
1.管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2.命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
3.消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5.信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
7.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
无名管道
1.是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
2.只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)
3.管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:
4.代码例子: 父进程创建管道,并在管道中写入数据,而子进程从管道读出数据
命名管道
内容:和无名管道的主要区别在于,命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。
创建:mknod()或makefifo()来创建一个命名管道
用select把,管道描述符和stdin假如集合,用select进行阻塞,如果有i/o的时候唤醒进程
消息队列
意义:消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。
与管道通信相比:其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。
消息队列的常用函数:
ftok:由文件路径工程ID生成标准key
msgget:创建或者打开消息队列
msgsnd:添加消息
msgrcv:读取消息
msgctl:控制消息队列
共享内存
原理:共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信
作用:采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。
信号量
特点
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。
树图思维导图提供 抓住重点 在线思维导图免费制作,点击“编辑”按钮,可对 抓住重点 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:4c49e4799ddf94a339c56e46eb96a826
树图思维导图提供 数智技术在工程设备管理中的应用 在线思维导图免费制作,点击“编辑”按钮,可对 数智技术在工程设备管理中的应用 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:f9a2de84ad9a9ceebc96385d71be9ebe