进程和线程
线程和进程定义
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
线程与进程的关系如下图所示:
线程和进程区别
1、一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
2、线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
3、线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程 的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。
4、父和子进程使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。
5、进程内的任何线程都被看做是同位体,且处于相同的级别。不管是哪个线程创建了哪一个线程,进程内的任何线程都可以销毁、挂起、恢复和更改其它线程的优先权。线程也要对进程施加控制,进程中任何线程都可以通过销毁主线程来销毁进程,销毁主线程将导致该进程的销毁,对主线程的修改可能影响所有的线程。
6、子进程不对任何其他子进程施加控制,进程的线程可以对同一进程的其它线程施加控制。子进程不能对父进程施加控制,进程中所有线程都可以对主线程施加控制。
线程和进程相同点
进程和线程都有ID/寄存器组、状态和优先权、信息块,创建后都可更改自己的属性,都可与父进程共享资源、都不鞥直接访问其他无关进程或线程的资源。
进程的特征
动态性:进程是程序的执行,同时进程有生命周期。
并发性:多个进程可同存于内存中,能在一段时间内同时执行。
独立性:资源分配和调度的基本单位。
制约性:并发进程间存在制约关系,造成程序执行速度不可预测性,必须对进程的并发执行次序、相对执行速度加以协调。
结构特征:进程由程序块 、数据块、进程控制块三部分组成。
进程的三种基本状态
1.运行态(running)
当进程得到处理机,其执行程序正在处理机上运行时的状态称为运行状态。
在单CPU系统中,任何时刻最多只有一个进程处于运行状态。在多CPU系统中,处于运行状态的进程数最多为处理机的数目。
2.就绪状态(ready)
当一个进程已经准备就绪,一旦得到CPU,就可立即运行,这时进程所处的状态称为就绪状态。系统中有一个就绪进程队列,处于就绪状态进程按某种调度策略存在于该队列中。
3.等待态(阻塞态)(Wait / Blocked )
若一个进程正等待着某一事件发生(如等待输入输出操作的完成)而暂时停止执行的状态称为等待状态。 处于等待状态的进程不具备运行的条件,即使给它CPU,也无法执行。系统中有几个等待进程队列(按等待的事件组成相应的等待队列)。
三种状态相互转换:
运行到等待:等待某事件的发生(如等待I/O完成)
等待到就绪:事件已经发生(如I/O完成)
运行到就绪:时间片到(例如,两节课时间到,下课)或出现更高优先级进程,当前进程被迫让出处理器。
就绪到运行:当处理机空闭时,由调度(分派)程序从就绪进程队列中选择一个进程占用CPU。
在线程中也有与进程相同的三种状态,这三种状态相互转换完全类似。
下图是三种状态的转换图
进程的两项功能
1. 进程是资源分配和保护基本单位。
2.进程同时又是一个可独立调度和分派的基本单位。
进程作为一个资源拥有者,在创建、撤消、切换中,系统必须为之付出较大时空开销。所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。为解决此问题,人们想到将进程的上述两个功能分开,即对作为调度和分派的基本单位,不同时作为独立分配资源的单位;对拥有资源的单位,不对之进行频繁切换,线程因而产生。
多线程环境中进程的定义
进程是操作系统中除处理器外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)。
1.多线程环境中的线程概念
线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位。
每个进程内可包含多个可并发执行的线程。
线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器、一组寄存器、栈。
同属一个进程的线程共享进程所拥有的主存空间和资源。
2.引入线程的好处
创建一个新线程花费时间少(结束亦如此)
两个线程的切换花费时间少
因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核
线程与进程的比较
线程具有进程的许多特征,故又称轻型进程,传统进程称重型进程。
在引入线程的OS中,每一进程都拥有多个线程,至少一个。
1.调度
在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位。
在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。
2.并发性
在引入线程的系统中,进程之间可并发,同一进程内的各线程之间也能并发执行。因而系统具有更好的并发性。
3.拥有资源
无论是传统OS,还是引入线程的OS,进程都是拥有资源的独立单位,线程一般不拥有系统资源,但它可以访问隶属进程的资源。即一个进程的所有资源可供进程内的所有线程共享。
4.系统开销
进程的创建和撤消的开销要远大于线程创建和撤消的开销,进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作,可见,进程切换的开销远大于线程切换的开销。
同时,同一进程内的各线程由于它们拥有相同的地址空间,它们之间的同步和通信的实现也变得比较容易。
多线程的三大特性:
1.原子性:线程的一个或者多个操作要么全部执行,而且执行过程不会被打断,要么全部都不执行。
2.可见性:可见性是指多个线程访问同一个变量的时候,一个线程修改了这个变量的值,其他线程也可以立刻看到这个修改后的值。Java提供关键字volatile关键字来保证可见性(当一个共享变量被volatile修饰后,它会保证修改的值立即更新到主存中,其他线程如果需要用到这个变量,会到主存中去取,这样保证每个线程读取到的数据都是最新的)。Synchronized和Lock也能保证可见性,Synchronized和Lock保证同一时刻只有一个线程能够获得锁然后执行同步代码,并且在释放锁之前,将变量的值刷新到主存中,因此可以保证可见性。
3.有序性:即程序的执行顺序按照代码的先后顺序执行。(在java内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响单线程程序的执行,但是会影响多线程并发执行的正确性)。