EA&UML日拱一卒-多任务编程超入门-(2)进程和线程

作为多任务编程的基本概念,进程和线程的概念是无论如何回避不了的。很多公司面试时也会问倒二者的区别。如果到互联网上随便搜一下,就能找到关于进程和线程的文章,但是相信读过之后,懂得人会点头,不懂的还是不懂。所以本文采用另外一种方式来说明。


单任务系统的情况


在这种情况下,所有的系统资源都交给程序使用,编程者只需要考虑处理的流程和逻辑即可。这里的资源包括:CPU时间,内存(堆,栈),全局变量,硬件设备(显示器,键盘,通讯接口,音频设备)等。


多任务操作系统的情况


进程


对于编程者来说,最理想的情况就是,根本不用意识自己是多任务操作系统环境中编写程序。


也就是说,至少看起来所有的系统资源都交给程序使用,编程者只需要考虑处理的流程和逻辑即可。这里的资源包括:CPU时间, 内存(堆,栈,全局变量),硬件设备(显示器,键盘,通讯接口,音频设备)等。


但问题是,物理内存,设备只有一份,多个程序同时执行时必然发生竞争。这个问题当然不用我们考虑,因为多任务操作系统已经解决了:


  1. 为每个程序提供一定的CPU时间,保证程序可以按照某种间隔被执行。这种执行是二进制机器码层面的。

  2. 为每个程序提供了独立的,虚拟的内存空间,程序对虚拟内存进行的操作会映射到实际的物理内存上。

  3. 对于显示部分,提供了窗口机制,将程序的输出导向特定的窗口。同时系统将键盘,鼠标的输出导向当前活动的窗口。

  4. 有一些硬件,比如音频输入设备,串口等实在无法在程序之间共享。这样的硬件就采用了独占的方式,如果某个程序占用了某个设备,其他程序就不能使用。


这些都做到以后,可以说基本上实现了我们的理想:编程者不用意识自己是在为多任务操作系统编写程序。每个任务作为单独的程序来设计和实现,任务之间的调度利用操作系统的功能来实现。


这样的程序执行过程就是进程。基本上进程就相当于多任务操作系统中的应用程序。(许多规模较大的应用也可以包含多个进程)


进程的好处是最大限度保持程序执行过程之间的独立性,使增加任务或者调整任务内容变得简单。但同时也可以看到操作系统要为每个进程分配资源,映射内存操作,控制各种输入输出。所有这些都需要相当的系统开销。所以多任务操作系统也是随着硬件性能的提高而逐渐发展起来的。


线程


理解了进程的优缺点以后,再理解线程就容易了。很多时候在一个进程内部还是需要多任务处理,比如视频时软件在视频解码时还要接受用户操作。对于这种情况下就需要在进程内部提供多任务处理机制:线程。


线程之间CPU时间的分配和进程类似,但是共同使用进程的资源,操作系统不必为每个线程提供另外的映射机制,这样做的结果:


  1. 多个线程共用一个资源时,需要编程者利用操作系统提供的接口主动的进行访问控制和同步。

  2. 由于使用共同的内存空间,堆,栈等,所以不需要另外的地址映射等处理,可以实现比较快速的数据交换。


总结


就好像没法回答夏天和冬天那个更好一样,也没有办法回答进程和线程那个更好,我们应该做的就是在适当的场合使用适当的技术。


写在文章的最后


既然已经读到这里了,拜托大家再用一分钟时间,将文章转发到各位的朋友圈,微信群中。

本公共号的成长需要您的支持!
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】
EA&UML日拱一卒-多任务编程超入门-(2)进程和线程