冯诺依曼体系结构
- 大多数的计算机、服务器等都遵循冯诺依曼体系结构
- 存储器用于快慢设备之间的缓冲作用,提高系统的效率(内存可以预先装载数据)
- 处理数据时,必须先将数据预装载到内存中(一次性装载多条数据,由操作系统完成)
- 在硬件和数据层面上:CPU只和内存进行交流,外设也只与内存进行交流。
- 寄存器不仅只存在于CPU中,其他的外设中也存在。
- 各硬件之间是用总线进行链接(IO总线、系统总线)
文章图片
- 操作系统实质上是一款专门搞管理的软件。
- 操作系统包括内核(进程管理、文件管理、驱动管理)和其他程序(库函数、shell程序等)
- PCB:为了便于系统描述和管理进程的运行,内核为每个进程专门创建的一个结构体对象。(一个PCB对应一个进程)
- PCB是进程实体的一部分,用于存储进程所需的所有信息。
- CPU在执行进程时,是找的PCB,再通过PCB去调用程序代码和数据。
- Linux中PCB的结构体是 struct task_struct{ }
- 系统中PCB是采用双链表的形式链接起来的。
- 【进程概念】PCB主要存储的信息:
- 标示符:描述此进程的唯一标示符,用于区分其他进程(PID等)
- 状态:休眠状态S、运行状态R
- 如果进程是前台运行时,则会标识为 R+
- 如果进程是后台运行时,则会标识为 R
- 优先级
- 程序计数器(PC指针):保存程序中即将被执行的下一条指令的地址。
- 内存指针:程序代码和进程相关的数据指针,和其他进程共享的内存块指针
- 上下文数据:进程执行时处理器的寄存器中的数据。
- 例如:当前进程被打断,去执行另一个进程,当另一个进程执行完后要如何回到之前进程被打断的位置呢?上下文数据就是用来保存这类数据。
- 上下文数据是保存在PCB中的。
- IO状态信息
- 进程信息可以通过 /proc 系统文件夹查看(文件夹的名称就是该进程的PID)
文章图片
- 就绪态R :等待被运行。(等待CPU调度)
- 运行态R :正在运行。(占用CPU)(运行态包含就绪态,所以运行态可以同时有多个)
- )僵尸态Z :父进程还在运行,子进程结束还未被回收时,子进程相关信息任然被保存着。
- 等待态(休眠态)(浅度睡眠 & 深度睡眠):等待一定条件进入就绪态,等待态下即使给它CPU也无法运行。
- 浅度睡眠S:等待时可以被唤醒(即使没有等到某个条件,收到信号也可以被唤醒)
- 深度睡眠D:等待时已经不能被唤醒了,只有等到某个条件才能自动唤醒(收到信号也不能被唤醒),并且该进程不能被杀死,即使是操作系统也不行。
- 停止态T :进程只是被暂时停止了,还是可以恢复的(不是进程结束了)
- 死亡态X :进程死亡,这个状态只是一个返回状态,任务列表中是看不到这个状态的。
- 子进程先于父进程结束。子进程已经结束了,但是父进程还未帮子进程收尸(即父进程没有读取到子进程退出时返回的代码),这一个子进程就被称为僵尸进程。
- 回收僵尸子进程方法一:
- 父进程可以通过使用wait或waitpid来显示回收子进程,并且获取子进程退出的状态。
- 回收僵尸子进程方法二:
- 父进程自己结束时,会自动回收子进程的资源。
- 父进程先于子进程结束,此时子进程就变成了孤儿进程。
- Linux系统规定:所有的孤儿进程都自动成为一个特殊进程(进程1,也就是init进程)的子进程。
- Linux中可以使用 ps -la 显示系统进程PID和优先级
- Linux中实际优先级 = PRI + NI (在执行这个算法时,PRI一直都是最初始的优先级)
- PRI 代表这个进程的优先级,值越小越先执行。
- NI 代表这个进程的 nice 值(它是优先级的修正值,取值范围 -20 ~ 19,默认为0)
- 所以调整进程优先级是调整 nice 值。
文章图片
优先级的更改
- 终端中使用命令 sudo top 进入更改状态
- 进入top后按 r 进入输入状态
- 输入进程PID 然后回车
- 再输入新的 nice 值即可
- 竞争性:CPU资源很少,而进程较多,所以进程之间是具有竞争性的,为了高效完成任务,合理分配资源,于是有了优先级。
- 独立性:多进程运行是相互独立的,独享各种资源,进程之间互不干扰。
- 并行:多个进程在多个CPU下同时运行。
- 并发:多个进程在同一个CPU下采用进程切换的方式,让多进程在宏观上实现同时运行。
- 环境变量实质就是一个系统级别的全局变量。
- PATH:指定命令的默认搜索路径
- 将路径导入PATH环境变量: echo PATH=$PATH: 路径
- HOME:指定用户的主工作目录(即用户登录到Linux时进入的默认目录)
- echo $环境变量 (查询相关环境变量)(echo $? 返回最近一次程序执行后的返回值)
- env (显示所有环境变量)
- unset (删除环境变量)
- set (显示本地定义的 shell 变量和环境变量)(本地变量只在本进程中有效)
- export (导入新的全局的环境变量)
- argc:命令行参数个数
- argv:命令行参数列表
- envp:环境变量
文章图片
- 注意:进程地址空间不是实际的物理内存,而是映射出的虚拟地址(不同进程的虚拟地址是相同的,但是实际映射的物理内存是不同的地址)
- 每个进程都有自己的进程地址空间和对应的页表(用于表示映射关系)
- 进程地址空间实质是物理内存中的一种内核数据结构(mm_struct)
文章图片
- 避免了野指针的出现(野指针在页表中没有映射)
- 避免系统级别的越界访问,页表只会映射当前进程的物理内存,不会映射到其他地址。
- 统一进程的排布,即所有进程在进程地址空间中排布方式都是相同的,并且空间范围也是相同的。
- 每个进程都相当于独立出来的,更好的实现进程独立及合理使用内存空间。