进程与线程

来源:互联网 发布:cab软件下载专区 编辑:程序博客网 时间:2024/06/01 08:14
1      进程与线程的区别
       进程:是程序的运行实例,是指程序的一次执行过程,在Windows95中,就是一个EXE文件的执行过程。由两部分组成:操作系统
用来管理进程的内核对线和地址空间.地址空间包括所有可执行模块或DLL的代码和数据以及动态内存分配的空间.总之进程包含内存和资源(如内核对线,File对象,GDI对线等). 
       线程:线程是指由进程进一步派生出来的一组代码(指令组)的执行过程. 每个进程都有一个主线程,还可以有其它线程. 进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。线程也包括两部分: •一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。• 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。 
      可以把线程看成是操作系统分配CPU时间的基本实体。系统不停地在各个线程之间切换,它对线程的中断是汇编语言级的。系统为每一个线程分配一个CPU时间 片,某个线程只有在分配的时间片内才有对CPU的控制权。实际上,在PC机中,同一时间只有一个线程在运行。由于系统为每个线程划分的时间片很小(20毫 秒左右),所以看上去好象是多个线程在同时运行。进程中的所有线程共享进程的虚拟地址空间,这意味着所有线程都可以访问进程的全局变量和资源。这一方面为编程带来了方便,但另一方面也容易造成冲突。
 
采用线程的好处:
一个进程可以产生多个线程,这些线程都共享该进程的地址空间,它们可以并行、异步地执行。采用线程最主要的好处是:使同一个程序能有几个并行执行的路径,提高了执行速度;线程需要的系统开销比进程要小。应该说明的是,在 Windows95中,“多任务”是基于线程而不是基于进程
为什么使用多个线程而不使用多个进程?
最重要的答案便是:线程价廉.线程启动比较快,退出比较快,对系统资源的冲击也比较小.而且线程彼此分享了大部分核心对象(如file handles)的拥有权.
 
多任务执行
多任务执行是指在同一台计算机系统的同一时刻运行多个程序。由于允许活动任务和后台任务同时运行,所以可以做到有一个任务在后台执行时,前台又能干另一件事。比如说,我们可以一边用图文处理程序编辑一个文件,一边让打印程序完成打印工作。这就极大地提高了工作效率,因为大多数用户都确实需要同时对几个不同的应用程序进行工作。
 
线程分类
内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows   NT和2000/XP支持内核线程 。
用户线程:由应用进程利用线程库创建和管理,不以来于操作系统核心。不需要用户态/核心态切换,速度快。操作系统内核不知道多线程的存在,因此一个线程阻 塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。   
 轻量级进程:一个进程可以有多个LWP,每个LWP由一个单独的内核线程来支持。融合了前面两者的优点,是一个折中方案。 

2   线程间通信 VS 进程间通信
关于线程间通信,涉及到同一进程内的所有线程通信不同进程的线程间通信; 因为同
一进程中的所有线程均可以访问所有的全局变量,因而全局变量成为同一进程间多线程通信的最简单方式。但如何访问全局变量是多线程程序必须考虑的一个问题..而对于不同进程间线程通信问题实质上就是进程间通信问题.
      因此本文将线程间通信特指同一进程中的所有线程通信问题,实质就是解决线程间的竞争问题. 而进程间通信指在操作系统书中介绍的传统意义上的进程通信问题.
线程间通信:
多线程程序的核心问题:竞争 对(共享)资源的竞争关系.解决这种竞争关系的方法就是线程间通信问题,包括互斥和同步.
线程程同步:是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥:是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的 排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。(原子操作,互锁访问)
线程互斥是一种特殊的线程同步。
实际上,互斥和同步对应着线程间通信发生的两种情况:
(1)当有多个线程访问共享资源而不使资源被破坏时;
(2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。
在WIN32中,同步机制主要有以下几种:
(1)事件(Event);(内)核心对象,多用于overlapped. 适用于不同进程的线程
(2)信号量(semaphore);核心对象,无拥有者. 适用于不同进程的线程
(3)互斥量(mutex);:内核对象(内)核心对象,排他性对象,甚至适用于不同进程的线程.
(4)临界区(Critical section)。:局部对象,不是(内)核心对象,仅适用于同一个进程的不同线程. 
进程间通信:
几个系统中近程通信的方法:
unix:管道,消息队列,信号量(灯),共享存储,信号(signal),socket  .
linux:
同上(不知道*nix系列是否都是如此)  
vxworks:管道,消息队列,信号量(灯),信号
,socket?  
windows:事件(Event); 信号量(semaphore) 互斥量(mutex)
原创粉丝点击