Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49604
  • 博文数量: 24
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-23 17:12
文章分类

全部博文(24)

文章存档

2010年(7)

2009年(11)

2008年(6)

我的朋友

分类: LINUX

2010-05-24 23:02:11

学习笔记——进程和线程的区别

一, 进程的概念

进程是在多道程序系统出现以后,为了描述系统内部各作业的活动规律而引进的概念。

由于多道程序系统所带来的复杂环境,程序本身有了并行性【为了充分利用资源,在主存中同时存放多道作业运行,所以各作业之间是并行的】、制约性【各程序由于同时存在于主存中,因此他们之间会存在着相互依赖、相互制约的关系。一个是通过中间媒介——资源发生的间接制约关系,一个是各并行程序间需要相互协同而引起的直接制约关系】和动态性【不论是系统程序还是用户程序,由于他们并行地在系统中运行且有着各种制约关系,因而他们在系统中的状态是不断改变化的动态性】的特征,造成了程序这个概念【程序是完成某个功能的指令集合,是种静态的概念】无法反映系统中复杂的变化的情况,因而引入了进程的概念。进程是一个具有一定独立功能的程序关于某个数据集合的一次运动活动。简单的说,进程是表示一个程序执行的有关动态信息。【进程是种动态的概念】

注意,进程一般有三个状态,运行状态、就绪状态和等待状态【或称阻塞状态】;进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可有进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。

 

二, 线程的概念

传统的进程概念在操作系统中担任两种截然不同的角色:

1.进程是拥有自己资源的单元体。一个进程被分给一个虚拟的地址空间以容纳进程映像,并控制其他为进程运行所需要的I/O资源。

2.进程是被调度分派在处理器上运行的单元体。当多个进程之间进行调度时,就涉及到进程开关的问题。而进程开关要占去不少CPU机时。如与进程有关的表格均要改【包括PCB表,各种队列:阻塞队列,运行队列,就绪队列等,存储管理有关的地址映射及表格,I/O文件的表格等。】,且更为可观的开销是进程的地址空间要进行转换为新被调度的进程的地址空间,另外还有两次模式开关【用户模式——>内核模式——>用户模式】的开销,这些在一定程度上降低了并发进程多带来的利益。

因此人们引进了线程概念,并分派线程完成有关应用程序的执行部分,而进程则承担有关拥有资源的主权部分。故线程是进程内一个相对独立的可调度的执行单元。

 

三,线程的性质

1.线程是进程内的一个相对独立的可执行的单元。若把进程称为任务的话,那么线程则是应用中的一个子任务的执行。

2.由于线程是被调度的基本单元,而进程不是调度单元。所以,每个进程在创建时,至少需要同时为该进程创建一个线程。即进程中至少要有一个或一个以上的线程,否则该进程无法被调度执行。

3.进程是被分给并拥有资源的基本单元。同一进程内的多个线程共享该进程的资源。但线程并不拥有资源,只是使用他们。

4.线程是操作系统中基本调度单元,因此线程中应包含有调度所需要的必要信息,且在生命周期中有状态的变化。

5.由于共享资源【包括数据和文件】,所以线程间需要通信和同步机制,且需要时线程可以创建其他线程,但线程间不存在父子关系。

多线程使用的情形:前台和后台工作情况;异步处理工作情况;需要加快执行速度情况;组织复杂工作的情况;同时有多个用户服务请求的情况等。

 

四,线程机制的优点:

多线程运行在同一个进程的相同的地址空间内,和采用多进程相比有以下优点:

1.创建和撤销线程的开销较之进程要少。创建线程时只需要建立线程控制表相应的表目,或有关队列,而创建进程时,要创建PCB表和初始化,进入有关进程队列,建立它的地址空间和所需资源等。

2.CPU在线程之间开关时的开销远比进程要少得多。因开关线程都在同一地址空间内,只需要修改线程控制表或队列,不涉及地址空间和其他工作。

3.线程机制也增加了通讯的有效性。进程间的通讯往往要求内核的参与,以提供通讯机制和保护机制,而线程间的通讯是在同一进程的地址空间内,共享主存和文件,无需内核参与。

 

五,进程线程的管理

    为了对系统中的进程和线程进行管理,不但要有进程控制块PCB,而且要为每个线程均设置一个线程控制块TCB。这些PCBTCB不但描述和记录了每个进程和线程属性和调度所需的数据,而且是说明这些进程和线程存在的标志。

进程控制块:PCB是操作系统中最重要的数据结构。PCB的作用不但是记录进程的属性信息,以便操作系统对进程进行控制和管理,而且PCB标志着进程的存在,操作系统根据系统中是否有该进程的进程控制块PCB而知道该进程存在与否。系统建立进程的同时就建立该进程的PCB,在撤销一个进程时,也就撤销其PCB,故进程的PCB对进程来说是它存在的具体的物理标志和体现。一般PCB包括以下三类信息:进程标识信息;处理器状态信息;进程控制信息。

在基于多线程基础上的系统中进程控制块和线程控制块都是采用面向对象技术来开发的,把进程和线程均视作是对象。因而PCBTCB均用进程对象和线程对象来描述。在进程管理和线程管理中,往往都用链指针将线程控制块或线程对象【进程控制块或进程对象】 ,按他们的所处状态链结成相应的线程队列【进程队列】来加以管理。如就绪队列,阻塞队列,运行队列等。【感觉是采用链表结构来构造数据时一样,有点迷惑,有待继续学习!】

 

 

线程(threads, 台湾称 执行绪),也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。

线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。

在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。

 

 

进程是拥有系统资源的基本单位,通常为程序的一个实例,它是没有活力的,只是占有系统分配的虚拟地址空间,空间有程序代码、数据,和一些资源(文件,动态内存分配和线程)。进程终止时,在它生命周期内创建的各种资源将被清除。进程只是一个静态的概念,要使它工作,必须占有至少一个线程。进程间是独立的,它无法突破进程边界存取其他进程内的存储空间。
线程是操作系统调度的基本单位,运行于进程之中。线程拥有代码,栈,以及一些共享数据。另外线程也可以访问全局静态数据。 线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
引自
《Windows95下多线程编程技术及其实现》所说

一个进程通常定义为程序的一个实例。在32位Windows中,进程占据4GB的虚拟地址空间。与它们在MS-DOS和16位Windows操作系统中不 同,32位Windows进程是没有活力的。这就是说,一个32位Windows进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程 序EXE文件的代码和数据。

EXE需要的DLL也将它们的代码的数据装入到进程的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。

如上所述,进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工作,进程必须至少占有一线程,所以线程是描述进程内的执行,正是线程负责执行包 含在进程的地址空间中的代码。实际上,单个进程可能包含几个线程,它们可以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU 寄存器和椎。每个进程至少有一个线址程在执行其地址空间中的代码,如果没有线程执行进程地空间中的代码,如果没有线程执行进程地址空间中的代码,进程也就 没有继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮转方式向线程提供 时间片,这就给人一种假象,好象这些线程都在同时运行。创建一个32位Windows进程时,它的第一个线程称为主线程,由系统自动生成,然后可由这个主 线程生成额外的线程,这些线程又可生成更多的线程。   


什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:

进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。
一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。(图一)
同一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。

 

 

 谈到进程时,还要涉及到线程的概念。进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操 作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。
  那进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成Notepad.exe的代码及其所需调用动态链接库的进程。每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。
  我这里以沙箱为例进行阐述。一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。
  实际上线程运行而进程不运行。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。下面让我们分析一下任务管理器里的进程选项卡。
  这里的进程是指一系列进程,这些进程是由它们所运行的可执行程序实例来识别的,这就是进程选项卡中的第一列给出了映射名称的原因。请注意,这里并没有进程名称列。进程并不拥有独立于其所归属实例的映射名称。换言之,如果你运行5个记事本拷贝,你将会看到5个称为Notepad.exe的进程。它们是如何彼此区别的呢?其中一种方式是通过它们的进程ID,因为每个进程都拥有其独一无二的编码。该进程ID由Windows NT或Windows 2000生成,并可以循环使用。因此,进程ID将不会越编越大,它们能够得到循环利用。
  
  第三列是被进程中的线程所占用的CPU时间百分比。它不是CPU的编号,而是被进程占用的CPU时间百分比。此时我的系统基本上是空闲的。尽管系统看上去每一秒左右都只使用一小部分CPU时间,但该系统空闲进程仍旧耗用了大约99%的CPU时间。
  
  第四列,CPU时间,是CPU被进程中的线程累计占用的小时、分钟及秒数。请注意,我对进程中的线程使用占用一词。这并不一定意味着那就是进程已耗用的CPU时间总和,因为,如我们一会儿将看到的,NT计时的方式是,当特定的时钟间隔激发时,无论谁恰巧处于当前的线程中,它都将计算到CPU周期之内。通常情况下,在大多数NT系统中,时钟以10毫秒的间隔运行。每10毫秒NT的心脏就跳动一下。有一些驱动程序代码片段运行并显示谁是当前的线程。让我们将CPU时间的最后10毫秒记在它的帐上。因此,如果一个线程开始运行,并在持续运行8毫秒后完成,接着,第二个线程开始运行并持续了2毫秒,这时,时钟激发,请猜一猜这整整10毫秒的时钟周期到底记在了哪个线程的帐上?答案是第二个线程。因此,NT中存在一些固有的不准确性,而NT恰是以这种方式进行计时,实际情况也如是,大多数32位操作系统中都存在一个基于间隔的计时机制。请记住这一点,因为,有时当你观察线程所耗用的CPU总和时,会出现尽管该线程或许看上去已运行过数十万次,但其CPU时间占用量却可能是零或非常短暂的现象,那么,上述解释便是原因所在。上述也就是我们在任务管理器的进程选项卡中所能看到的基本信息列。

阅读(706) | 评论(0) | 转发(0) |
0

上一篇:volatile的作用

下一篇:没有了

给主人留下些什么吧!~~