操作系统与进程

一、操作系统

1、冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
在这里插入图片描述
截止目前,我们所认识的计算机,都是由一个个硬件组件组成,包括
输入(input):如键盘、鼠标、扫描仪、写板等
中央处理器(CPU):包括运算器和控制器
存储器(storge):指的是内存,不考虑缓存
输出(output):如显示器、打印机等

注意

  • 输入和输出统称为外设
  • 硬盘和网卡既可当作输入设备,又可当作输出设备
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设
  • 所有设备都只能直接和内存打交道
  • 不是CPU和内存的全是外设

2、为什么要有操作系统

计算机是由许多硬件组成的,每个硬件都有其特定的功能,如果没有操作系统,我们要操控计算机,程序员就必须熟知每一个硬件的功能,并且知道他是怎么操作的,我们都知道,计算机可以干很多事情,这就意味着程序员要搞明白许多硬件以及操作流程,这对程序员要求太高了,而且时间上也不允许,所以就有了操作系统,将这些繁琐的工作都交给操作系统来执行(与硬件交互、为应用程序提供一个良好的执行环境),这样,程序员就只管自己的应用软件就可以了。

计算机体系结构(硬件)

输入(input)、输出(output)、存储(storage,内存)、处理器(processor)、ALU(运算逻辑单元)、CU(控制单元)、寄存器(register)
操作系统(软硬结合部)
在这里插入图片描述
一个最简单的Hello world是如何工作的(C语言)?

刚开始的程序在硬盘中,C语言的的编译器也是一个程序,遵守冯诺依曼结构,从输入设备中把数据读到内存中,按照编译原理,将其读到CPU中进行运算,运算完了之后,就是第二个框图,再输出到输出设备上,再写回到硬盘上,得到hello.exe文件,再运行第二个,将程序加载到内存中(操作系统做的事情),CPU找到main(变换为第二个框中的相应指令)入口,开始一条一条的语句执行,ALU运算,PC是执行下一步运算指令的地址,可能会发生跳转,IR是制定寄存器,根据PC将指令从内存加载到IR上,临时存放下一条指令。在这里插入图片描述程序是如何执行的:

PC(Program Counter):指向内存中下一步要运行的指令的地址
IR(Instruction Register):存放下一个要执行的CPU指令

3、操作系统(operate system)
Windows/Linux/Unix/macOS(OSX/IOS)/Android/鸿蒙OS 软件
(1)概念
操作系统是管理和控制计算机硬件与软件资源的计算机程序,任何其他软件都必须在操作系统的支持下才能运行。操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。任何计算机都包含一个操作系统,笼统的理解,操作系统包括:内核(进程管理、内存管理、文件管理、驱动管理)和其他程序(例如函数库、shell程序等等)
(2)对操作系统的定位(如何理解OS)

  • 做“管理”的软件 硬件、进程、内存、文件,是一个管家
  • 通过记录信息并组织信息管理(数据结构)

二、进程

1、引入

(1)什么是工程(project)
编写 + 编译阶段用到的,组织代码结构、资源(图片…)结构用到
(2)什么是程序(program)
编译完成后的,运行之前的,是一个可执行的文件
(3)什么是进程(process)/ 任务(task)

  • 对操作系统来说,一个任务就是一个进程
  • 对内核来说,就是担当分配系统资源(CPU时间、内存)的实体

2、理解

有一个to do list(具体要做的指令),一个to do list 就是一个文件(程序),一个进程是要按照to do list干一次活,进程是程序的一次执行过程,可以同时起多个任务/进程(程序运行期间就是一个进程)

例如,张三去银行办理转账业务,就要使用银行的资源(接待、转账人员、银行电脑等等),为张三完成转账,在银行内部,这一整套过程的执行,就称为办理业务。类比,一个程序刚开始是在计算机的硬盘上,要执行该程序,要对他进行加载运行,这一整套过程就叫做一个进程。
所以,进程是具有动态特性的,当张三办理转账业务时,任务一直存在并且状态一直是更新的,而张三办理业务,也不是刚去就可以办理,如果前面有人,还需等待,所以就有了进程等待队列,而张三抽到的号,可以称为进程id

3、时间片

操作系统大多都支持多任务,否则也太慢了吧。
操作系统的任务调度是采用时间片轮转的抢占式调度方式,也就是说,当一个任务执行一小段时间后暂停去执行另外一个任务,每个任务轮流执行,任务执行的一小段时间叫作时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行另外一个任务,被暂停的任务处于就绪状态等待下一个属于他的时间片的到来。因为计算机的速度是非常快的,所以我们看不到这个过程,感觉多个任务同时执行,也就是我们所说的并发。

4、对时间片的理解

假设张三准备办理转账业务,但当他把所有资料给工作人员之后,工作人员告诉他,你现在办理不了,因为他现在需要填写一张申请表,此时,工作人员将他的资料保存起来,让他去一边填写资料,填写完毕之后,再回来继续办理,同时,张三去填表了,而工作人员继续给别人提供服务。这个过程叫做进程切换。张三表填完了,继续回到柜台,工作人员拿出他之前的资料,继续给张三办理业务,这叫做进程的上下文保护与恢复(想想,为什么要这么做?因为进程的运行是在CPU上的,CPU有寄存器,保存的是进程运行的各种临时数据,为了达到切换和便于恢复的目的,就有了将CPU寄存器保存和恢复的做法,归根结底是为了接着上次的位置继续运行)。后来,银行出台了规定,每个人在柜台办理任务的时间不能超过10分钟(以防止其他人长时间等待),所以为了更好的服务各个人员,银行工作人员将上面的切换与恢复的思路应用到各种业务中,所以长期来看,即便只有一个工作人员,也能同时服务多个客户,这种机制叫做基于时间片的进程轮转管理机制,而上面的10分钟,就是银行轮转的时间片,只要时间到了,客户酒的下去等待,让其他用户来办理业务而上面的所有轮转与管理工作,在操作系统中,统一由一个叫做调度器的内核模块完成,而对每个人来说,在一段时间之内,可能所有人的业务都得以推进(即便没完成),而不至于大家长时间等待,这种机制就叫做并发;如果银行财大气粗,工作人员比客户都多,那就好办了,一人一个工作人员,所有的任务真正同时处理,这种机制叫做并行
5、并发与并行

  • 并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

  • 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。

并发是假同时,并行是真同时

6、用户态和内核态
以上面张三去银行办理业务为例,张三自己填表申请、等待等等自己做的这些事情被称为用户态,是用户的权限最低,而张三到窗口托付银行人员为他办理相关手续,银行人员这个状态被称为内核态,权限最高,直接控制硬件的底层软件。
在这里插入图片描述
7、进程中的上下文
(1)上下文简单来说就是一个环境,进程在时间片轮转切换时,由于每个进程运行环境不同,就涉及到上下文不同环境之间的切换。
(2)就是一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。
(3)切换时需要保存当前进程的所有状态,即保存进程的上下文,以便再次执行的时候,能够恢复切换时的状态,继续执行。

8、进程状态

就绪:进程处于可运行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态(排好队了)
阻塞:进程不具备运行的条件,正在等待某个事件的完成
运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态。

解释了这么多进程的有关概念,我们对进程有了一个大概的认识,为了让大家更好地了解进程,接下来带着大家一起学习一下进程的一些基本属性,以下代码纯属伪代码,是帮助理解的,不要纠结代码的正确性哦!

9、进程的属性

(1)基本信息

  • pid(process id)
  • 用户/名称/关联的程序文件/…
  • 状态

(2)运行信息

  • pc/数据地址/代码地址/资源信息(打开的文件等)

(3)记账信息

  • 什么时候开始运行(实际运行时间)
//PCB(Process Control Block)用来记录进程信息
//纯属伪代码
class PCB{
    int pid;//编号
    State state;//状态(正在运行等等)
    Priority priority;//优先级(进程是有优先级的,哪个先执行,哪个后执行)
    address dataZone;//数据区
    address codeZone;//代码区
    long startAt;//什么时候开始的,记账信息 
}

程序的启动过程(如何从程序变为进程)
双击程序(exe)进行启动


OS:
1.找到文件
2.检查文件是否合法(exe,一种指令格式)
3.创建一个PCB对象----描述

PCB pcb = new PCB();

4、为进程分配一个唯一的pid(相当于银行的抽号)
5.把程序文件按照指定格式加载到内存中
6.把PCB对象和之前加载的内容进行关联

pcb.pc = pc;
pcb.dataZone = dataZone;

7.填充基本的记账信息

pcb.startAt = System.currentTime();

8.把PCB放到几个相关的数据结构中(组织)

class 模拟OS{
    private Queue<PCB> processQueue;
    private LinkedList<PCB> processList;
    private Map<Integer,PCB> map;
    
    processQueue.push(pcb);
    processList.add(pcb);
    map.put(pcb.pid,pcb);
}

为什么进程放到队列里面就真正运行起来了?

登记处就是一个PCB对象(描述)
登记处上面是所有的pcb对象,根据pid找到指定的pcb对象,把自己放到队列里边,按照先来先服务或者优先级队列服务,总有一次被执行,只需将自己放到数据结构中,总会执行到自己
操作系统管理其实就是各种数据结构在管理

进程启动的一个演示
在这里插入图片描述
常见的发生进程切换的场景:

1、有一个更高优先级的进程进来------抢占式OS
2、任务完成(进程结束)
3、每个进程都事先分配好时间片,时间到达后切换
4、当前进程正在等待一个外部事件(阻塞)

发布了32 篇原创文章 · 获赞 6 · 访问量 820

猜你喜欢

转载自blog.csdn.net/Beverly_/article/details/102887867