多任务相关概念
本文所有认为是重点的都进行加粗处理,如果后续认为不重要了或认为其他内容也该是重点内容可以适当修改加粗。
常见术语
竟态
竞态定义:多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态。竟态是一种错乱现象,它的发生需要同时具备以下3个条件:
1、多任务情况下并行执行任务
2、在同一时刻下
3、操作同一资源
例如,两个线程同时对一个全局变量 count 进行加1操作。如果没有适当的同步机制,可能会出现以下情况:线程1读取 count 的值为10,线程2也读取 count 的值为10,然后线程1将 count 加1并写回为11,线程2也将 count 加1并写回为11,而不是预期的12,这种现象就是竟态。
临界区代码
临界区定义:操作共享资源的代码段。比如,多个线程可能对同一个全局变量进行读写操作,那么对这个全局变量进行读写的代码部分就是临界区。我感觉直接叫临界区不好理解,我以后将临界区称为临界区代码
并发控制机制
定义:为了解决竞态,需要提供一类控制机制,来避免在同一时刻使用共享资源,这类机制被称为并发控制机制。我们知道竟态需要满足3个条件才会发生,也就是说只要让其中一个条件不成立就可以避免竟态现象的发生,仔细想想就会发现为了让保证执行效率和方便数据交互条件1和条件2都不得不成立,所以也只能让条件2不成立,即让同一时刻下不会使用共享资源。
注意:并发控制机制是解决让同一时刻下不会使用共享资源的一类机制,它不是某种机制而是一类机制的统称。
并发控制机制分为以下几种机制:
1. 原子操作机制:通过硬件或软件机制确保操作的原子性,即操作在执行过程中不会被中断,要么全部执行完成,要么完全不执行。
2. 忙等待机制:忙等待机制让线程在等待某个条件满足时,不断地执行一个循环来检查条件,而不是进入阻塞状态。在循环中,线程会持续占用处理器资源,反复检查相关条件是否成立,直到条件满足才会退出循环,继续执行后续的操作。也就是说临界区代码之前判断临界区代码是否被占用执行,如果被占用执行就不断循环判断是否被占用执行,直到判断出没有被占用执行才退出循环执行临界区代码。
3. 阻塞机制:如果临界区代码被占用执行那么就睡眠即阻塞等待临界区代码不被占用执行了再执行。
4、中断屏蔽机制:在开始执行临界区代码时先屏蔽中断,在执行完临界区之后再恢复中断,适用场合:中断上下文与某任务共享资源时,或多个不同优先级的中断上下文间共享资源时
p操作与v操作
p操作和v操作是一对原语操作,必须成对出现,说白了,p操作与v操作就是为了更好的判断临界区有没有被使用。具体描述见豆包说的以下内容。
p操作内容:将信号量的值减1。若结果大于等于0,进程或线程可以继续执行,如进入临界区访问共享资源;若结果小于0,进程或线程会被阻塞,放入与该信号量相关的等待队列。
v操作内容:将信号量的值加1。若加1后信号量的值小于等于0,说明有进程或线程在等待该资源,则唤醒等待队列中的一个进程或线程,让其获得资源并继续执行。
终端