冯诺依曼体系结构
- 大多数的计算机、服务器等都遵循冯诺依曼体系结构
-
存储器用于快慢设施之间的缓冲作用,进步零碎的效率(内存能够事后装载数据)
- 解决数据时,必须先将数据预装载到内存中(一次性装载多条数据,由操作系统实现)
- 在硬件和数据层面上:CPU 只和内存进行交换,外设也只与内存进行交换。
- 寄存器不仅只存在于 CPU 中,其余的外设中也存在。
- 各硬件之间是用总线进行链接(IO 总线、系统总线)
操作系统概念
- 操作系统本质上是一款专门搞治理的软件。
- 操作系统包含内核(过程治理、文件治理、驱动治理)和其余程序(库函数、shell 程序等)
过程管制块 PCB
- PCB:为了便于零碎形容和治理过程的运行,内核为每个过程专门创立的一个构造体对象。(一个 PCB 对应一个过程)
- PCB 是过程实体的一部分,用于存储过程所需的所有信息。
- CPU 在执行过程时,是找的 PCB,再通过 PCB 去调用程序代码和数据。
- Linux 中 PCB 的构造体是 struct task_struct{}
- 零碎中 PCB 是采纳双链表的模式链接起来的。
-
PCB 次要存储的信息:
- 标示符:形容此过程的惟一标示符,用于辨别其余过程(PID 等)
- 状态:休眠状态 S、运行状态 R
- 如果过程是前台运行时,则会标识为 R+
- 如果过程是后盾运行时,则会标识为 R
- 优先级
- 程序计数器(PC 指针):保留程序中行将被执行的下一条指令的地址。
- 内存指针:程序代码和过程相干的数据指针,和其余过程共享的内存块指针
-
上下文数据:过程执行时处理器的寄存器中的数据。
- 例如:以后过程被打断,去执行另一个过程,当另一个过程执行完后要如何回到之前过程被打断的地位呢?上下文数据就是用来保留这类数据。
- 上下文数据是保留在 PCB 中的。
- IO 状态信息
查看存储过程信息的文件
- 过程信息能够通过 /proc 零碎文件夹查看(文件夹的名称就是该过程的 PID)
过程状态
过程的 5 种状态
- 就绪态 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(导入新的全局的环境变量)
main 函数带的参数(argv、argv、envp)
- argc:命令行参数个数
- argv:命令行参数列表
- envp:环境变量
过程地址空间
- 留神:过程地址空间不是理论的物理内存,而是映射出的虚拟地址(不同过程的虚拟地址是雷同的,然而理论映射的物理内存是不同的地址)
- 每个过程都有本人的过程地址空间和对应的页表(用于示意映射关系)
- 过程地址空间本质是物理内存中的一种内核数据结构(mm_struct)
应用过程地址空间的劣势
- 防止了野指针的呈现(野指针在页表中没有映射)
- 防止零碎级别的越界拜访,页表只会映射以后过程的物理内存,不会映射到其余地址。
- 对立过程的排布,即所有过程在过程地址空间中排布形式都是雷同的,并且空间范畴也是雷同的。
- 每个过程都相当于独立进去的,更好的实现过程独立及正当应用内存空间。