前言:
在计算机中cpu就像一座工厂,这个工厂里面有许多的车间,但是假如工厂的电力有限,一次只能供给一个车间使用,也就是说当一个车间在进行工作的时候,其他车间是不能工作的(单个cpu只能运行一个任务),进程就想是车间,它代表一个cpu所能处理的单个任务。任一时刻,cpu总是运行一个进程,其他进程处于非运行状态。同时在一个车间里面,还有很多工人,他们协同去完成一个任务。线程就好比一个车间里面的工人。一个进程中可以有多个线程。车间的空间是共享的,比如许多房间允许工人进出,这象征了一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
但是因为不同的房间大小不一样,有些地方只能容纳一个人,比如厕所,里面有人其他人就不能进出,只能等前面人出来了,后面的人才能进去,解决办法就是,在门口上加一把锁,前面的人在使用厕所的时候,把门锁上,不允许其他的人来使用,后面的人看到了上锁就自动排队,当使用完了之后,把锁打开,后门的人才能进去这叫“互斥锁”(后面会详细说明),防止多个线程同时读取同一块内存区域。
但是又有些地方能容纳n个人(n>1),比如厨房,这时候的解决办法就是在门口挂n把锁,每进去一个人,就拿钥匙关闭一把锁,出来时,就把钥匙放回原处,当钥匙空了,后面的人就排队等。这种做法叫“信号量”,用来保证多个线程之间不会互相冲突。
进程:
1.进程的含义:
操作系统中的重要概念:一个运行起来的程序。
定义:进程是一个具有一定独立功能的程序在一个数据集合依次动态执行的过程。进程是一个正在执行的程序实例,其中涉及到程序计数器,寄存器和程序变量的参与(在cpu上)。
2.进程的特征:
1.进程是依赖于程序运行而存在的,进程是动态的,而程序是静态的。
2.进程是操作系统进行资源分配和调度的一个独立单位。
3.每个进程都有独立的地址空间,包括代码区,数据区,堆栈区。进程之间的地址空间隔离的,互不影响
3.在操作系统的视角里,如何管理这么多的进程呢?
1.对进程进行描述:
我们可以用结构体,描述出进程的核心属性(进程的状态,进程的优先级,进程的上下文,进程的记账信息)
进程控制块(PCB):非常大的结构体,有很多的属性。
2.将多个进程组织起来:
比如:可以使用链表一样的形式(不一定是链表),把多个PCB串到一起。
1)创建一个新的进程
1.创建一个PCB,初始化PCB中的各个属性。
2.再把PCB加到链表上
2)销毁一个进程:
把这个进程的PCB在链表中找到,并从链表中删除。
3)查看进程列表:
遍历链表,取出链表中的每一个元素,把里面的关键元素显示到屏
单任务和多任务:
在早期的计算机中,是“单任务”操作系统:
同一时刻,只允许一个进程,要想运行下一个进程,就要结束上一个进程。
多任务系统:(在多核处理器前,多任务系统就有了)
即使cpu只有一个核心,也能“同时”运行多个进程。这里有一个新的概念:分时复用。
*分时复用:
分时复用:把一个单位时间,分成很多份
第一份时间运行进程1的指令
第二份时间运行进程2的指令
这里的指令是前面提到的PCB中的内存指针(需要知道进程执行到哪了)
因为cpu运行速度足够快,上述的切换过程,也会很快,会超出我们人类的反应时间,所以我们看起来这些进程是“同时执行”的(但是如果进程也很多,就会增大cpu的消耗资源,就会出现卡顿的情况)
并发执行:
我们把单个cpu核心,按照分时复用,执行多个进程,这样的方式,称为“并发执行”。
人看起来是同时执行的,微观上,其实是一个cpu在串行执行,切换很快。
但是如今cpu中,并不只有一个核心,而是有多个核心,所以不同的核心,在不用分时复用的情况下,也能同时执行多个不同的进程
我们把多个cpu核心,同时执行多个不同进程的这样方式,称为“并行执行”也是“同时执行”。
但在cpu中,执行进程的时候,并发和并行是同时进行的。既有并发执行也有并行执行,统称为“并发”
1.PCB中的一些关键要点:
1.Pid(进程id):进程的身份标识符。
2.内存指针:进程就需要知道执行的指令在哪,指令依赖的数据在哪。
3.文件描述符表:进程运行过程中,很多时候,需要和一个硬盘这个硬件设备进行交互,硬盘上的数据就是以文件形式来组织的。(进程每一次打开一个文件,就会把这个文件的信息保存到文件描述符表中)
2.PCB进一步属性:
4.进程的状态
5.进程的优先级
6.进程的上下文
7.进程的记账信息
4.进程的状态:
进程状态有两种:1.就绪状态,2.阻塞状态
1.就绪状态:随叫随到,此时进程随时都能到cpu上进行执行(不区分就绪和执行,都是就绪)
2.阻塞状态:进程当前不适合当cpu去执行
5.进程的优先级:
在很多进程中,它们能够到cpu上面执行的机会并不是均等的。有的进程优先级会更高一些,吃的资源就会更多。
6.进程的上下文:
因为进程在cpu执行的时候是“并发执行”。所以进程在调度的时候,一个进程执行一会,会失去cpu资源,过一段时间该进程还会回到cpu上去执行。
但是有了进程的上下文,就会沿着上次执行到的状态,继续往下执行(非重头开始执行)
进程在cpu中运行的过程中:
cpu上的各种寄存器,就表示了当前进程运行的“中间状态”
保存上下文:将cpu中的这些寄存器中的值保存在内存中(PCB对应的属性中)
恢复上下文:把PCB刚才保存的属性,填回到对应的cpu寄存器中。
7.进程的记账信息:
进程的记账信息(统计功能):统计每个进程都在cpu中运行了多久。
当发现一个进程很长时间没有吃到cpu资源了,就会给这个进程倾斜一些资源。
进程调度:
1.进程调度主要是决定将CPU资源分配给哪个进程使用。当系统中有多个进程处于就绪状态情况下(已经准备好运行,只是等待CPU资源),进程调度器会按照一定算法,来选择一个进程在CPU上运行。
2.每个进程在创建时都会生成对应一个PCB,PCB是进程调度器的基础,通过管理和控制进程的PCB,操作系统能够对进程进程调度,合理利用CPU资源,提高系统性能。
3.后面即将提到的线程调度也是如此。