目录
课前废话
1:了解操作系统
操作系统,本质都是用来搞管理的软件,对下管理所有的硬件设备,对上要给软件提供稳定的运行环境 。操作系统 = 内核+ 配套的应用程序(内核是操作系统最核心的内容,硬件的驱动程序都是在内核中运行的,内核还需要给很多应用程序提供支持)
对下:操作系统毕竟是一个软件,不可能认识市面上的所有硬件设备,但它知道,市面上的硬件设备就那么几个大的类别,每个类别下面的硬件功能大概有哪些功能~~,当有一些特色功能的硬件设备的时候,硬件厂商就需要在开发硬件的时候,同时开发一个驱动程序(软件),专属于这个硬件设备,让操作系统,通过这个驱动程序实现对硬件设备的控制。
对上:一个计算机上可以运行多个程序,这些程序独立运行,互不干扰,试想如果某个程序出BUG后导致了其它系统也崩溃需要重启,那体验就很糟糕了。这就需要有进程隔离性,也提出了我们今天的主角进程
正课
1:什么是进程(process)
一个跑起来的程序叫进程
这是一个程序它没跑起来的时候不是进程
这些跑起来的程序叫做进程,当程序跑起来的时候都需要消耗一定的系统资源
可以看到,每个进程是系统分发资源的基本单位
2:进程在系统中是如何管理的
管理从两个角度拆分来看
1:描述,使用类/结构体把被管理的对象的属性都描述出来
系统中有一个专门的结构体,描述进程的属性,这个结构体统称为进程控制块(PCB)
使用这个PCB来描述进程的属性,一个进程可以由一个或多个PCB来描述
2:组织,使用数据结构把被描述的对象,串起来,来方便后面增删查改的处理
系统会使用类似于双向链表的结构来组织PCB,创建进程就是创建PCB并把PCB插入到链表中
销毁进程就是把PCB从链表上删除并释放
展示进程列表,就相当于是遍历链表的每个结点
3:进程的详细属性
这里要说明一点进程 != PCB,进程是包含PCB,PCB中又有许多属性包括但不限于
(1)pid:用于标识一个进程的整数值(在java中有个线程的概念,可以理解为单个PCB,一个线程中的多个PCB是共用一个pid的)
(2)内存指针(一组属性):每个进程在运行的时候,都会分配一定的内存空间,具体是在哪里,以及分配的内存空间中有哪些部分,每个部分是干啥的,都有一组(不是一个)内存指针进行区分
(3)文件描述符表:当前进程关联了哪些文件,都能操作哪些文件,都是通过文件描述符表来进行的(也就是描述了进程持有的“硬盘资源是啥样的”)
...........
4:进程的调度
早期的操作系统就只能支持单进程,就是同一时刻只能运行一个进程,运行下一个程序就会退出上一个进程,这时的系统就不需要考虑进程的调度
但是今时不同往日,单进程已经不能满足现在的需要,现在主流电脑上使用的都是多进程并发执行,并发执行靠的是进程调度实现的,而进程调度,又是使用抢占式执行的方法实现的
下面来看动图演示
(1):图中我画了两个进程
(2)进程1的PCB1在CPU上运行
(3)进程2的PCB在CPU上运行,此处发现进程2并没有等进程1的PCB调度完,就上CPU执行,可见
1:进程的调度是随机的
2:进程的调度是抢占式运行的(就是谁能强上CPU的位置,谁就可以执行,各凭本事)
(4)运行过后:
从(3)图可以想到,进程的调度既然是随机的,那么执行完多个进程的方式可能有无数种,但即使如此,因为进程的调度非常的块,我的电脑上一秒可以达到36亿次,所以人是感知不到调度的时间差的就好像,两个进程就好像是在同时进行一样
补充
当然进程的调度也不是完全随机,PCB中有个属性是进程的优先级,当一个比较重要的任务和一个不是很重要的进程同时进行的时候,系统会提高重要进程的优先级来让它尽快运行,就比如你打电脑游戏的同时开着QQ,此时系统给游戏分配的进程优先级肯定是比QQ高的,QQ可以晚几秒收到消息,但游戏卡一下可能会导致团灭。另外在代码中我们还可以通过加锁,线程等待等手段,来实现对进程调度的控制,从而来满足我们的实际开发需求
总结:
1:操作系统 = 内核+ 配套的应用程序
2:进程是系统分发资源的基本单位,PCB(java中的线程)是系统调度的基本单位
3:进程的调度是随机的,但可以通过进程优先级,代码手段来进行控制