目录
进程和线程都是CPU工作时间段的描述。是运行中的程序指令的一种描述,需要与程序中的代码区别开来
进程:执行中的程序实例,可以包含多个线程,是资源分配的基本单位
线程:进程中的执行单元,是任务调度的基本单位
背景
相比电脑里的其他硬件,CPU速度极快,寄存器仅能够接近其处理速度,RAM和别的挂在各总线上的设备则难以望其项背。因为速度差异,CPU实际的执行时间和等待执行的时间是数量级的差异。比如工作1秒钟,休息一个月。那当多个任务要执行时,为了给用户更好的并发性体验,CPU就在多个任务间切换。
并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。
概念
程序
程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中
进程process
在上文的背景介绍中,只要任务切换够快,外在表现就仿佛是同时在执行。于是程序的意义演变为正在执行的程序和上下文,也就是进程。随着技术迭代,进程逐渐变成静态的资源容器
- 进程存在着生命周期, 会随着程序的终止而销毁, 不会永久存在系统中
- 进程是申请一块内存空间,将数据放到内存空间中,是系统进行资源分配和调度的基本单位。
- 进程是线程的资源容器,为进程里的所有线程提供共享资源,是对程序的一种静态描述
理解进程的另一个角度是,用某种方法把相关的资源集中在一起。进程有存放程序正文和数据以及其他资源的地址空间。这些资源包括打开的文件、子进程、即将发生的定时器、信号处理程序、账号信息等。把这些信息放在进程中会比较容易管理。
线程
进程用于把资源集中在一起,而线程则是 CPU 上调度执行的实体。
例子: 我们打开一个聊天软件,这就是开启了一个进程;当我们在软件里面打开一些功能,比如空间, 扫一扫, 设置...,这些操作就是线程
也被称为轻量级的进程,一个进程至少包含一个线程
- 线程是操作系统能够进行运算调度的最小单位,是对程序的一种动态描述
- 它被包含在进程之中,是进程中的实际运作单位。
- 线程除了一些基本的,比如寄存器,计数器等,其他的内存空间由进程提供,与其他线程共享
线程会有程序计数器,用来记录接着要执行哪一条指令;线程还拥有寄存器,用来保存线程当前正在使用的变量;线程还会有堆栈,用来记录程序的执行路径。尽管线程必须在某个进程中执行
线程给进程模型增加了一项内容,即在同一个进程中,允许彼此之间有较大的独立性且互不干扰。在一个进程中并行运行多个线程类似于在一台计算机上运行多个进程。在多个线程中,各个线程共享同一地址空间和其他资源。在多个进程中,进程共享物理内存、磁盘、打印机和其他资源。因为线程会包含有一些进程的属性,所以线程被称为轻量的进程
。多线程
一词还用于描述在同一进程中多个线程的情况。
同一个进程中的所有线程都会有完全一样的地址空间,这意味着它们也共享同样的全局变量。由于每个线程都可以访问进程地址空间内每个内存地址,因此一个线程可以读取、写入甚至擦除另一个线程的堆栈。
https://www.zhihu.com/question/25532384/answer/1157991430
总结:
-
独立性: 进程是操作系统中独立的执行单元,每个进程都有自己独立的内存空间,而线程是进程中的执行单元,同一进程中的线程共享进程的内存空间。
-
资源占用: 进程需要占用大量的系统资源,如内存空间、I/O 设备、文件句柄等,而线程则使用进程的资源。
-
切换开销: 进程切换的开销相对较大,因为它需要保存和恢复进程的上下文信息。而线程切换的开销相对较小,因为它只需要保存和恢复线程的上下文信息。
-
通信与同步: 进程间通信和同步比较复杂,需要通过一些 IPC(进程间通信)机制,如管道、信号量、消息队列等来实现。而线程之间的通信和同步比较简单,可以直接通过共享内存和同步对象(如互斥量、信号量等)来实现。
-
可伸缩性: 由于进程的独立性,进程间的负载可以相对容易地分布到不同的计算机上。而线程则更适合于在单个计算机上处理大量的并发请求。
拓展
协程 co-thread
REF
2、为什么需要更多的线程 - 简书 (jianshu.com)
进程的概念和线程应该是同时出现的,因为没有线程,就不需要区分进程,直接叫地址空间就可以了。地址空间里面本身就有一个执行序列,否则应用程序就没有存在的意义了。所以,进程里面至少有一个线程,但是一个线程,就没必要单独区分了。
- 进程的切换开销大于线程的原因:
为每个进程都有⾃⼰的虚拟地址空间,⽽线程是共享所在进程的虚拟地址空间的,所以同⼀个进程中的线程进⾏切换时不涉及虚拟地址空间的转换。
每个进程都有⾃⼰的虚拟地址空间,而虚拟地址转换为物理地址需要查找⻚表,⻚表查找是⼀个很复杂的过程(⾄少访问2次内存),因此通常使⽤Cache来缓存常⽤的地址映射,这样可以加速⻚表查找,这个cache就是 TLB(快表),进程切换 ---> ⻚表切换 ---> TLB失效 ---> cache失效 ---> 命中率降低 ---> 速度变慢,