欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
我的qq号是:1210931886,欢迎大家加群,一起学习,互相交流,共同进步🎉✨
多线程-初阶
- 什么是进程/任务(Process/Task)
- 进程就是一个运行起来的程序
- PCB 进程控制块抽象(PCB Process Control Block)
- pcb就是一个进程
- PCB具体包含的信息
- CPU 分配 —— 进程调度(Process Scheduling)
- 内存分配 —— 内存管理(Memory Manage)
- 虚拟地址空间
- 进程间通信(Inter Process Communication)
- 进程的意义
- 1. 认识线程(Thread)
- 1.1 概念
- 1) 线程是什么
- 2) ***为啥要有线程(线程的重要性)
- 3) ★★★★★进程和线程的区别(面试题)
首先我们可以用一个样例解释线程和进程
比如我们现在需要把100个鸡蛋孵出来
方案1:我们雇用一个鸡孵
方案2:雇佣2个鸡分别在两个房间孵
方案3:雇佣2个鸡在一个房间孵
方案4:雇佣1000个鸡在同一个房间孵
以上鸡代表线程,房间代表进程
线程和进程不是越多越好,需要合理分配
什么是进程/任务(Process/Task)
进程就是一个运行起来的程序
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位
PCB 进程控制块抽象(PCB Process Control Block)
计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征。
// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息(留待下面讲解)
}
pcb就是一个进程
这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。
操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
PCB具体包含的信息
- pid
- 内存指针
- 文件描述符
- 进程状态
- 进程优先级
- 进程上下文
- 记账信息
CPU 分配 —— 进程调度(Process Scheduling)
为了便于讨论和理解,我们大部分的场景下假设是单CPU单核的计算机。
操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源。
内存分配 —— 内存管理(Memory Manage)
操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
虚拟地址空间
进程间通信(Inter Process Communication)
如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备”隔离性(Isolation)“。
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运而生。
目前,主流操作系统提供的进程通信机制有如下:
- 管道
- 共享内存
- 文件
- 网络
- 信号量
- 信号
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。
进程的意义
1. 认识线程(Thread)
1.1 概念
1) 线程是什么
一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时” 执行着多份代码.
还是回到我们之前的银行的例子中。之前我们主要描述的是个人业务,即一个人完全处理自己的业务。我们进一步设想如下场景:
一家公司要去银行办理业务,既要进行财务转账,又要进行福利发放,还得进行缴社保。如果只有张三一个会计就会忙不过来,耗费的时间特别长。为了让业务更快的办理好,张三又找来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。此时,我们就把这种情况称为多线程,将一个大任务分解成不同小任务,交给不同执行流就分别排队执行。其中李四、王五都是张三叫来的,所以张三一般被称为主线程(Main Thread)
2) ***为啥要有线程(线程的重要性)
- 首先, “并发编程” 成为 “刚需”
单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程(多线程编程)能更充分利用多核 CPU 资源.
有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程- 其次, 虽然多进程也能实现 并发编程, 但是线程比进程更轻量
创建线程比创建进程更快.
销毁线程比销毁进程更快.
调度线程比调度进程更快.- 最后, 线程虽然比进程轻量, 但是人们还不满足, 于是又有了 “线程池”(ThreadPool) 和 “协程”(Coroutine)
3) ★★★★★进程和线程的区别(面试题)
- 包含
- 区别(轻量,创建快,销毁快)
- 优势
- 优势的原因