目录
一.什么是进程?
二.进程是如何创建的
三.进程如何调度的
优先级:
状态:
记账信息:
上下文:
线程是什么:
为什么要有线程:
坏处:
一.什么是进程?
了解这个问题之前,我们需要先打开我们桌面上的的学习资料
啪的一下,很快啊,点双击学习资料.exe之后,在后台(ctrl+alt+delete,任务管理器)我们就能看到这个东西
我们这里肉眼直观可见的这个XX游戏登录程序,就是我们所谓的进程
桌面上的exe文件,只是起了一个发起调用的作用
如果我们不点击exe文件,那么这个进程就永远不会被触发
换句话来说
不调用,不触发
很好的一句废话
二.进程是如何创建的
好吧好吧
既然我们已经能通过后台(任务管理器)看到这个进程
那么我们也需要简单了解一下我们是如何创建出来一个进程的
拿Linux为例
(Windows不开源不清楚他的实现)
在你点击了你的学习资料之后
linux的系统里面有个名字叫做
PCB(进程控制块)的双向链表(仅限linux)
遇到任务就插入链表中
任务结束就销毁这个节点
查看该任务就是遍历链表
三.进程如何调度的
让我们先来一个小故事
假如你开了一把游戏,然后被分配到了一个名叫
打野的高危职业
刚开局不就,三路传来噩耗,都在ping信号请求打野爸爸支援
而在这三组信号中,上路狗头老哥最为凄惨,三分钟就只能在二塔溜达了
所以在这三组信号中
你优先选择了去gank上路
而对于中路和下路,则说
"你们先等等"
"我帮完了狗头老哥,我再来帮你们"
由这个小故事,引出了我们两个重要的概念
1.优先级 2.状态
优先级:
系统优先给谁分配时间,系统分配多少时间
状态:
这个状态描述了当前这个进程接下来应当怎么调度
就绪状态: 随时可以让CPU执行
阻塞状态(睡眠状态): 暂时不让CPU执行
让我们接着上面的小故事继续
游戏转眼之间就到了15分钟,这个时候突然屏幕右边出现了发起投降
而中下的队友也开始对你指指点点
你感觉到非常悲伤,自己明明已经这么尽力了
都帮助狗头在15分钟拆掉了对面上路水晶
为什么队友还会选择投降
结果查询gank记录
原来是自己在这15分钟,帮助了狗头114514次
就没gank过中下
导致中下通关,自家水晶前的两个门牙都被拆掉了
你也输掉了这局游戏
由这个小故事,引出了我们另一个重要的概念
这里的查询gank记录
也就是记账信息
记账信息:
统计了每个进程,都分别被执行了多久,分别都执行了哪些指令。分别都排队等了多久,目的是给进程调度提供指导依据的。
让我们接着讲上面的故事
于是打完这局游戏之后
有两个人同时加了你的好友
第一位是:上单狗头萌妹
第二位是:中单祖安沙皇
你同意了他们的好友之后,了解到
原来因为你上局游戏一直帮助和鼓励这位玩狗头的上单玩家
是个年龄18岁的大波富婆!!
这位妹妹特地邀请你今晚去她家里面玩
游戏
然后给了你,她的家庭地址
而第二位来自祖安大区的沙皇玩家
对你表示了"亲切地"问候之后
也给你留下了一个地址,表示今晚皇城PK
结果非常巧
你恰好把地址弄错了
于是你拿着七匹狼冲进妹妹的家中一顿狂揍
然后带着玫瑰花去了皇城PK
.....
由博主的一个朋友经历的这个故事的结尾
就是没有记录好每个事件对应的处理,导致出现了重大失误
由此引出了我们最后一个概念
上下文
上下文:
记录了上次进程被调度出CPU的时候,当时程序的执行状态(存档)
下次进程上CPU的时候,要可以恢复之前的状态,然后继续执行下去(读档)。
(存档位置↓)
进程被调度出CPU之前,要先把cpu中的所有寄存器中的数据都给保存到内存中
下次进程再被调度上CPU的时候,就可以从刚才的内存中恢复这些数据到寄存器中
----------------分割线------------------
以上就是进程调度的基本了,下面是额外的一些关于线程的补充
线程是什么:
轻量级进程
一个进程中可以包含多个线程,但最少得有一个线程
也就是说
进程中的线程数量>=1
为什么要有线程:
进程的创建和开销比较大,所以我们一般在一个进程里面创建多个线程来完成任务,就不必单独开创另一个进程浪费资源了
线程不管是创建,销毁,还是调度使用,他的消耗都远远低于线程
坏处:
相对于进程的独立性,如果某个进程中的一个线程发生错误,崩溃的话
有可能会把该线程所处的进程也搞崩溃
导致该进程的其他线程也崩溃