并发的本质:并发并不是并行,尤其在单核处理器中使用多任务的程序构架,任务被交替的执行,表现出的一种现象仿佛是并行执行,实际是在进程间来回切换任务执行,虽然会有一定的开销,但是交替执行在处理效率和程序结构上还是带来了很大的好处。
抢占式的内核有它的优势,但并不是所有的应用场景都必须选择抢占式的内核,不选择可抢占式内核的理由:
潘多拉魔盒之并发:
假如你先择了抢占式内核,那么你在程序设计和调试的问题上,就会像是打开了潘多拉魔盒一样。每个指令之间都可以互相抢占,由于CPU的资源是被共享的,最显而易见的共享资源是谁--全局变量啊
所以引入了并发的问题。然而并不是所有的共享资源都这样的显而易见,有的也许比你想象的更具有伪装性,例如:来自于标准库或者其他源代码的非可重入代码。这是抢占式内核最大的问题,为了解决这一问题任务间引入了同步与通信机制来为解决这一问题提供工具。
吾之拙见:此处并发是一种病态,如何发现隐藏的资源共享,是解决并发问题的关键。
可抢占式内核的空间开销:
需要更多的堆栈空间,因为所有的抢占处理都是在堆栈中进行,也就是要消耗更多的RAM。
可抢占式内核的时间开销:
任务的切换,调度的启用,更多的临界区被设定,这些都需要额外的CPU时间开销。
在程序设计中,开发者容易遇到的由于并发所引入的问题:
竞争条件:何为竞争,就是两个优先级不同的任务同时对某一资源进行操作时,由于任务的优先级不同,当一个任务在操作到一半的时候,被另一个任务抢占然后操作该资源,最后而得到的一个异常的结果。
死锁:两个或两个以上的进程因其中的每个进程都在等待其他进程做完某些事情而不能继续执行,这种情形称为死锁,举个栗子,任务A持有小a资源,在运行过程中要申请B任务持有小b的资源,因为得不到而被阻塞,这时候B任务开始运行, 由于需要申请A任务的小a资源因为得不到,而被阻塞,这时候双方都在等待对方释放资源而被阻塞,都得不到运行,形成了死锁。
优先级倒置:这也是因为资源的持有导致的,任务的本质也就是资源管理,当高优先级的任务抢占运行时,由于需要申请低优先级的任务中的资源而被阻塞,这时候,按道理会启用低优先级的任务进行执行,突然来了一个中优先级的任务,结果低优先级任务被强占,高优先级任务被阻塞,只有中优先级任务被运行。
饥饿:这个最好理解,就是由于优先级任务设置的不合适,高优先级任务长时间霸占CPU,导致低优先级任务无法运行。
不确定性:当系统内核从合作式变为抢占式内核,任务的执行就变得异常复杂,某一时刻发生的一个事件可能会系统任务发生强占,由于事件的发生存在不确定性,所以任务的运行顺序也就变得越来越模糊,只能通过运行的结果,任务被切换的顺序去分析某个事件在某个时刻的发生是否合理。