摘要:
互斥量 互斥量 通过将信号量设置为1,也可以实现信号量的互斥访问。在os中,提供一种专门的机制-互斥体,来进行互斥访问。 互斥体访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在互斥访问的场景尽量使用互斥体-mutex。 互斥体数据结构 互斥体数据结构文件:include/linux/ 阅读全文
摘要:
信号量 信号量的引入 对于操作共享空间时间较长的场景,对于自旋锁的使用不太合适,自旋锁适用于快速完成的场景。因为自旋锁会关闭抢占与中断。 在执行完成之后,在开启中断与抢占。对于不能快速完成,等待时间较长的的场景,不适用于自旋锁。由此引入信号量机制, 而信号量机制的引入的特点,信号量可以使线程进入休眠 阅读全文
摘要:
自旋锁 自旋锁概念 锁有自旋与睡眠两种。当进程无法获取锁资源,该进程不会休眠,会一直循环等待,一直到资源可用。 自旋锁接口函数 接口函数定义在include\linux\spinlock.h中,接口函数: 函数名 作用 spin_lock_init(_lock) 初始化自旋锁为unlock状态 vo 阅读全文
摘要:
原子操作 原子的引入 在上篇文章并发与竞争中,由于多线程对于共享变量的访问而引入的问题,不符合程序的期望。 为了规避这个问题,引入原子操作,对共享变量不能被打断。 原子操作有两种:原子变量,原子位。 原子变量内核操作 原子变量的内核文件:include/linux/types.h 图 1 原子变量数 阅读全文
摘要:
并发与竞争 并发与竞争的提出 对于全局变量区域,不同的任务(线程)可能会访问变量区的同一变量,这种对于同一内存访问的情况,就是并发情况。而对于这种并发的问题,会引入竞争。 int a = 1; a++; 对于全局变量int a,对于其操作加1操作。 并发与竞争机理 假设有两个或者两个以上的线程A,线 阅读全文
摘要:
定时器 定时器 定时器作为重要模块。是支持完成调度的基础之一。主要主要有两个方面:时间,动作。对应程序中的超时时间,函数。 在内核中使用定时器的接口函数: setup_timer(timer, fn, data):设置定时器,主要是初始化timer_list结构体,设置其中的函数、参数。 void 阅读全文
摘要:
阻塞与非阻塞 阻塞与非阻塞概念 阻塞:等待某件事情发生。如前面举例说明,使用read函数获取底层硬件数据,如果没有数据,会让任务休眠等待。 在使用poll方式,如果传入的等待时间不为0,任务是需要休眠等待的,也是阻塞的。 如果poll方式,将传入的等待时间为0,也即是不等待。没有数据立马返回,这是非 阅读全文
摘要:
异步 异步引入 前几章节提供的休眠-唤醒,poll机制,都需要休眠等待某个事件发生。但是在实际中,我们并不会休眠等待事件的发生, 而是采用另一种方式,等外部事件发生之后,将结果通知给我们。在程序中,就是驱动程序中的数据主动上报给App,App收到信号之后, 执行对应的动作。这种机制称为“异步机制”。 阅读全文
摘要:
Poll机制 Poll机制引入 休眠-唤醒机制来等待某个事件产生。完全取决的外部事件,可能等待的时间可能太长。为了避免等待时间过长, 增加超时时间,就是对应的poll机制。 具体流程: 使用poll机制,查询驱动程序是否有数据。 进入内核态,如果有数据,立刻返回 如果当时驱动中没有数据,内核程序进入 阅读全文
摘要:
休眠与唤醒 在中断的简介里面,介绍了四种模式:查询,休眠-唤醒,poll机制,异步通知机制。本节主要说休眠-唤醒机制。 举例:我们在等待按键被按下,可以使用“休眠-唤醒”机制。在应用程序中,等待按键事件发生。 1.APP使用read等操作函数尝试读取硬件底层数据。 2.APP调用read等函数,进入 阅读全文