进程与线程的区别联系

来源:互联网 发布:彩精灵软件好吗 编辑:程序博客网 时间:2024/05/09 00:58

线程和进程的区别

 

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

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。线程的引入:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了"线程(thread)"的概念。

进程的作用和定义:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所需要的程序的一次执行过程和为其分配资源的一个基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。

线程和进程的区别:
1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
 

前一句说的不太准确,线程也有自己的资源,比如栈,私有数据等等。说他使用而不拥有资源指的是使用的是进程的打开文件句柄,进程的全局数据,进程的地址空间等等,这些都属于进程,而不属于线程,进程内个线程共享。

进程切换比线程切换开销大是因为进程切换时要切页表,而且往往伴随着页调度,因为进程的数据段代码段要换出去,以便把将要执行的进程的内容换进来。本来进程的内容就是线程的超集。而且线程只需要保存线程的上下文(相关寄存器状态和栈的信息)就好了,动作很小。


http://289972458.iteye.com/blog/1325189

进程和线程的通信和同步

进程通信

(1)    共享内存:通常由一个进程创建,其余进程对这块内存区进行读写。共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。

(2)    管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。

(3)    消息队列:消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。消息队列传递的消息是不连续的、有格式的信息,给对它们的处理带来了很大的灵活性。可以用不同的方式解释消息的类型域,如可以将消息的类型同消息的优先级联系起来,类型域也可以用来指定接收者。小消息的传送效率很高,但大消息的传送性能则较差。另外,消息队列不支持广播,而且内核不知道消息的接收者。

进程同步机制

(1)    原子操作:所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它是最小的执行单位,不可能有比它更小的执行单位。原子操作需要硬件的支持,因此是架构相关的。

(2)    信号量:信号量sem是一整数,当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

        P(S):(1)将信号量S的值减1,即S=S-1 (2)如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

        V(S):(1)将信号量S的值加1,即S=S+1;(2)如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

(3)    自旋锁:自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已经被持有的自旋锁,那么这个任务就会一直循环——旋转——等待锁重新可用。自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。

(4)    管程:将共享变量以及对共享变量能够进行的所有操作集中在一个模块中。每次只允许一个进程访问管程内资源。管程内部有进程等待队列,以及等待和唤醒操作,队列称之为条件队列。当进入管程的进程因资源被占用等原因不能继续运行时,进程进入条件队列,并释放管程互斥权。当管程的另一进程释放与某条件变量相关的资源时,唤醒在该条件上等待的一个进程。

(5)    会合:一个进程可以有许多入口,一个入口对应一段程序,一个进程可以调用另一个进程的入口。当一个进程调用另一个进程的入口,而且被调用的进程已准备好接受这个调用时,会合就发生了。当调用者发出调用请求时,被调用的进程未准备接受这个调用时,则调用者等待;反之,当被调用者准备接受调用,而当前尚无调用者时,则被调用者等待。即先到达会合处等待后到达者。当多个进程调用同一个进程的同一个入口时,被调用者按先来先服务(FCFS)的次序接受调用。入口处可以携带调用参数,还可以有返回参数,以实现信息的交换。被调用者可以选择会合的入口。

线程同步机制

(1)    事件(Event):一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。

(2)    临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

(3)    互斥器(Mutex):采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

(4)    信号量(Semaphore):它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。


进程和线程的状态转换

进程三态状态装换图



线程状态转换图

线程可以有一下4个状态:
        · New (新生)
        ·Runnable(可运行)
        ·Blocked(被阻塞)
        · Dead(死亡)


多线程和多进程的对比


原创粉丝点击