文章目录
- 冯·诺伊曼结构
- 操作系统
- 什么是程序?什么是进程?
- 操作系统是如何来管理进程的?
- PCB(struct task_struct{...})
冯·诺伊曼结构
- 冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成:输入设备、存储器、运算器、控制器、输出设备,这套理论被称为冯诺依曼体系结构
- 输入输出设备统称IO设备:负责数据和程序的输入输出
- 存储器:存储程序和数据,指内存,所有的数据都是采用二进制进行存储,运算产生的数据都是存储在内存当中
- 中央处理器:由运算器和控制器组成,运算器负责数据按照程序的处理办法进行计算,控制器控制程序的逻辑,一个CPU在同一时刻只能计算一份数据
操作系统
- 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),操作系统 = 操作系统内核 + 一堆应用,操作系统内核:也是代码程序,这些代码完成进程管理、内存管理、文件管理、驱动管理等,一堆应用是指依附在操作系统内核上完成某些功能,比如微信等应用
- 操作系统管理计算机的软硬件资源,硬件资源包括:CPU、内存、硬盘、网卡、显示器等等;软件资源包括:进程资源、驱动程序等
- 操作系统通过管理来完成对计算机软硬件资源的管理,管理 = 描述(结构体) + 组织(串连起结构体),从代码的角度理解,描述就是结构体,组织是通过链表的方式完成的
- 操作系统提供的函数,被称为系统调用函数,这些函数在库函数中被调用
什么是程序?什么是进程?
- 程序:源代码经过编译产生的可执行文件,这个文件是静态的
- 进程:程序运行起来的实例,是动态在运行的;进程是能独立运行、独立获得资源、独立接受调度的基本单位
操作系统是如何来管理进程的?
- 进程的管理 = 描述(PCB) + 组织的方式(链表)
- PCB是进程控制块:在操作系统中,用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识,这意味着一个进程的存在,必然会有一个PCB,如果进程消失了,那么PCB也会随之消息;不同的PCB通过链表组织起来
PCB(struct task_struct{…})
-
机器中的进程数量远大于CPU数量,而且一个进程想要向后执行自己的代码,必须拥有CPU进行计算(执行代码),那进程是如何获得CPU资源的呢?操作系统调度进程获取资源,它有自己的调度策略:先来先服务、短作业优先、长作业优先、高优先级优先、时间片轮转
-
从CPU的角度来理解,进程的状态可以分为三种:就绪/运行/阻塞
-
- 运行:进程占用CPU,并在CPU上运行,即进程正在使用CPU来执行自己的代码
- 就绪:进程已经具备了运行的条件,但还没有被分配CPU,可以理解为进程已经将运行前的准备工作全部做好了,万事俱备,只欠被操作系统调用,占用CPU资源了
- 阻塞:进程因等待某件事的发生而暂时不能运行(就绪),例如:等待IO输入、调用某些阻塞接口
-
状态间转换
-
进程是抢占式执行,在计算机中,进程多的情况是常态,操作系统在调度的时候要做到雨露均沾,让每一个进程都能运行上,但是操作系统在调度的时候,是从就绪队列当中获取进程,进行运行,也就是说,哪个进程准备好了,就绪了,原则上就可以调度谁,所以进程为了自己可以被执行,都是抢占式执行,不会互相谦让。这种狼多肉少的状态,也是进程有不同状态的原因之一
并发:多个进程在一个CPU下,采用进程切换的方式,各自独占CPU运行各自的代码,交替运行,让多个进程都得以被推进,称为并发(多个岔路要汇合到主路,各车道交替进入)
并行:多个进程在多个CPU下,同时运行各自的代码,称为并行(车道足够,各进程跑在各自的车道上)
在一个多核CPU的机器当中,并发和并行是同时存在的
-
细分的进程状态
-
- R:运行状态,处于R状态 ,有可能在执行代码,有可能在就绪队列中等待
- S:可中断睡眠状态,进程正在睡眠(被阻塞),等待资源到来被唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列
- D:不可中断睡眠状态,通常等待一个IO结束
- T:暂停状态(ctrl+z),ctrl+z暂停一个进程 ;ctrl+c可终止一个进程
- t:跟踪状态,调试程序的时候可以看到
- X:死亡状态,我们用户看不到,在PCB被内核释放的时候,进程会被置为X,紧接着进程就退出了
- Z:僵尸进程
-
程序计数器:保存程序下一条执行的指令
-
上下文信息:保存寄存器当中的内容。在多进程的系统当中,操作系统调度进程,获取CPU之后,进行现场恢复,继续执行后面的代码
-
上下文切换:Linux是多任务的操作系统,它的进程数远大于CPU数,它能支持远大于CPU数量的任务同时运行,但实际上同一时刻只会有CPU数量的进程在运行,等CPU时间片到了之后,进程调度器就会把CPU资源分配给其他进程,在这个过程就涉及到了进程之间的切换,这时候就需要把当前进程的上下文信息保存下来,随后加载被调度进程的上下文信息,这就是上下文切换。
上下文信息既包括虚拟内存、栈、全局变量等用户态的资源,也包括内核堆栈、寄存器等内核态的资源,不同类型的上下文切换,会涉及到不同类型资源的切换,例如:同一进程不同线程的切换,只需要切换内核态的资源,而不需要切换用户态的资源
上下文切换的类型:进程上下文切换、线程上下文切换、中断上下文切换
-
PCB是描述一个进程的数据块,在内核中对应struct task_struct{…}中的代码,我们列举一小部分其中的内容:进程标识符(进程号)、进程状态、程序计数器、上下文指针、内存指针、记账信息(使用CPU时长,占用内存大小)、IO信息(保存进程打开文件的信息)