冯诺依曼体系结构
大多数计算机采用的是冯诺依曼体系结构(就是骨架)
中央处理器 | 运算器和控制器(控制外设)组成,进行算术运算&逻辑运算 |
---|---|
存储器 | 内存(不是磁盘) |
输入设备 | |
输出设备 |
网卡:计算机没有网卡不能访问互联网,既是输入设备,又是输出设备
冯诺依曼两个重要思想:
- 所有数据采用二进制存储:机器要通电
- 数据都保存在存储器中(内存中),不用关心计算的过程
CPU只和内存打交道,写好的程序是在磁盘中的,要运行就得通过内存
- 操作系统会提前把数据加载到内存中(局部性原理)
并拿到硬件相关的数据,有需求的时候,做完决策交给驱动,驱动程序让硬件完成- 操作系统控制CPU
- 所有的硬件都是被动的完成某种功能,都要配合软件完成的(操作系统)
操作系统管理数据
- 管理的本质是对数据管理,对数据的管理转化成对数据结构的管理
- 先将管理的对象数据化,将数据结构化,一个数据结构就对应的一个算法
对操作系统需要了解的概念
操作系统用于管理计算机中软硬件资源的软件
管理=描述(创建一个结构体的过程)+组织(用算法将结构体组织起来)
- 操作系统由一堆代码组成
- 操作系统=操作系统内核(操作系统的代码的总称)+一堆应用
- 驱动程序:比操作系统更底层,直接与硬件接触
- 系统调用接口(或称系统调用函数):操作系统为程序员提供的函数
通过调用操作系统提供的函数来使用操作系统的某些功能- 库函数:对系统调用接口再进行封装
进程和程序的区别
- 程序:编译出来的可执行文件本质上就是一个文件,是静态的存储在磁盘当中
- 进程:程序运行起来后,就称为进程,是动态的,由操作系统管理
- 程序是静态的概念;
- 进程是程序在处理机上一次执行的过程,是动态的概念,一个程序可以作为多个进程的运行程序
一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合,一个作业可由多个进程组成,且必须至少由一个进程组成
进程
操作系统有四个管理模块:内存,进程,文件,驱动管理
源文件编译成exe程序,程序是文件,文件在磁盘
进程:程序代码+该进程所对应的数据结构
操作系统中存在大量的进程,操作系统对进程管理需要对进程进行描述
需要创建对应的数据结构,Linux中定义结构体task_struct类型,包含了所有的进程属性
aux=ajx
proc(process,内存文件系统)显示当前系统实时的进程信息
蓝色的数字是进程pid,也是一个文件夹
ls/proc/进程pid:
- 查看进程所有相关信息,每一个进程有cwd路径(进程当前的工作路径),exe文件路径(程序在磁盘中的路径)
- 当前路径:是当前进程所在的路径,进程启动后,进程会自己维护
这些属性都在PCB中
从操作系统内核角度看进程:
task_struct {…} ,该结构体又称为进程控制块 PCB,是操作系统调度控制程序运行的唯一实体
操作系统描述进程:
- 用到了一个结构体,名字为task_struct;
- 多一个进程就多一个task_struct结构体的对象;
操作系统组织进程:
- 多个进程是使用双向链表链接;
操作系统使用双向链表管理进程,程序要进行运行就要使用CPU,使用链表来调度
task_ struct中定义的变量:
- PID:进程号,在当前操作系统中唯一标识一个进程(等于身份证号)
- 状态: 任务状态,退出代码,退出信号等。
- PRI:进程优先级, 相对于其他进程的优先级。程序被CPU执行的先后顺序,此值越小进程的优先级别越高
- 程序计数器: 保存了进程即将执行的下一条指令(指令是汇编指令)
- 内存指针: 保存了程序地址空间的首地址
- 上下文数据: 保存了程序运行时寄存器当中的内容
- IO状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 保存了CPU使用率,内存使用率,CPU使用时长
- 其他信息
程序计数器和上下文信息是为了进程切换恢复线程时使用;
进程是抢占式进行,但是操作系统会管理这些进程。
查看进程信息:
用ps aux命令可以查看当前操作系统中的所有进程信息;
- USER:进程创建者
- PID:进程号,getpid查看
- %CPU:当前进程CPU的使用率
- %MEM:内存使用率
- VSZ:虚拟内存大小
- RSS:实际使用内存大小
- TTY:哪一个终端创建的,如果是“?问号”标识并不是任何一个终端创建的(操作系统也是一个程序,启动后是一个进程,不属于哪个终端创建的)
- STAT:进程状态
- TIME:使用CPU时间,单位分钟和秒级(时间太短则为0)
- COMMAND:进程启动命令(这个程序是如何启动的)
ps aux | grep xxx ------ 查看xxx进程的详细信息
- ps aux能查看进程信息是因为内核中维护了一个双向链表,本质上是遍历该链表,把所有进程信息罗列出来
几乎在命令行上执行所有的指令,都是bash的子进程
操作系统原理进程状态:
状态在内核中就是整数
- 运行态:
正使用CPU资源进行运算的进程, 所持有的状态
进程已经准备好了,准备随时调度
运行态不代表正在被执行- 终止态:
进程还在,只不过永远不运行,随时等待释放
因为cpu还有别的工作要做,释放进程也需要资源
申请资源,必须排队,就是PCB在排队(每一个资源都有一个等待队列)
- 阻塞态:
一个进程使用资源时,不仅仅是申请CPU资源
等待某种资源到来之后,才能进行运算
也称为等待IO- 就绪态:
所有准备资源都已准备就绪,等待操作系统分配CPU资源- 挂起态:
进程过多,内存资源不足,短期内不会被调度的进程的代码和数据还在内存中,就是在浪费空间
操作系统会把该进程的代码和数据置换到磁盘上(swap分区)
当进程访问某些其它资源(网卡磁盘等),该资源如果暂时没有准备号,或者正在给别的进程使用时
当前进程要聪runqueue中移除
将当前进程放入对应设备的描述结构体中的等待队列
这就是操作系统对进程的任务管理
当准备好后,会通知CPU
在等待外部资源时,该进程的代码不会被执行
Linux中进程状态
带+的是前台进程,不带+的是后台进程
- R:运行状态
- S:可中断睡眠状态(浅度睡眠)
可以随时被唤醒或者被杀掉
进程在CPU中运行非常快,但是使用的外设资源非常慢
正在等待外设资源
不访问外设的一般都是R
- D:不可中断睡眠状态(深度睡眠),等待磁盘资源
D是disk,磁盘睡眠状态,不能被打断
有可能睡眠状态时间远大于执行时间,所以该进程看到是永远处于睡眠状态
防止操作系统杀掉进程(磁盘给了进程反馈信息)
- T:暂停状态
该进程还存在,ctrl+z暂停,fg恢复
- t:跟踪状态(进程被暂停)trac
当进程被gdb调试时产生
- X:死亡状态:
被标志成死亡状态时,不能ps aux查询信息,该进程在被释放的前一刻才被标志为X
- Z:僵尸状态
进程退出的时候,需要将执行结果告知父进程或者OS
进入Z状态就是为了维护退出信息,可以让它俩读取
可以对代码何数据释放,但是PCB不能释放(状态信息在PCB中保存)
父进程和OS通过进程等待读取信息
main函数的返回值就在PCB中保存
kill- (信号编号) (pid) 向该进程发信号