进程和线程
进程和程序的联系:
程序 = 文件(静态的可执行文件)
进程 = 执行中的程序 = 程序+执行状态
同一个程序的多次执行过程对相应不同的进程。
进程是操作系统处于执行状态程序的抽象
进程执行需要的资源:内存和cpu
区别:
进程是动态的,程序是静态的
进程是程序的执行 ,进程有核心态/用户态
进程是暂时的,程序是永久的:
进程是一个状态变化的过程
程序可长旧保存
进程和程序的组成不同:进程的组成包括程序、数据和进程控制块
进程和线程的比较
进程是资源分配的单位,线程是CPU调度单位
进程拥有一个完整的资源平台,而线程只独享指令流的必要资源,如寄存器和栈
线程具有就绪、等待和运行三种基本状态和状态间的转换关系。
线程能减少并发执行的时间和空间开销
①线程的创建时间比进程短
②线程的终止时间比进程短
③统一进程内的线程切换比进程短
④由于同一进程的各线程间共享内存和文件资源,可不通过内核进行直接通信
用户线程特征
不依赖于操作系统的内核:
①内核不了解用户线程的存在
②可用于不支持线程的多进程操作系统
在用户空间实现的线程机制:
①每个进程有私有的线程控制块
②TCB由线程库函数维护
同一进程内的用户线程切换速度快
①无需用户态/和心态切换
允许每个进程拥有自己的线程调度算法
不足:
线程发起系统调用而阻塞时,则整个进程进入等待
不支持基于线程的处理及抢占,除非当前运行线程主动放弃,他所在进程的其他线程无法抢占CPU
只能按进程分配CPU时间,多个线程进程中,每个线程的时间片较少
内核线程的特征:
由内核维护PCB和TCB
线程执行系统调用而被阻塞不影响其他线程
线程的创建、终止和切换相对比较大,通过系统调用/内核函数,在内核实现
以线程为单位进行CPU时间分配,多线程的进程可获得更多CPU时间。
进程和线程的切换比较
①切换虚拟内存的页目录以使用新的地址空间
②切换内核栈和硬件上下文
进程切换时需要①②,线程切换时只需要②
另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题
进程上下文切换
进程上下文包含了进程执行所需要的所有信息。
用户地址空间:包括程序代码,数据,用户堆栈等;
控制信息:进程描述符,内核栈等;
硬件上下文:进程恢复前,必须装入寄存器的数据统称为硬件上下文。
进程上下文包含了进程执行所需要的所有信息。 用户地址空间:包括程序代码,数据,用户堆栈等; 控制信息:进程描述符,内核栈等; 硬件上下文:进程恢复前,必须装入寄存器的数据统称为硬件上下文。
进程切换分5步
1.切换页目录以使用新的地址空间
2.切换内核栈
3.切换硬件上下文
4、刷新TLB
5、系统调度器的代码执行
对于linux来说,线程和进程的最大区别就在于地址空间。
对于线程切换,第1步是不需要做的,第2和3步是进程和线程切换都要做的。所以明显是进程切换代价大
1. 线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,
但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。
内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
2. 另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。
简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。
还有一个显著的区别是当你改变虚拟内存空间的时候,
处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,
这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。