多线程起源境筑基

发布于:2022-10-17 ⋅ 阅读:(765) ⋅ 点赞:(0)

筑基

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGX9XJJR-1666020314236)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016011237223.png)]

开篇

img

​ 我们是核弹研究基地,因计算任务量大,复杂,耗时长,结果要求精确,我们决定招募一批优秀的计算器使用人才帮助进行计算,对于人才的要求为计算快速且结果准确。下面是我们的题目,预备开始 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDMe4qMx-1666020314239)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016000013797.png)]

​ 参赛的选手分别有来自银行的美娜,来自菜市场的张大妈,来自卖猪市场的李大哥,还有卖炊饼的武大和来自计算机所老君头儿;

​ ===》演示

​ 经过漫长等待,所有选手都已经完成计算,最长4个小时的计算时间;面试官大惊失色,这些选手实力太强了吧,我们基地平均计算时间都得8个小时;下面公布时间: ​ 美娜2h,张大妈3h,李大哥4h,武大4h;
在这里插入图片描述

​ 你们的手速太快了吧;据我们统计,计算1-10000的和,人工需要操作29998次

在这里插入图片描述

​ 4h这个时间的推导是这样的:

​ 29998 * 0.5s = 14999s

​ 14999 / 60 / 60 = 4h (约等于)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDqYcI2K-1666020314241)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016001841727.png)]

这个时候 老君头儿说话了, 我只用了1s钟; 你们的时间都浪费在了人工输入上,真正的计算时间其实并不多;

我的1s正是计算时间,在人工输入的时间上几乎为0;

大家肯定很奇怪我是怎么做到的,我就是利用了计算机的自动化做到的;

我编写了一个加法程序,这个程序可以做到1-n的计算,只要输入n即可,计算机可以在秒级给出结果;下面就是我的程序代码;

===》演示

let result = 0;
for(let i = 1; i <= 10000; i++) {
    result += i;
}

计算机的特点就是运算速度快,而且适合做重复性的计算;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUCWkvuN-1666020314242)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016013359130.png)]

开篇结论

​ 人工操作========》慢 (原因: 输入慢) ====》 输入阻塞

​ 自动化==========》快 (原因: 不需要频繁输入) ====》无阻塞,一直运行;

​ 输入阻塞,输出阻塞, 我们称为 IO阻塞; I==》 Input(输入) O==>Output(输出)

​ 经过我们基地研究决定,引入计算机和老君头儿提高我们基地的计算能力;以后我们的任务就可以通过老君头儿的计算机做计算了,这样我们的结果既准确,又快速了;

​ 所以 当出现阻塞的时候,cpu就不执行指令了;相当于在阻塞期间cpu被浪费掉了;

计算机的组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZbi0RGE-1666020314243)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016012115408.png)]

主要是由硬件和软件(操作系统和应用程序)组成;

操作系统发展历程

无操作系统的裸机

​ 就像上述使用计算器一样,每一次操作都需要人工参与,非常慢,而且有可能人工参与会出错,结果有误

第一代操作系统

​ 解决了人工操作的带来的问题,计算机操作人员通过纸带输入程序;由计算机自动化运算输出结果;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UiPXpkGK-1666020314243)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016210256732.png)]

​ 但这台计算机操作系统的特点是: 某一段时间只允许一个程序运行

​ 所以很多人员需要排队提前预约计算机时间

​ 上午: 老君头儿

​ 下午: 王大妈

​ 晚上: 武大

​ 在自己的时间里,可以去调试程序,并且可以去计算自己的任务;

​ 问题: 每个人都有很多任务,编写了很多程序,但是由于计算机操作系统一个时刻只能运行一个程序,所以需要排队,效率较低;

​ 思考: 能不能把程序收集起来一批一批处理,这样大伙儿就不需要等待那么长时间了;

第二代操作系统

​ 基于第一代的缺点,出现了第二代操作系统==》批处理操作系统

​ 收集了 老君头儿,王大妈,武大的多个程序,一批一批的输入计算机,最终输出结果; 解决了人排队的问题;不需要浪费人的时间;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8tkHS5dU-1666020314244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016210637202.png)]

​ 但带来了新的问题:

​ 1. 程序排队运行;人虽然不需要排队了,但程序仍然需要排队,程序是一个接着一个依次执行的;如果第一个程序运行很慢,卡住,会影响到后面的程序;最坏的可能,如果第一个程序运行错误,会影响到后续程序的运行;

​ 2. 程序共享内存,很有可能互相存储方面互相影响;

​ 3. 程序阻塞时,cpu浪费的问题;

​ 思考: 能不能大家的程序不要互相影响;

第三代操作系统

​ 基于第二代操作系统的问题,出现了第三代系统===》多道批处理系统;

​ 第三代操作系统把内存分为了多个区域,每个程序一个区域,互相隔离,这样彼此就不会互相影响了;保证了系统的稳定性

​ 每个程序只可以操作自己的区域,而且如果操作底层的共享资源时,需要向操作系统申请,这样就能保证系统的安全性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-igmhhFJL-1666020314245)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016210749339.png)]

​ 但这时候程序还是排队执行的, 如果有一些IO输入输出,会阻塞程序执行;

​ 思考: 如何在A程序IO阻塞的时候,B程序继续使用cpu运行程序呢?

第四代操作系统

​ 基于第三代的问题和思考,发明了第四代操作系统==》分时操作系统;

​ 操作系统将CPU时间切分为一段一段的时间片,随机分配到各个程序;获取到时间片的程序运行;当程序拿到时间片的时候,程序有IO阻塞,这时候会放弃时间片,在阻塞期间不去争抢时间片,直到阻塞结束才可能被分配时间片; 别的程序就可以立马获取到时间片去运行自己的部分,由此就不会浪费cpu时间片;

​ 在第四代操作系统的时候,明显感觉到多个程序几乎可以“同时”运行,但又不是真正意义上的并行,因为cpu只有一个,而且一个时刻只能由一个程序占用;但由于cpu时间片切换的非常快速,让人感觉到像是多个程序“同时”运行; 这种伪并行,我们专业名词称为并发

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cg112gHi-1666020314245)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016211119875.png)]

​ 思考:随着程序的发展,可能一个程序要有很多不同的任务,任务耗时长,计算慢,要求结果准确, 如何提高一个程序的效率?

第五代操作系统

​ 基于第三,第四代操作系统,发明了第五代操作系统

​ 可以发现第三代,第四代操作系统解决了程序排队运行和IO阻塞浪费cpu时间片的问题;

​ 第五代的实现思路如同上述:

​ 一个程序要有很多不同的任务,任务耗时长,计算慢,要求结果准确;

​ 我们可以模仿多个程序隔离的方式做;在一个进程内,划分出多个“轻量级进程”,每个“轻量级进程”互相隔离,互不影响,互不 阻塞;可以发现进程的粒度更细了;操作系统分配时间片的对象从进程转为了 “轻量级进程” ;这样一个程序的执行效率就提高了;

“轻量级进程” 比较拗口,改名叫做线程;

线程

​ 占用进程的一块空间,

​ 多个线程之间彼此独立;互补影响;

​ 所以如果有大量的线程出现的时候,还会占用大量的存储;

在这里插入图片描述

第六代操作系统

​ 由于计算机硬件的发展,以及算力的高要求,出现了多核CPU;

​ 操作系统真正意义上实现了cpu之间并行; 每个cpu内并发; 所以在第六代操作系统的时候,并行和并发同在;

​			[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbSTOHEs-1666020314248)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016211812328.png)]

第七代操作系统

​ 分布式操作系统;

​ 由于一台计算机的算力很有限,当出现的任务特别大,需要特别大的算力时,一台计算机是做不到的;那就需要N台计算机共同计算; N台计算机通过网络通信;

​		[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWpuvCJp-1666020314248)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221017211038711.png)]

第八代操作系统

​ 图形操作系统;

​ 这个适合家庭,个人使用;比较出名的有 Windows,Mac;(图形化本身会占用一定的线程资源,内存资源,cpu资源)

​ 如果作为服务器操作系统的化,一般使用Linux操作系统表现更出色一些; 服务器上的操作系统基本上是无界面的,所以各个方面的开销都很小;

线程调度中心

分时操作系统会维护一个线程调度中心和线程休息区;

调度模式:

​ 公平式: 会将cpu时间片平均分配给每个线程,让每个线程都有机会运行;

​ 非公平式: 也叫做抢占式,会随机分配时间片到线程; 有可能有的线程一直没有分配到cpu时间片;

默认使用非公平式(抢占式)模式;

只有在线程调度中心的线程才有机会获取到cpu时间片;

只要线程不阻塞就会一直在线程调度中心中;

在这里插入图片描述

当线程E进入到IO阻塞时,会进入到休息区;线程调度中心就不会将cpu再分配给线程E;

在这里插入图片描述

线程调度随机性,无序性

​ 调度中心的线程到底谁获取到时间片,是随机方式的;为什么是随机方式呢?不可以按顺序分配吗?

在这里插入图片描述

上下文切换

​ A线程任务执行需要10s中,每次分配到的时间片是1S种,这样需要切换10次才能完成任务;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6FHz4R6m-1666020314252)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221016220418647.png)]

​ 上下文切换会有cpu的消耗;

任务和任务载体

​ 任务: 需要完成的业务;

​ 任务载体: 线程;

​ 二者关系:

				1. 线程和任务绑定; 每个线程只能运行一种任务;只能完成A类任务;		例如: 火车只能跑在轨道上;
				2. 线程和任务分离:每个线程可以运行不同种类的任务; 完成A类型任务后,去完成B类型任务; 例如: 卡车可以装不同的货物

线程特性

​ 线程属性; 名称,唯一标识,类型,状态,优先级

​ 线程行为:

​ A线程正常执行;

​ A线程正在阻塞,B线程中断A的线程的阻塞状态,A线程继续执行;

​ A线程执行的任务出现异常了,

​ 如果A线程和任务绑定了,则A线程的任务停止运行,则A线程可能停止运行;

​ 如果A线程没有和任务绑定,则仅仅是任务停止,而A线程则继续执行别的任务;

Java语言实现了多线程

感谢Java语言实现了多线程,这样我们就可以提高我们程序运行的效率了;

Java中的线程与操作系统的线程是一一对应的;

线程的英文 Thread

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jH6uNHBT-1666020314253)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221017205007536.png)]

筑基完成

​ 当场景为: 在一个进程计算任务量大,耗时长的特点的时候,就可以使用 工具===》多线程完成;

​ 精简概括: 多任务场景考虑使用多线程去充分使用cpu,提高程序运行效率

脉络梳理

线程是如何出现的呢?

上述已经描述过,是因为一个程序中有多种任务,我们希望这些任务不要互相影响,所以创造出了线程;

线程之间互不影响,互不干扰,占用一定的内存;

只有加入到调度中心的线程,才有可能被分配时间片;

什么是并发呢?

并发是用于描述: 操作系统将cpu时间片随机分配给不同的线程,让任务都动起来,感觉像是“同时”运行的,其实一个时刻只能一个线程执行,只是由于cpu时间片较短,线程切换比较频繁;

概括: 多任务场景考虑使用多线程去充分使用cpu,提高程序运行效率

脉络梳理

线程是如何出现的呢?

上述已经描述过,是因为一个程序中有多种任务,我们希望这些任务不要互相影响,所以创造出了线程;

线程之间互不影响,互不干扰,占用一定的内存;

只有加入到调度中心的线程,才有可能被分配时间片;

什么是并发呢?

并发是用于描述: 操作系统将cpu时间片随机分配给不同的线程,让任务都动起来,感觉像是“同时”运行的,其实一个时刻只能一个线程执行,只是由于cpu时间片较短,线程切换比较频繁;

本文含有隐藏内容,请 开通VIP 后查看