`
yidongkaifa
  • 浏览: 4060992 次
文章分类
社区版块
存档分类
最新评论

进程和线程的区别

 
阅读更多

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

不同点:
(a) 线程是进程的一部分, 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

(b) 启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

(c)系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
(d) 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
(e) 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
进程与线程
进程和线程是两个相对的概念,通常来说,一个进程可以定义程序的一个实例(Instan
ce)。在Win32中,进程并不执行什么,它只是占据应用程序所使用的地址空间。为了让
进程完成一定的工作,进程必须至少占有一个线程,正是这个线程负责包含进程地址空
间中的代码。实际上,一个进程可以包含几个线程,它们可以同时执行进程地址空间中
的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。每个进程中至少有
一个线程在执行其地址空间中的代码。如果没有线程执行进程地址空间中的代码,进程
也就没有继续存在的理由,系统将自动清除进程及其地址空间。
多线程的实现原理
创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。
然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。
在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非
如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些CPU时间。单CPU操
作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控制
,系统再将CPU时间片分配给下一个线程。由于每个时间片足够的短,这样就给人一种假
象,好像这些线程在同时运行。创建额外线程的唯一目的就是尽可能地利用CPU时间。
多线程的问题
使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决
的问题变得容易起来。但是,不应该人为地将编写的程序分成一些碎片,让这些碎片按
各自的线程执行,这不是开发应用程序的正确方法。
线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。例如要开发一
个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因
为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中
的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能
放在单独的线程中,不过如果一定要用多线程的话,也可以考虑用下面的方法解决:第
一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文
档不会作任何修改;另一个方法可能更有效一些,即可以把该文档拷贝到一个临时文件
中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临
时文件打印完成时,再删去这个临时文件。
通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必
要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往
用于在前台操作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用户
接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。
线程的分类
在MFC中,线程被分为两类,即工作线程和用户界面线程。如果一个线程只完成后台计算
,不需要和用户交互,那么可以使用工作线程;如果需要创建一个处理用户界面的线程
,则应使用用户界面线程。这两者的主要区别在于,MFC框架会给用户界面线程增加一个
消息循环,这样用户界面线程就可以处理自己消息队列中的消息。这样看来,如果需要
在后台作一些简单的计算(如对电子表格的重算),则首先应考虑使用工作线程,而当
后台线程需要处理比较复杂的任务,确切地说,当后台线程的执行过程会随着实际情况
的不同而改变时,就应该使用用户界面线程,以便能对不同的消息作出响应。
线程的优先级
当系统需要同时执行多个进程或多个线程时,有时会需要指定线程的优先级。线程的优
先级一般是指这个线程的基优先级,即线程相对于本进程的相对优先级和包含此线程的
进程的优先级的结合。操作系统以优先级为基础安排所有的活动线程,系统的每一个线
程都被分配了一个优先级,优先级的范围从0到31。运行时,系统简单地给第一个优先级
为31的线程分配CPU时间,在该线程的时间片结束后,系统给下一个优先级为31的线程分
配CPU时间。当没有优先级为31的线程时,系统将开始给优先级为30的线程分配CPU时间
,以此类推。除了程序员在程序中改变线程的优先级外,有时程序在执行过程中系统也
会自动地动态改变线程的优先级,这是为了保证系统对终端用户的高度响应性。比如用
户按了键盘上的某个键时,系统就会临时将处理WM_KEYDOWN消息的线程的优先级提高2到
3。CPU按一个完整的时间片执行线程,当时间片执行完毕后,系统将该线程的优先级减
1。
线程的同步
在使用多线程编程时,还有一个非常重要的问题就是线程同步。所谓线程同步是指线程
之间在相互通信时避免破坏各自数据的能力。同步问题是由前面说到的Win32系统的CPU
时间片分配方式引起的。虽然在某一时刻,只有一个线程占用CPU(单CPU时)时间,但
是没有办法知道在什么时候,在什么地方线程被打断,这样如何保证线程之间不破坏彼
此的数据就显得格外重要。在MFC中,可以使用4个同步对象来保证多线程同时运行。它
们分别是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CS
emaphore)和事件对象(CEvent)。在这些对象中,临界区对象使用起来最简单,它的
缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方
法,即在编程过程中对一定数据的写操作都在一个线程中完成。这样,由于同一线程中
的代码总是按顺序执行的,就不可能出现同时改写数据的情况

分享到:
评论

相关推荐

    线程和进程的区别,详细解释

    线程进程的区别于联系,详细介绍.希望对大家有用。如果有不足的地方,麻烦留言。

    JAVA线程与进程的区别

    JAVA线程与进程的区别JAVA线程与进程的区别

    进程和线程有什么区别?

    用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?...

    进程和线程之间的关系

    详细讲解进程和线程之间的区别,方便初学者能更深透的理解

    进程和线程的主要区别

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

    进程与线程的区别和联系

    可以了解进程与线程的区别和联系,对操作系统有更深的了解。

    进程与线程的生动形象理解

    该文档为进程与线程的生动详细地理解,个人认为讲的非常好。形象生动。

    进程和线程详解

    进程和线程详解,比较详细的介绍了进程和线程详解的相关知识,对初学者有很好的借鉴

    线程和进程的区别.txt

    线程和进程的区别.txt线程和进程的区别.txt线程和进程的区别.txt线程和进程的区别.txt

    进程与线程的区别

    进程与线程的区别 - 博客园.mht 进程与线程的区别 - 博客园.mht 进程与线程的区别 - 博客园.mht

    linux进程和线程编程

    linux 进程和线程编程 pipe --原始管道 命名管道 消息队列 信号量 内存共享 线程编程

    在Windows下创建进程和线程的API

    在Windows下创建进程和线程的API 对线程和进程的使用进行了详细描述

    MFC程序设计详细实例 第25章 进程和线程

    MFC程序设计详细实例 第25章 进程和线程MFC程序设计详细实例 第25章 进程和线程MFC程序设计详细实例 第25章 进程和线程MFC程序设计详细实例 第25章 进程和线程MFC程序设计详细实例 第25章 进程和线程MFC程序设计详细...

    进程和线程的创建 _实验报告.doc

    这个程序创建一个子进程,执行an_ch2_1b。这个程序不断地输出如下行: Those output come from child,[系统时间] 观察程序运行的结果,并对你看到的现象进行解释。 2.在linux环境下编写一个控制台应用程序,程序中有...

    最清楚的进程线程,进程和线程对比

    看过的最清楚的进程线程,进程和线程对比 根本不用大头书就可以理解透彻。

    进程线程及死锁

    通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。

    进程和线程的区别与联系

    程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态... 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命周期。

    进程与线程的管理 .PPT 进程、线程和优先级

    进程、线程和优先级 工作线程和用户界面线程 线程同步 线程通讯

    内核线程和进程的区别

    Linux把所有线程都当做进程来实现。内核并没有准备特别的调度算法或者定义特别的数据结构来表示线程。下面一起来看看

    c语言多进程多线程编程

    c语言多进程多线程编程

Global site tag (gtag.js) - Google Analytics