目录
1.进程是由操作系统创建及管理
操作系统:其实就是一款"搞管理"的软件.
主要管理 1.硬件设备 2.软件资源.
所谓"管理",其实就是两个方面 '描述 + 组织'.
那么进程在操作系统中是如何被管理的呢?
管理 = 描述(PCB) + 组织
PCB:进程控制块(这是一个类或者C语言中的结构体,一个结构体对象就对应一个进程).
组织:常见的是使用双向链表来组织.
创建一个进程,本质上就是创建一个PCB对象,加入到内核的链表中.
销毁一个进程,本质上就是把这个PCB对象从内核链表中删除掉.
查看进程列表,本质上就是遍历操作系统内核中的这个链表,并显示其中的属性.
那么进程的PCB中大概都有哪些属性呢?
pid:一个进程的身份标识(类似于数据库的主键),一台机器同一时刻不可能有两个进程的pid相同.
内存指针:进程内存地址,描述了这个进程使用的内存空间是哪个范围.
文件描述符表:描述了这个进程都打开了哪些文件(系统中打开一个文件,其实就得到了一个"文件描述符",这个文件描述符就像一个"遥控器"一样,文件数据是在磁盘上的,代码中操作磁盘数据不像操作内存数据那么方便,所以往往是借助这种"遥控器"的方式来操作...)
进程的状态 ----|
进程的优先级 ----|
进程的上下文 -- |-- 这几个属性是用来辅助进行进程调度的,下文我们将具体介绍.
进程的记账信息--|
2.进程调度
我们知道进程要想运行,需要在CPU上运行(由CPU运行进程上的指令),但是计算机上会有上百个进程在运行,CPU的数量却很少.
而我们当前所使用的系统都是支持"多任务"的系统,什么是多任务系统,例如我们可以同时打开QQ音乐,画图版,浏览器等多个程序.这是怎么做到的呢?
其实这个多任务系统就是基于"进程调度"这样的机制来完成的.
操作系统运行进程的方式
并发式执行: 举个栗子: 假设CPU是一个漂亮的小姐姐,因此就会有许多追求者,正常的话,CPU只能与一个小哥哥进行交往,但是CPU比较贪心想同时和多个小哥哥进行交往,那该怎么做呢?
其实很简单,可以安排一个时间表,周一早上和小哥哥A出去玩,周二下午和小哥哥B出去玩,周三早上和小哥哥C出去玩...只要安排好这个时间表,这几个小哥哥就不知道对方的存在了~
从宏观上来看(一年这样的时间维度):CPU是同时再和三个小哥哥(进程)交往.
从微观上来看(一天这样的时间维度):CPU同一时刻只是和一个小哥哥进行相处.
在操作系统中,一个CPU会一直在切换运行不同的进程,但由于其运行速度极快,使用电脑的用户就无法感知到这个切换过程的.
并行式执行:多个CPU运行多个进程,CPU1运行进程1,CPU2运行进程2.
进程1和进程2无论是宏观上还是微观上都是同时执行的.
真实的操作系统在进行进程调度的时候,是并发和并行两种策略综合使用的.
进程的状态:
1.就绪状态:进程以及准备好除CPU外的所有必要资源,只等待CPU时的状态(三个小哥哥都已经安排好了自己的时间随叫随到).
系统会将多个处于就绪状态的进程排成一个就绪队列.
2.执行状态:进程已经获取CPU,正在执行.
3.阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行的状态.
进程的优先级:
安排时间表的时候,优先给谁安排,安排更多的时间.
例如:CPU这个小姐姐一周有12块时间,这12块时间不一定时均匀分配给三个小哥哥的.
最喜欢A就给A分配6块时间,其次喜欢C就给C分配4块时间,最不喜欢B(只是图他的钱)就给B分配2块时间.
这几个小哥哥(进程)谁优先级(喜欢程度)最高,谁就很可能获得更多拥有小姐姐(CPU)的时间.
进程的上下文:
需要记住上次运行到哪个进程的哪一个指令,方便下次调度到这个进程的时候可以快速定位到上次运行的位置继续运行.
类似于读档和存档.
进程本身也是感知不到自己什么时候被调出CPU的.
进程的记账信息:
记录这个进程在CPU上执行了多久了,用来辅助决定这个进程是继续在CPU上运行还是说要被调度出去了.
以上就是关于进程调度的一些基本信息.