目录
前言
1、计算机基本组成
1.1、存储器
2、操作系统
2.1、 进程(任务)的概念
2.2、进程的管理
2.2.1、进程控制块PCB(process control block)
2.3、CPU分配(进程调度)
2.3.1、并发
2.3.2、并行
2.4、进程管理(PCB)的一些属性
2.4.1、进程的状态
2.4.2、进程的优先级
2.4.3、进程的上下文
2.4.4、进程的记账信息
2.5、操作系统的常用数据结构
相信计算机相关专业的同学对冯诺依玛体系结构一定是相当熟悉吧。现代的计算机大多遵守冯诺依曼体系结构。
- 数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。由指令流调用的数据序列,包括输入数据和中间结果。
数据流是一串连续不断的数据的集合,就像水管里的水流,在水管的一端一点一点的供水,而在水管的另一端看到的是一股连续不断的水流。类比,数据写入程序可以是一段一段的向数据流管道当中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取的程序来说,看不到数据流再写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
- 指令流:机器执行的指令序列
- 控制流:是计算机执行一个程序中语句的顺序。
在计算机上的数据有三种存储方式,一种是外存,一种是内存,一种是CPU缓存。
- 外存:比如电脑上的硬盘,磁盘,U盘等都是外存
- 内存:是暂时存储进程以及数据的地方,又称为主存,是CPU能直接寻址的存储空间。
- CPU缓存:缓存就是数据交换的缓冲区,是贮藏数据(使用频繁的数据)的临时地方。当用户查询数据时,首先在缓存中寻找,如果找到了则直接执行,如果找不到,则取数据库中查找。
- 存储量:外存的最大,其次是内存,最后是CPU缓存。
- 数据的读取速度:CPU缓存 > 内存 > 外存。
操作系统的作用是控制和管理系统资源。操作系统是管理硬件与软件资源的计算机程序。
操作系统的分层试图
操作系统由两个基本功能:
操作系统是一个非常大的概念,他是一个软件,这里与我们关系最大的就是,操作系统对进程的管理。
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。
- 狭义定义:进程就是一段程序的执行过程
- 广义定义:进程是一个具有一定独立功能的程序,关于某个数据集合的一次运行活动。他是操作系统动态执行的基本单元,在传统的操作系统中,进程即是基本的分配单元,也是基本的执行单元。
下面这些被运行起来的程序可以理解为进程
进程是一个“执行中的程序”,程序是一个静态的没有生命的永久的实体,当操作系统执行他时,他才能成为一个活动的实体。我们将他称为进程。进程是一个动态的,暂时的状态变化的过程。
由上边的图可以看到,由于进程很多,所以需要管理,如果只有几个进程的话,也就涉及不到管理。
所谓的管理,分为两步:
- 描述一个进程:使用结构体/类,把一个进程有哪些信息,表示出来。
- 组织这些进程:使用一定的数据结构,把这些结构体对象放到一起(通常使用双向链表链接起来)
描述每个进程的结构体,在概念上被称为进程控制块(PCB)。
进程控制块是进程实体的一部分,是操作系统中最重要的记录行数据结构。他是进程 管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤销而撤销。
PCB进程控制块是进程的静态描述。
- 进程控制块(PCB)的属性:这里只介绍几个重要的属性,
- 程序ID:(PID:进程句柄):他是唯一的,一个进程都必须对应一个PID。PID一般是整形数字,程序ID 是每个进程的唯一标识。
- 内存指针:当前这个进程使用的内存是那一部分【进程运行的时候,使用了那些内存上的资源】
- 文件描述符表:进程每次打开一个文件,就会产生一个“文件描述符”(标识了这个被打开的文件),一个进程可能会打开很多文件,对应了一组文件描述符。把这些文件描述符放到一个顺序表这样的结构里,就构成文件描述表。【体现的是,进程运行的时候,使用了那些硬盘上的资源(使用了那些文件)】
文件:比如硬盘上存储的数据,就是以文件为单位存储的。
说到这里,可以看到进程的运行,需要从操作系统这里申请资源。我们也就能理解,进程是操作系统进行资源分配的基本单位(此处设计到的资源包括不限于内存,硬盘,CPU缓存等,这些资源在分配的时候都是以进程为单位分配的)。
概念: 需要进程调度的理由很充分,即充分利用计算机系统中的CPU资源,让计算机能够多快好省的完成各种任务。为此,可在内存中存放数目远大于计算机系统内CPU个数的进程,让这些进程在操作系统的进程调度器下,能够让进程高效(高的吞吐量--throughput)、及时(低延迟--latency)、公平(fairness)地使用CPU。为此调度器可设计不同的调度算法来选择进程,这体现了进程调度的策略,同时还需并进一步通过进程的上下文切换(context switch)来完成进程切换,这体现了进程调度的机制。
操作系统对CPU资源的分配,采用的是空间模式 —— 不同进程使在不同的时间段去使用CPU 资源。
咱们的应用程序能够运行,全依靠CPU,每个程序相当于一个二进制指令的集合,这些指令靠CPU运行。这里我们来了解一个CPU的概念(核心数)
同一时间一个逻辑处理器可以运行一个进程
以小编的电脑为例,有4个内核,8个逻辑处理器,就相当于1个人可以干两个人的活,
可以这样理解,我有4个核心,可以同时运行8个进程,在上面的进程中的图片中,这台电脑当时要处理100个进程,我这8个进程不可能同时运行100个进程。所以这里就设计到了并行和并发的概念。
一个逻辑处理器,先执行进程1,执行了一会之后,再去执行进程2,在执行一会之后,再去执行进程3 ......,此时只要这里的切换速度非常块,看起来,进程1,2,3就是“同时”执行。
同一时刻,两个逻辑处理器,同时执行两个进程,此时这两个进程就是并行执行的。
通过并行和并发的操作,虽然我们只有8个逻辑处理器,但是可以同时执行这100个进程了。
并行+并发完全是由操作系统自身控制的,程序员感知不到,所以我们吧并行+并发统称为并发。
要完成进程的调度,还是需要PCB(进程的管理)里边的一些属性,进行支撑。
可以简单认为,进程的状态主要有这两个:
- 就绪态:该进程已经准备号,随时可以上CPU执行
- 阻塞态:该进程暂时无法上CPU执行。
可以这样理解,有三个朋友A,B,C,你想出去玩,A说现在有事情在忙,无法和你出去玩;这就是“阻塞态”;但是朋友B和C没有事情,随时都可以找他们去玩,这就是“就绪态”。
进程之间的调度不是“公平”的,有的要优先调度。
比较重要的事物,优先级最高,让他先调度,先给他分配资源,优先级最低的,给他分配最少的资源。
描述了当前进程执行到哪里这样的“存档记录”,进程在离开CPU的时候就要把当前的运行的中间结果“存档”。等到下次进程回来CPU上,再恢复之前的“存档”,从上次的结果继续往后执行。
所谓上下文具体值得就是进程运行过程中,CPU内部的一系列寄存器的值
寄存器有很多种,其中最典型的作用,就是保存当前进程的执行的中间结果,包括进程运行到那一条指令。
进程离开CPU,就需要把这些寄存器的值,保存到PCB的上下文字段中,进程下次回来CPU,再把PCB中的值给恢复到寄存器中。
存档:进程离开CPU的时候,需要将寄存器中的值保存下来放到PCB上下文字段中。
读档:进程下次回来,CPU在把PCB上下文中的值恢复到寄存器中。
❗❗❗注意:这里为什么要提到将寄存器中的值保存下来???
上面说过在同一时间,一个逻辑处理器只能处理一个进程。CPU每个逻辑处理器有自己的寄存器,当一个进程运行时,这个寄存器表示这个进程的执行结果,但是当运行另一个进程的时候,他就需要表示另外一个的执行结果。所以当进程离开CPU的时候,要将寄存器当中的值保存下来。
统计每个进程,在CPU上执行了多久了,执行到那句指令了。这个就可以作为调度的参考依据。
操作系统往往使用双向链表这样的数据结构来组织PCB。
- 创建一个进程就是创建一个链表的结点
- 销毁一个进程就是把链表中的结点给删除了
- 遍历进程就是遍历双向链表。