程序、进程、线程概念简介
程序:完成特定功能的一系列有序指令的集合
可执行文件
代码段+数据段
进程:程序的一次动态执行过程
代码段+数据段+堆栈段+PCB(进程控制块)
进程:动态的,短暂的,堆栈段+PCB 程序:数据段、永久的
一个进程只能对应一个程序,一个程序可以对应多个进程
线程:是一个进程内部的控制序列。
进程与线程的区别:
进程是资源竞争的基本单位;线程是程序执行的最小单位。
线程共享进程数据:进程ID,UID,GID,EUID,EGID,地址空间,文件描述符,信号处理器,CPU状态
也拥有自己的一部分数据:线程ID,一组寄存器,栈,errno,信号状态,优先级
创建进程和创建线程的区别:
1、当一个进程执行一个fork调用的时候,会创建出进程的一个新的拷贝,新进程将拥有它自己独立的变量和它自己的PID。这个新进程的地址空间是独立的。
2、在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈,因此有自己的局部变量,但要与它的创建者共享全局变量、文件描述符,信号处理器和当前工作目录状态。
线程的优点:
1、创建一个新线程的代价要比创建一个新进程小很多
2、与进程之间切换相比,线程之间的切换需要操作系统做的工作要少很多
3、线程占用的资源比进程少很多
4、能充分利用多处理器可并行数量(单线程只能竞争到一个CPU)
5、在等待慢速IO操作结束的同时,程序可执行其他的计算任务
6、计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
7、IO密集型应用,为了提高性能,将IO操作重叠。线程可以同时等待不同的IO操作
线程的缺点:
1、性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能有
较大性能损失,增加了额外的同步和调度开销。
2、健壮性降低:编写多线程需要更全面的深入考虑,线程之间缺乏保护
3、缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
4、编程难度提高。
线程调度竞争范围:
操作系统提供了各种模型,用来调度应用程序创建的线程。这些模型之间的主要不同是:在竞争系统资源时(CPU时间),线程调度竞争范围不一样(2种)
进程竞争范围:各个线程在同一进程竞争被调度的CPU时间。
系统竞争范围:线程直接和系统范围内的其它线程竞争
三种线程模型:
1、N:1用户线程模型:建立在进程控制机制之上,由用户空间程序库来管理。OS内核完全不知到线程信息,线程被称为用户空间线程。工作在进程竞争范围内
线程分享进程获取的时间。
内核不干涉线程的任何生命活动,也不干涉同一进程中的线程环境切换。
一个进程中的多个线程只能调度到一个CPU,这种约束限制了并行总量
如果某个线程执行了一个阻塞式操作,那么进程中所有线程都会阻塞,直到那个操作结束。为此,一些线程的实现是为了这些阻塞式函数提供非阻塞时版本
2、1:1核心线程模型:应用程序创建的每一个线程都由一个核心线程直接管理。每一个核心线程都调用到系统CPu,因此所有线程都工作在系统竞争范围内。这种
现成的创建与调度都由内核完成,因此系统开销比较大。
3、N:M混合线程模型:提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程。轻量级进程再一一映射到核心线程
N个线程映射到M个轻量级进程
*/