进程是承担分配系统资源的基本实体
线程是CPU调度的基本单位
线程的概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
- 在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)
更准确的定义是:线程是“⼀个进程内部的控制序列” - ⼀切进程⾄少都有⼀个执⾏线程
- 线程是在进程内部运行,本质是在进程地址空间内运行
Linux 中,进程示图
进程和线程
- 进程是资源竞争的基本单位
- 线程是程序执⾏的最⼩单位
- 线程共享进程数据,但也拥有⾃⼰的⼀部分数据:
线程ID 、⼀组寄存器 (上下文信息)、栈 、 errno、 信号屏蔽字 、 调度优先级
⼀组寄存器 :每个进程都有上下文信息,可保证线程间切换,说明线程是动态的
栈 : 线程拥有自己独立的栈结构,互不干扰
进程的多个线程共享
- 同⼀地址空间,因此Text Segment、Data Segment都是共享的
-如果定义⼀个函数,在各线程中都可以调⽤
-如果定义⼀个全局变量,在各线程中都可以访问到
各线程还共享以下进程资源和环境 :
- ⽂件描述符表
- 每种信号的处理⽅式(SIG_ IGN、SIG_ DFL或者⾃定义的信号处理函数)
- 当前⼯作目录
- ⽤户id和组id
合理创建多线程,可以提高用户体验
在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。
操作系统的设计,可以归结为三点:
(1)以多进程形式,允许多个任务同时运行
(2)以多线程形式,允许单个任务分成不同的部分运行
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源
线程和进程的关系:
线程的优点
- 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多(需要的资源少)
- 与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多(线程之间,地址空间是共享的)
- 线程占⽤的资源要⽐进程少很多
- 能充分利⽤多处理器的可并⾏数量
- 在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务
- 计算密集型应⽤,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现(占较多CPU)
- I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作(占较多IO资源)
线程的缺点
- 性能损失
线程过多,增加了额外的同步和调度开销,⽽可⽤的资源不变,有较⼤的性能损失 - 健壮性降低
在⼀个多线程程序⾥,因时间分配上的细微偏差或者因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护的(互相干扰) - 缺乏访问控制
进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。 - 编程难度提⾼
编写与调试⼀个多线程程序⽐单线程程序困难得多