什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:
进程间是独立的一个线程可以包含多个进程,这表现在内存空间,上下文环境;线程运行在进程空间内。
一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
同一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
进程是执行程序的实例。例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成&的代码及其所需调用动态链接库的进程。每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。
以沙箱为例进行阐述。一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。
实际上线程运行而进程不运行。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在Windows操作系统中可以同时执行多个程序,比如打开一个资源管理器和多个IE浏览器,同时使用播放器播放音乐,后台可能同时还有杀毒软件防火墙在运行,这里的每一个运行的程序都是一个进程。严格地说,这种说法是不准确的,程序一般是指保存在外部存储器(一般为硬盘)中的代码文件,当程序被执行时,系统会先在内存中为其分配一块空间,再把其代码复制到该空间中执行,这个在由系统分配的内存空间中执行的程序才是进程。一个程序可能同时存在多个相应的进程,如同时打开多个IE浏览器,每一个浏览器窗口都是一个进程,都拥有自己独立的内存空间,而它们都来自于同一个程序。
线程可以看作进程概念下的进一步细分,它的很多特征都非常类似于进程。例如,整个操作系统由多个进程组成(包括操作系统进程),而一个进程由多个线程组成(一般处理单任务的进程只含有一个线程);在整个操作系统占用CPU期间,操作系统分配CPU时间给每一个进程,而在一个进程占用CPU期间,进程分配CPU时间给每一个线程(如何分配即是本章的主要内容之一);进程占用整个内存空间的一部分,而线程占用其所属进程占用的内存空间的一部分;进程由代码、数据和运行环境组成,而线程也由这三者组成。
进程与线程的不同之处在于,每个进程都是独立的,它仅在分配给它的内存空间中运行,
有自己专属的代码和数据,不能访问其它进程的数据(就算另一个进程来自于同一个程序),进程间的通信必须通过操作系统传达,进程有权不接受其它进程(操作系统关键进程除外)发出的消息;而线程允许代码和数据的共享,一个线程可以使用其它线程的代码,也可以访问其它线程的数据(这可能带来数据冲突的问题),使得线程间的通信比进程间的通信更为方便快捷(但同时也会带来某些问题)。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
进程和线程的区别
进程(在很多操作系统中也称为任务)是操作系统中的一个十分重要的概念。什么是进程呢?所谓进程是指程序的一次执行过程,在Windows95中,就是一个EXE文件的执行过程。但是应该注意,进程和程序是两个不同的概念,不能等同。程序是一组指令的有序集合,是静态的;进程则是指一组指令序列在处理机上的一次执行过程,是动态的。严格地说,进程是程序在一个数据集合上的运行过程,它具有动态、并行、独立、异步等特性;一个进程由“创建”而产生、由调度而进入执行、在资源不能满足时被“挂起”、由“撤销”而消亡,因此,进程是有生命的。当然,一个进程将唯一地对应于一个EXE文件。程序和进程
的关系还可以打个比方,如果把程序看作一支曲谱,进程可以理解为对这支曲谱的演奏过程。当然,这个比方并不准确,但可以帮助理解程序和进程之间的关系。在Windows95中还采用了线程的概念,所谓线程是指由进程进一步派生出来的一组代码(指令组)的执行过程。一个进程可以产生多个线程,这些线程都共享该进程的地址空间,它们可以并行、异步地执行。采用线程最主要的好处是:使同一个程序能有几个并行执行的路径,提高了执行速度;线程需要的系统开销比进程要小。应该说明的是,在Windows95中,“多任务”是基于线程而不是基于进程。多任务执行是指在同一台计算机系统的同一时刻运行多个程序。由于允许活动任务和后台任务同时运行,所以可以做到有一个任务在后台执行时,前台又能干另一件事。比如说,我们可以一边用图文处理程序编辑一个文件,一边让打印程序完成打印工作。这就极大地提高了工作效率,因为大多数用户都确实需要同时对几个不同的应用程序进行工作。
在Windows 3.X中,多个应用程序同时运行是采取一种所谓的“协作式”方式,称为“协作式多任务”。“协作”这个用语意味着多个应用程序之间必须相互协调,依次实现对操作系统的控制。它们并不是真正的多任务执行,因为其中还有多任务共享系统资源的问题。为了让操作系统把控制权从一个程序转换到另一个程序,当前活动的程序就必须周期地检查一个
消息队列。如果某个程序不能经常检查消息队列,操作系统就不能实现控制权的转移。
在Windows 95中采用了一种所谓带优先权的多任务方式来运行基于Win32(Windows的32位)应用程序,称为“抢先式多任务”。在这种方式下,操作系统可以在需要时中断当前的任务,再按照任务队列中各个任务的优先级别来进行任务的调度。为兼容起见,基于Win16(Windows的16位)应用程序仍采用协作式方式完成多任务执
行。在Windows 3.X的协作式多任务环境中,必须在Windows 3.X“控制面板”中386增强模式实用程序的一个对话框中才能设置任务的优先级。而Windows 95则在缺省情况下就是完全带优先级的,所以不需要手工对优先级加以设置,这个任务由Windows 95在后台透明地加以完成。
Windows 95抢先式多任务执行实际上就是抢先式多线程执行。为了抢先式多线程执行实现,每个线程有一个优先级值,范围是从0到31。优先级0最低,保留给系统使用。优先级1到31分成四类:空闲(1-6),正常(5-11),高(11-15)和实时(16-31)。正常分类又进一步分成二级:后台(5-9)和前台(6-11)。注意这些范围是有重叠的。这样做可使调度更灵活,例如,允许某些后台任务比某些前台任务更重要,尽管在通常情况
下,前台任务的优先级应该更高。使用实时优先级时要非常当心。如果你把一个任务的优先级设得太高,也可能无法实现多任务执行功能。这是因为一个任务的优先级太高了,它就完全不允许系统中有其他任务运行。
VMM(虚拟机管理程序)负责在分时抢先的环境里调度各个进程和线程,具体包括以下服务:生成线程、管理线程、撤消线程和线程调度。
VMM中有两个调度程序:主调度程序和时间片调度程序。主调度程序负责确定最高优先级的线程。只有最高优先级的线程才会运行,其他优先级较低的都被封锁;时间片调度程序负责为所有具有最高优先级的可运行任务分配时间片。系统运行过程中,线程的优先级可由系统或设备驱动程序(或两者)改变。例如,一旦中断产生,则处理这个中断的线程优先级临时提高,以便它立即得到时间来处理该中断。完成后,优先级可以再降低。
在抢先式多任务中,基于Win32的应用程序不必让位给其它程序就能以友好的方式实现多任务。操作系统会根据系统的需要把控制权交给某个运行中的任务,或从某个运行中的任务移走控制权。这才是真正的多任务操作系统。
MFC的WinMain
使用MFC编程的程序员刚开始都会提出这样一个问 题:我的程序是从哪儿开始执行的?回答是:从WinMain()开始执行的。提出这样的问题是由于在他们所编写的MFC应用中看不到WinMain()函 数。这个函数是隐藏在MFC框架中,MFC的设计者将它作得很通用(这主要得益于Window的消息驱动的编程机制,使得作一个通用的WinMain() 很容易),因此在一般情况下,无需更改WinMain()的代码,MFC的设计者也不提倡程序员修改WinMain()的代码。在MFC中,实际实现 WinMain()的代码是AfxWinMain()函数(根据其前缀Afx就知道这是一个全局的MFC函数)。
一个Win32应用 程序(或进程)是由一个或多个并发的线程组成的,其中第一个启动的线程称为主线程,在Window下,一般将线程分成两大类,界面线程和工作线程,工作线 程就是一般的线程,它没有窗口,没有消息队列等,界面线程拥有一个或多个窗口,拥有一个消息队列和其他专属于界面线程的元素。在讨论AfxWinMain ()之前,首先要简略提一下MFC中的两个重要的类,CWinThread和CWinApp,CWinThread是用来封装界面线程的类, CWinApp是从CWinThread派生而来的。在CWinThread中,有两个很重要的虚拟函数InitInstance()和 ExitInistance(),MFC的程序员应该对这两个函数应该很熟悉。在CWinApp中,增加了另外一个虚拟函数 InitApplication(),讨论AfxWinMain()的主要目的是
看这些函数是如何被调用的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论