备注:阅读本博客之前,需要具备一点面向对象编程的知识(很少的一部分,别慌)
关于进程的一点理解
在任何时刻需要记住一点:任何某一时刻CPU只能执行一条指令,为 一个进程服务,而不是多个进程服务。
什么是多进程?
比如你可以一边听网易音乐,一边聊天;这是两个不同的进程,这就是多进程;
但是上文说某一时刻CPU只能干一件事情,是否矛盾?
在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如1毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样,给用户的感觉就是并行。但实际上在任何一个时间内有且仅有一个进程占有CPU(这就是实现并发技术的时间片轮流调度算法)。
程序,进程,线程的血缘关系(不看后悔)
我们究竟应该如何理解程序,理解进程,理解线程呢?下面讲解一些我个人对于程序,对于进程,对于线程的理解:
从另一个角度看程序和进程
假如对于QQ这个应用程序(注意这里我们称其为程序),张三可以登录他自己的QQ,李四也可以在同一台电脑上,同一个系统下登录他的QQ;再比如,同一个 浏览器你也可以打开两次;注意,我们在QQ未运行的时候,并没有说:这是张三的QQ,或者这是李四的QQ,我们给它取了个名字:QQ应用程序;浏览器也可以同时打开两次;但我们并没有因此而区分他们,我们仍然管"他们''叫做浏览器。可这和我们理解程序和进程有什么关系呢?
学习c++或者Java的时候,我们学习类这个概念, 并学习了如何创建类;也学习了对象这个概念,并认识到对象是类的实例化 ,说到这里的时候,是否有些明白?不明白我再讲的具体一些:
学习创建类的时候,我们知道,创建一个类并不为这个类分配内存;而根据这个类来创建一个对象的时候,则是分配了内存;而且一个类是可以创建多个对象的。有没有发现这和程序和进程的概念有些相似.
对于桌面上的未打开的 QQ应用程序,就如同我们创建的一个类,我们暂且把它 称为 QQ类 吧;写QQ应用软件的过程,就如同创建一个类的过程; 桌面上未打开的QQ应用程序 是装在磁盘里面的吧,并没有为其分配内存空间吧;而当我们打开它,并登录张三的账号的时候,实际上就如同一个类创建了一个对象一个;我们不妨把这个对象称之为:张三QQ 吧,那么你也知道,这个张三QQ 对象是 占了内存空间的;而这个打开的 张三QQ 对象,我们给它的称呼就是:进程;当然针对同一个QQ应用程序,你同样可以创建一个:李四QQ 进程;这就如同一个类实例化多个对象一样。
也就是从本质上讲:进程是程序在内存中的实例化!!!虽然这个实例化的过程是相当的复杂,涉及到操作系统多方面的知识,但是其本质并未发生变化,至于这个实例化的过程,后续再作说明。
从另一个角度看进程和线程
上面的例子中,将程序比作声明的类,将进程比作类的实例化:对象。那么线程又该处于一个什么地位呢?回顾一下我们类的组成:成员变量和成员方法。我们再来问这样一个问题:当我们要用类来实现一个功能的时候,我们是通过谁来实现的?
毫无疑问,我们必须先实例化一个对象,因为类只是一个抽象概念,你连内存空间都没有,你说尼玛呢?实例化了一个对象后,我们具备实现一个功能的条件,但是实现这个功能是通过对象实现的吗?显然不是,你创建了类,或许调用了构造函数,或许为该对象进行了相关配置;但是接触过面向对象的人都知道,是类方法,也就是最终我们实现某一个功能,落脚到了类方法,比如,我们要改变某个类成员,或者完成与其他对象的交互,是通过类方法来完成这件事情的,因此,类方法就就类比到了:线程。(其实你仔细想想:当一个函数被调用的时候,程序计数器发生的改变(保存并跳转),堆栈的改变(重新为新的函数建立栈).....你有没有思考过,这个过程和线程调度时底层发生的事件是何其的相似啊!!!)
也就是对象保证了我们有内存空间(就像进程提供了资源一样);但最终的实现是通过类方法来实现功能的,而这,就是线程。
转载请注明出处,谢谢,如有不懂或者见解,请留言!