我们废话少说,直接进入主题吧,今天所要描述的几个内容:
(1)并发概念;
(2)并发的后果;
(3)并发的来源;
(4)并发的解决方法。
1、并发定义
大家都知道,程序的执行顺序有并发和顺序两种执行方式,那我们就先先看看
顺序执行方式。
所谓顺序执行把一个具有独立功能的程序独占处理机直至最终结束的过程成为
程序的顺序执行。
顺序执行的特点:
(A)顺序性:一个程序在顺序处理器上的执行是严格按序的,即每个操作必须
在下一个操作开始之前结束。
(B)封闭性:在顺序处理情况下,运行程序独占系统全部资源,除初始状态之
外,其所处的环境都是由程序本身决定的,只有程序本身的动作才能改变其环境,
不会受到任何其他程序和外界因素的干扰。
(C)正确性:程序在过程中允许中断,但这对最终的执行结果不影响。
(D)可重现性:一个程序针对同一个数据集合一次执行的结果,在下一次执行
时会重现,即重复执行程序会获得相同的执行结果。
而所谓并发,在 OS 中,是指一个时间段中有几个程序都处于已启动运行到运行
完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个
程序在处理机上运行。而在多道程序环境下,并发性是指在一段时间内宏观上有多
个程序在同时运行,但在单处理机系统(UP)中,每一时刻却仅能有一道程序执行,
故微观上这些程序只能是分时地交替执行。
从概念中我们可以得出并发的几个特点:
(A)间断性:程序在执行中是走走停停,断续推进的==》执行--暂停--执行;
(B)失去封闭性:由于多道程序共享系统资源,系统资源的状态由最后一次执
行所决定,导致程序所想要的系统资源错综复杂,而不像顺序执行效果那样;
(C)不可重现性:由于程序封闭性,从而导致了程序的不可再现。
2、并发的后果
程序开发者,虽然顺序执行从编制和调试给人们带来好处,但它觉得顺序效率
太低了,无法满足人们的需要;因而引入了并发执行顺序,但并发导致了程序失去
封闭性,多道程序共享系统资源和交叉执行,从而导致了程序的准确性降低,特别
是那些共享资源很容易被破坏。因此并发程序设计的特点之一,就是如何去保护好
这些共享资源,不过我们得先了解哪些原因会造成并发。
3、并发的来源
1)中断==》中断在内核中几乎是随时随地都会发生的,也可能随时打断正在
运行的代码;
2)睡眠和再唤醒==》在内核执行的进程可能会睡眠,当它被唤醒的时候就会
重新被调度咯;(这是2.6之前的大部分的并发来源)
3)内核抢占==》由于内核加入内核强占机制,导致正在执行任务,可能被另
一个具有更高优先级的任务所强占。
4)SMP==》两个或者多个CPU可以执行代码。(可以实现并行执行代码)。
4、并发的保护
在2.0以前,只有中断或者内核代码显示的请求重新调度,并发才可能发生。
但随着时代技术的发展,在2.0之后,内核支持对称SMP,在2.6支持内核强占,从而
导致并发随时发生,代码同步执行,共享数据被破坏严重。这也就决定了保护共享
资源的重要性。
由于多个线程同时访问和操作同一资源是不安全的(访问和操作共享数据的
代码段就被称为临界区),为了避免在临界区并发访问,这些共享的数据段必须执
行完毕之前不可被打断。如果确实发生了,我们就称为竞争条件。为了避免并发和
防止竞争的发生就称为同步。
在内核中提供了同步的操作方法:原子操作/自旋锁/信号量/RCU/BKL/顺序锁
等。
阅读(1197) | 评论(0) | 转发(0) |