串行与并行

来源:互联网 发布:天下三女龙巫捏脸数据 编辑:程序博客网 时间:2024/05/05 08:54

摘要:程序或程序段在系统中有两种执行方式。一种是顺序执行,一种是并发执行。但是很多时候我们写的是串行的程序,而操作系统确实又要并发执行程序,这往往会产生一些让程序员感到“很奇怪”的错误。本文就UNIX下和WINDOWS下的并发问题进行了讨论,从例子中可以看到操作系统确实是在并发执行程序。

1、 问题提出:

很多人在调试程序的时候发现,单独运行一个程序实体时能够得到正确的结果,当同时运行两个或多个实体时运行结果不正确。这样的错误也是初级程序员容易犯的,这是因为操作系统是并发执行程序的,而程序员写的是串行的程序。

2、 串行与并行:

有两种执行程序的方法。一种是顺序执行,另一程是并发执行。所谓顺序执行就是指程序中的程序段必须按照先后顺序来执行,也就是只有前面的程序段执行完了,后面的程序段才能执行。这种做法极大地浪费了CPU资源,比如系统中有一个程序在等待I/O输入,那么CPU除了等待就不能做任何事情了。为了提高CPU的使用效率、支持多任务操作,操作系统中引入了并发技术。所谓并发是指系统中的多个程序或程序段能够同时执行,这里的同时执行并不是指某一个时刻多段程序在同进执行(除非有多个CPU),而是CPU能把时间分给不同的程序段。比如前面等待I/O的例子,若采用并发技术,当一个程序在等待I/O时,系统可以把CPU资源分配给另外的程序,这样能减少CPU的空闲时间提高了资源利用率。

3、 操作系统如何实现并行:

在操作系统中有多种实现并发的技术,最常见的就是多进程和多线程技术。进程是程序一次运行的过程,它是动态的、有生命周期。我觉得可以举这样一个例子来理解一个进程。建房子的过程是这样的:首先由设计师设计好房子,然后由施工人员按照设计好的图纸把房子建起来。在这里,我们写好的程序代码就好像是设计好的图纸,而进程就是按照这张图纸把“房子”建起来的整个过程,也就是按照“图纸”实现整个程序功能的过程。线程是进程内一个相对独立的、可调度的执行单元。线程存在于进程中,每一个进程中可以有多个线程。

4、 并行的特征:

1、不可再现性:也就说,当一个程序重复执行时,即使初始条件相同,运行结果可能不相同。

2、间断性:由于多个程序同时在系统中执行,系统要为每个程序分配CPU时间,这样就会导致一个程序可能在没执行完就被剥夺了CPU的使用权,从而导致程序运行时是间断的。在并发系统中,很多程序都是按执行----暂停----执行的活动规律运行的,其中有些程序是因为所分配的CPU时间用完了而中断,有些是为了同步而中断。

3、失去封闭性:程序并发执行时共享系统的资源,这样使得系统资能够被多个程序改变,也就是说一个程序的运行能够影响到另一个程序的运行,使得程序的运行不再是在一个封闭的环境下了。

5、并发控制技术:

处理并发问题的技术主要有信号、信号量、文件锁、互斥量、临界区、事件等。这里有些是用来解决并发时的互斥问题有些是用来解决同步问题的,下面我主要讨论下文件锁在并发操作中的使用。所谓文件锁就对一个文件所加的锁,当一个进程对一个文件进行加锁后,就可以限制其他进程对该文件进行访问。比如在系统中有两个进程AB要对同一个文件进行读写操作,由于AB在系统中并发执行,所以在不加锁的情况下AB读到“脏”数据。现在加上文件锁,假设第一次是A进程得到了锁,当B进程想读写时就会被拒绝,在A写完数据后再解开锁,这时B就可以访问文件了并对它加锁,B读写完后再释放锁。这样AB都不会读到脏数据,运行结果也就会是正确的。

5、 实例演示:

以下是两个并发执行程序的例子。第一个是Unix下并发程序例子。程序的功能是两个进程同时对一个文件进行读写操作,每次都是从文件中读取一个数加1并在屏幕上打印该数,然后将加完后的数写进文件中,重复该操作10次。第二个程序也是实现同样的功能,但它是Winodws下的程序,采用了多线程来实现并发操作。以下是程序运行的结果:




 



结果分析:当程序顺序执行,运行的结果是所有的数都是按顺序递增的。而现在的结果却不是,这是因为当一个A线程或进程从文件中读取数加1后,在它把这个加1后的数写进文件前,另外一个B线程或进程获得了CPU,所以B线程或进程读取的是还是原来的数,而不是加1后的数。

下面我们将对上面的程序加上并行处理技术。第一个程序加上了文件锁来实现互斥,第二个程序是用临界区来互斥的,以下是运行结果:






 

 

结果分析:从以上结果我们加以看到加锁后程序正确运行,并得到了我们想要的结果。从以上结果我们也可以看到这两个线程所分配的时间也是没有规则的,有随机性。并发技术在很多程序中都应用到了,特别是在服务程序中,只有采用并发技术,它才能让多个用户同时得到服务,而客户感觉好像就是自已一个独占整个服务。

原创粉丝点击