假设MyProcess正在CPU里面执行,它现在已经创建了一个子进程,并且它已经打开了一些文件开始读,小A非常无聊,想把它从CPU里面弄出来一下在放回去运行一段时间再把它和它的子进程销毁,现在想想我们需要什么。
首先是不是得给她一个唯一标识符进程标识数,不然这么多进程我们会分不清。
它已经打开了一个文件,那再次执行的时候也应该打开之前的文件,所以需要记录它正在使用的资源信息。
除了使用资源,它还有可能正在进行一些运算,这些运算产生的中间结果会放在CPU的寄存器里面,为了使MyProcess再次执行的时候能够正常的继续它的运算,我们需要把这些关键的信息记录在CPU现场保护区里面。
把MyProcess从CPU里面拿出来之后,这台计算机上肯定不止它一个处于就绪态的进程,要管理这么多进程我们需要一个数据结构:链表。
MyProcess作为链表的一个节点,自然而然的就需要一个指向下一个节点的指针,即进程的链表指针。
作为一个重视优先级的系统,在MyProcess处于就绪态的时候,如果此时有更加重要优先级更高的进程也处于就绪态,我们会选择后者,而不是MyProcess 。 为此需要在PCB中记录优先级等信息,即进程状态、调度、存储器管理信息
小A希望把它和它的子进程一起销毁,所以我们要能够从MyProcess找到它的子进程,所以PCB还要记录进程家族关系。
linux是允许多个用户同时操作的,为了防止粗心的小B不小心打乱我们的计划,我们需要标识当前的进程是属于小A的,把她的账户记在PCB里面,即记账信息。
并发性、独立性
进程调度
进程调度最终是由操作系统的进程调度程序来实现的,粗暴的理解,
当有很多进程都要执行的时候操作系统的进程调度要决定先执行哪一个,并且有这么多进程在CPU不断的切换的时候,进程调度程序还要保证切换不会导致出错
进程调度的功能
这一部分就是在讲进操作系统的程调度程序做了哪些事。
要决定现在要执行哪一个进程,至少得先知道现在哪些进程就绪了,哪些进程阻塞了吧,所以要 “记录系统中各个进程的执行情况”;
知道了进程的状态和情况之后,要在就绪的进程中选出一个来执行,即“选择就绪进程占有CPU”;
选好了以后就得把选好的进程弄到CPU里面去执行了,这一步就是“进程上下文切换”。
- 记录系统中各个进程的执行情况
管理进程控制块,将进程的状态变化及资源需求情况及时地记录到PCB中。 - 选择就绪进程占有CPU
这一步具体要怎么选择就是后文进程调度算法的内容 - 进程上下文切换
将正在执行进程的上下文保存在该进程的 PCB 中,将刚选中进程的运行现
场恢复起来,以便执行。
进程的调度的方式
- 非剥夺方式
当前正在执行的进程,如果它不主动因为申请资源等屁事停下来就让他跑着 - 剥夺方式
当前的进程跑的好好的,也没什么想停下来的原因,但是这个时候来了一个比它优先级更高更加重要的进程,操作系统可以让他停下来
进程调度的时机
这个他指的是:什么时候会发生 “一个正在CPU中执行的进程停止执行” or “一个不在CPU中执行的进程被放到CPU中执行” 者两种情况
先想第一种:从运行态可以转到结束态、就绪态、阻塞态,分别对应下面三种情况
- 进程结束 或者进程错误终止
- 出现优先级更高的就绪的进程抢占CPU
- 请求I/O设备资源,等待I/O请求完成时
还有一个分时系统中的情况 - 分时系统中一个进程当前的时间片用完了就要停止执行 (之后介绍到这一部分了再放链接填坑
- 进程执行了某种原语操作,如阻塞原语和唤醒原语,都可能引起进程调度。(这个和前面申请IO的那条分开,我觉得应该是因为阻塞的原因不只有等到申请资源
事实上第二种只是第一种的反面,有一个进程停止执行总是伴随一个进程开始执行,反之也成立
进程调度的算法
进程调度算法就是来解决在这么多就绪的进程中应该选择哪一个来执行的问题的
下面的得记住并且理解,感觉容易在这里出题 乐
进程调度算法有下面这么些:
插一嘴:平均周转时间是指进程周转时间的平均数 废话,这是进程调度算法效果的衡量指标之一.
周转时间
=
进程执行的时间
进程执行结束的时间
−
开始等待的时间
周转时间=\frac{进程执行的时间} {进程执行结束的时间 \space- \space开始等待的时间}
周转时间=进程执行结束的时间 − 开始等待的时间进程执行的时间
图中黑色的部分是进程正在执行,平均周转时间为上面黑色的时间比上整段的时间,即
T
1
T
2
\frac{T_1}{T_2}
T2T1
带权平均周转时间,加的权是进程的优先级
先来先服务(FCFS)
字面意思,先执行先来的,一个接一个
缺点在于如果前面的执行时间很长,那后面的可能很长时间都没办法执行
漂亮的说法:叫做 “容易被大作业垄断,使得平均周转时间延长”
最短作业优先 (SJF)
字面意思,先执行运行时间短的,有效避免上面的情况。但是要是一个执行时间长的一直被执行时间短的插队,那它可能一直都不会得到执行。
“若系统不断进入短作业,长作业就没有机会运行,出现饥饿现象”
响应比高者优先(HRN)
该算法的选择指标是响应比,每次选择响应比最高的。它一定程度上避免了上面两种算法的缺点。执行时间短的响应比会比较高,但是如果执行时间长的进程等待了太长时间,它的响应比也会提高。
响应比=1+作业等待时间/作业估计运行时间
响应比近似上图的
1
T
3
T
1
1+\frac{T_3}{T_1}
1+T1T3,但是由于现在进程并没有真正执行,所以这里的执行时间是预估的。
优先级调度法
优先级高的先执行,(windows是数字越大优先级越高)可以采用静态优先级或者动态优先级
- 静态优先级
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
性能优化
1.webpack打包文件体积过大?(最终打包为一个js文件)
2.如何优化webpack构建的性能
3.移动端的性能优化
4.Vue的SPA 如何优化加载速度
5.移动端300ms延迟
6.页面的重构
所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1Z28yMzM=,size_16,color_FFFFFF,t_70)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-3YeCAtMN-1712908540058)]