筑基
开篇
我们是核弹研究基地,因计算任务量大,复杂,耗时长,结果要求精确,我们决定招募一批优秀的计算器使用人才帮助进行计算,对于人才的要求为计算快速且结果准确。下面是我们的题目,预备开始 :
参赛的选手分别有来自银行的美娜,来自菜市场的张大妈,来自卖猪市场的李大哥,还有卖炊饼的武大和来自计算机所老君头儿;
===》演示
经过漫长等待,所有选手都已经完成计算,最长4个小时的计算时间;面试官大惊失色,这些选手实力太强了吧,我们基地平均计算时间都得8个小时;下面公布时间: 美娜2h,张大妈3h,李大哥4h,武大4h;
你们的手速太快了吧;据我们统计,计算1-10000的和,人工需要操作29998次;
4h这个时间的推导是这样的:
29998 * 0.5s = 14999s
14999 / 60 / 60 = 4h (约等于)
这个时候 老君头儿说话了, 我只用了1s钟; 你们的时间都浪费在了人工输入上,真正的计算时间其实并不多;
我的1s正是计算时间,在人工输入的时间上几乎为0;
大家肯定很奇怪我是怎么做到的,我就是利用了计算机的自动化做到的;
我编写了一个加法程序,这个程序可以做到1-n的计算,只要输入n即可,计算机可以在秒级给出结果;下面就是我的程序代码;
===》演示
let result = 0;
for(let i = 1; i <= 10000; i++) {
result += i;
}
计算机的特点就是运算速度快,而且适合做重复性的计算;
开篇结论
人工操作========》慢 (原因: 输入慢) ====》 输入阻塞
自动化==========》快 (原因: 不需要频繁输入) ====》无阻塞,一直运行;
输入阻塞,输出阻塞, 我们称为 IO阻塞; I==》 Input(输入) O==>Output(输出)
经过我们基地研究决定,引入计算机和老君头儿提高我们基地的计算能力;以后我们的任务就可以通过老君头儿的计算机做计算了,这样我们的结果既准确,又快速了;
所以 当出现阻塞的时候,cpu就不执行指令了;相当于在阻塞期间cpu被浪费掉了;
计算机的组成
主要是由硬件和软件(操作系统和应用程序)组成;
操作系统发展历程
无操作系统的裸机
就像上述使用计算器一样,每一次操作都需要人工参与,非常慢,而且有可能人工参与会出错,结果有误;
第一代操作系统
解决了人工操作的带来的问题,计算机操作人员通过纸带输入程序;由计算机自动化运算输出结果;
但这台计算机操作系统的特点是: 某一段时间只允许一个程序运行;
所以很多人员需要排队,提前预约计算机时间;
上午: 老君头儿
下午: 王大妈
晚上: 武大
在自己的时间里,可以去调试程序,并且可以去计算自己的任务;
问题: 每个人都有很多任务,编写了很多程序,但是由于计算机操作系统一个时刻只能运行一个程序,所以需要排队,效率较低;
思考: 能不能把程序收集起来一批一批处理,这样大伙儿就不需要等待那么长时间了;
第二代操作系统
基于第一代的缺点,出现了第二代操作系统==》批处理操作系统;
收集了 老君头儿,王大妈,武大的多个程序,一批一批的输入计算机,最终输出结果; 解决了人排队的问题;不需要浪费人的时间;
但带来了新的问题:
1. 程序排队运行;人虽然不需要排队了,但程序仍然需要排队,程序是一个接着一个依次执行的;如果第一个程序运行很慢,卡住,会影响到后面的程序;最坏的可能,如果第一个程序运行错误,会影响到后续程序的运行;
2. 程序共享内存,很有可能互相存储方面互相影响;
3. 程序阻塞时,cpu浪费的问题;
思考: 能不能大家的程序不要互相影响;
第三代操作系统
基于第二代操作系统的问题,出现了第三代系统===》多道批处理系统;
第三代操作系统把内存分为了多个区域,每个程序一个区域,互相隔离,这样彼此就不会互相影响了;保证了系统的稳定性;
每个程序只可以操作自己的区域,而且如果操作底层的共享资源时,需要向操作系统申请,这样就能保证系统的安全性;
但这时候程序还是排队执行的, 如果有一些IO输入输出,会阻塞程序执行;
思考: 如何在A程序IO阻塞的时候,B程序继续使用cpu运行程序呢?
第四代操作系统
基于第三代的问题和思考,发明了第四代操作系统==》分时操作系统;
操作系统将CPU时间切分为一段一段的时间片,随机分配到各个程序;获取到时间片的程序运行;当程序拿到时间片的时候,程序有IO阻塞,这时候会放弃时间片,在阻塞期间不去争抢时间片,直到阻塞结束才可能被分配时间片; 别的程序就可以立马获取到时间片去运行自己的部分,由此就不会浪费cpu时间片;
在第四代操作系统的时候,明显感觉到多个程序几乎可以“同时”运行,但又不是真正意义上的并行,因为cpu只有一个,而且一个时刻只能由一个程序占用;但由于cpu时间片切换的非常快速,让人感觉到像是多个程序“同时”运行; 这种伪并行,我们专业名词称为并发;
思考:随着程序的发展,可能一个程序要有很多不同的任务,任务耗时长,计算慢,要求结果准确, 如何提高一个程序的效率?
第五代操作系统
基于第三,第四代操作系统,发明了第五代操作系统
可以发现第三代,第四代操作系统解决了程序排队运行和IO阻塞浪费cpu时间片的问题;
第五代的实现思路如同上述:
一个程序要有很多不同的任务,任务耗时长,计算慢,要求结果准确;
我们可以模仿多个程序隔离的方式做;在一个进程内,划分出多个“轻量级进程”,每个“轻量级进程”互相隔离,互不影响,互不 阻塞;可以发现进程的粒度更细了;操作系统分配时间片的对象从进程转为了 “轻量级进程” ;这样一个程序的执行效率就提高了;
“轻量级进程” 比较拗口,改名叫做线程;
线程
占用进程的一块空间,
多个线程之间彼此独立;互补影响;
所以如果有大量的线程出现的时候,还会占用大量的存储;
第六代操作系统
由于计算机硬件的发展,以及算力的高要求,出现了多核CPU;
操作系统真正意义上实现了cpu之间并行; 每个cpu内并发; 所以在第六代操作系统的时候,并行和并发同在;
第七代操作系统
分布式操作系统;
由于一台计算机的算力很有限,当出现的任务特别大,需要特别大的算力时,一台计算机是做不到的;那就需要N台计算机共同计算; N台计算机通过网络通信;
第八代操作系统
图形操作系统;
这个适合家庭,个人使用;比较出名的有 Windows,Mac;(图形化本身会占用一定的线程资源,内存资源,cpu资源)
如果作为服务器操作系统的化,一般使用Linux操作系统表现更出色一些; 服务器上的操作系统基本上是无界面的,所以各个方面的开销都很小;
线程调度中心
分时操作系统会维护一个线程调度中心和线程休息区;
调度模式:
公平式: 会将cpu时间片平均分配给每个线程,让每个线程都有机会运行;
非公平式: 也叫做抢占式,会随机分配时间片到线程; 有可能有的线程一直没有分配到cpu时间片;
默认使用非公平式(抢占式)模式;
只有在线程调度中心的线程才有机会获取到cpu时间片;
只要线程不阻塞就会一直在线程调度中心中;
当线程E进入到IO阻塞时,会进入到休息区;线程调度中心就不会将cpu再分配给线程E;
线程调度随机性,无序性
调度中心的线程到底谁获取到时间片,是随机方式的;为什么是随机方式呢?不可以按顺序分配吗?
上下文切换
A线程任务执行需要10s中,每次分配到的时间片是1S种,这样需要切换10次才能完成任务;
上下文切换会有cpu的消耗;
任务和任务载体
任务: 需要完成的业务;
任务载体: 线程;
二者关系:
1. 线程和任务绑定; 每个线程只能运行一种任务;只能完成A类任务; 例如: 火车只能跑在轨道上;
2. 线程和任务分离:每个线程可以运行不同种类的任务; 完成A类型任务后,去完成B类型任务; 例如: 卡车可以装不同的货物
线程特性
线程属性; 名称,唯一标识,类型,状态,优先级
线程行为:
A线程正常执行;
A线程正在阻塞,B线程中断A的线程的阻塞状态,A线程继续执行;
A线程执行的任务出现异常了,
如果A线程和任务绑定了,则A线程的任务停止运行,则A线程可能停止运行;
如果A线程没有和任务绑定,则仅仅是任务停止,而A线程则继续执行别的任务;
Java语言实现了多线程
感谢Java语言实现了多线程,这样我们就可以提高我们程序运行的效率了;
Java中的线程与操作系统的线程是一一对应的;
线程的英文 Thread
筑基完成
当场景为: 在一个进程计算任务量大,耗时长的特点的时候,就可以使用 工具===》多线程完成;
精简概括: 多任务场景考虑使用多线程去充分使用cpu,提高程序运行效率;
脉络梳理
线程是如何出现的呢?
上述已经描述过,是因为一个程序中有多种任务,我们希望这些任务不要互相影响,所以创造出了线程;
线程之间互不影响,互不干扰,占用一定的内存;
只有加入到调度中心的线程,才有可能被分配时间片;
什么是并发呢?
并发是用于描述: 操作系统将cpu时间片随机分配给不同的线程,让任务都动起来,感觉像是“同时”运行的,其实一个时刻只能一个线程执行,只是由于cpu时间片较短,线程切换比较频繁;
概括: 多任务场景考虑使用多线程去充分使用cpu,提高程序运行效率;
脉络梳理
线程是如何出现的呢?
上述已经描述过,是因为一个程序中有多种任务,我们希望这些任务不要互相影响,所以创造出了线程;
线程之间互不影响,互不干扰,占用一定的内存;
只有加入到调度中心的线程,才有可能被分配时间片;
什么是并发呢?
并发是用于描述: 操作系统将cpu时间片随机分配给不同的线程,让任务都动起来,感觉像是“同时”运行的,其实一个时刻只能一个线程执行,只是由于cpu时间片较短,线程切换比较频繁;