【操作系统】知识总结集锦

冯诺依曼体系

输入单元、存储器、输出单元、运算器、控制器
外设(输入单元、输出单元)传输数据的时候必须先写入存储器。
冯诺依曼规定了硬件层面上的数据流向。
存储器是CPU和所有外设的缓存。
CPU并不和外设打交道。(数据层面)
外设只和内存打交道。(数据层面)

操作系统

任何计算机系统都包含一个基本的程序集合,称为操作系统。
笼统的理解就是:操作系统 = 内核(进程管理、内存管理、文件管理、驱动管理)+其他程序(函数库、shell程序等)
操作系统:进行软硬件资源管理的软件。
管理的本质:先描述,再组织

举例:
校长(操作系统)(管理者)
辅导员(驱动)(执行者)
学生(软、硬件)(被管理者)

计算机管理硬件:
1、描述起来,用struct结构体
2、组织起来,用链表或其他高效的数据结构
为什么要有操作系统:
1、可以减少用户使用计算机的成本
2、对下管理好所有的软硬件,对上给用户提供一个稳定高效的运行环境
操作系统不信任任何用户,任何对系统硬件或者软件访问,都必须通过操作系统。
计算机体系是一个层状结构,任何访问硬件或者系统软件的行为,都必须通过操作系统接口,贯穿操作系统进行访问操作。

进程

操作系统对进程的管理转化成为了对进程信息的管理,先描述再组织。对进程的管理——>双链表的增删查改!
进程控制块(PCB) task_struct(进程属性的集合)
进程 = 你的程序 + 内核申请的数据结构(PCB)
命令ps查看进程
每一个进程都有自己的PID

优先级:本质是在资源有限的前提下,确立谁先访问资源,谁后访问的问题。

CPU核心工作流程:
1.取指令
2.分析指令
3.执行指令
cpu中存在一个eip寄存器:保存当前正在执行指令的下一条指令的地址。

1.进程放在CPU上之后,不是一直在运行直到进程运行结束。每个进程都有一个运行时间单位:时间片。
2.一般进程让出CPU:
a.来了一个优先级更高的进程(操作系统必须支持抢占)
b.时间片到了
3.单CPU、单核:跑起来多个进程,通过进程快速切换的方式,在一段时间内,让所有的进行代码都得到推进,并发!
4.多CPU、多核:任何时刻,允许多个进程同时执行,并行!

上下文数据:进程在CPU上运行,会有很多寄存器上的临时数据。

当一个进程在运行中,因为某些原因(时间片到了),需要被暂时停止运行,让出CPU。需要进程保存自己的所有的临时数据。
临时数据:当前进程的上下文数据
保存的目的是为了恢复

进程切换:当一个进程在运行中,因为某些原因(时间片到了等),需要被暂时停止运行,让出CPU。供其他进程在CPU中运行,就这样循环进行下去整个工作。

CPU只看PCB(一个个PCB组成了运行队列)

fork创建子进程:
fork之后创建子进程,父子共享用户代码(只读的,不可以修改或者写入),而用户数据各自私有一份(不让进程相互干扰,写时拷贝)。

从内核角度看,fork之后,系统多了一个进程。创建子进程,通常以父进程为模板,其中子进程默认使用的是父进程的代码和数据(写时拷贝)。

操作系统中,所有进程之间具有独立性。

fork有两个返回值,给子进程返回的是0,给父进程返回的是子进程的PID。

进程在运行队列中,就叫做R状态(准备好了,可以被调度)。
S:休眠状态(浅度休眠):对外部事件可以做出反应。
D:深度休眠:不可以被杀死,即便是OS。只能等待D状态自己醒来或者关闭。
T:停止状态
Z:僵尸状态
X:死亡状态

进程退出的时候,会自动将自己退出时的相关信息,写入进程的PCB中(僵尸状态),供OS或者父进程来进行读取!读取成功后,该进程才算真正的死亡(死亡状态)。

当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
僵尸进程不解决的话会产生内存泄漏。

父进程先于子进程被回收之后就会产生孤儿进程。

1号进程就是systemd(操作系统)

优先级:一定能得到某种资源,得到某种资源的先后顺序。
权限:决定能不能得到某种资源。
为什么会有优先级?本质是因为资源有限(CPU)。

Linux的优先级由pri和nice值共同决定!
优先级的数值越小,优先级越高;
优先级的数值越大,优先级越低。
不可能一味的高或者低,OS的调度器也要适度的考虑公平问题。避免“饥饿问题”。
nice值就是优先级的修正数据:【-20,19】
PRI(new) = PRI(old) + nice

在Linux系统中,标识一个用户,并不是通过用户名标识,而是通过用户的uid(计算机比较善于处理数据)。

环境变量

环境变量:指在操作系统中用来指定操作系统运行环境的一些参数。
PATH:辅助系统进行指令查找!指定命令的搜索路径。
方法:
1.将自己的可执行程序添加到系统路径下
2.将自己的当前路径放入PATH当中
HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
SHELL:当前shell,它的值通常是/bin/bash。
查看环境变量的方法:echo $NAME //NAME:你的环境变量名称
获取环境变量使用getenv(“环境变量名字”)
在命令行上运行的大部分的指令,它的父进程都是bash。
命令行中,我们可以定义两种变量:
1、本地变量:只能够在当前shell命令行解释器内被访问,不可以被子进程继承。
2、环境变量:可以被子进程继承。
使用export可以将本地变量转化成环境变量。
env:只查看环境变量。
set:即可以查看本地变量,也可以查看环境变量。
unset:清除环境变量。
内建命令(echo、env、set等):shell程序内部的一个函数
为什么存在命令行参数?
帮助我们设计出,同一个程序,可以设计出不同的业务功能。

程序地址空间

进程地址空间不是内存!
进程地址空间,会在进程的整个生命周期内一直存在。直到进程退出。
任何你们学过的语言,里面的地址,都绝对不会是物理地址。本质就是一种虚拟地址(由操作系统提供的)。
数据和代码一定在物理内存上(冯诺依曼规定的)。
so需要将虚拟地址转换成物理地址。
进程地址空间本质是进程看待内存的方式,抽象出来的一个概念,内核struct mm_struct,这样的每个进程,都以为自己独占系统内存资源。
区域划分本质:将线性地址空间划分成为一个一个的area,【start,end】
虚拟地址本质:在【start,end】之间的各个地址叫做虚拟地址。

页表:完成虚拟地址到物理地址之间的映射。

为什么要有进程地址空间?
1、保护物理内存,不收到任何进程内的地址的直接访问,方便进行合法性校验。
2、将内存管理和进程管理进行解耦。
3、让每个进程,以同样的方式,来看待代码和数据。

如果直接进程访问物理内存,那么看到的地址就是物理地址。进程的独立性,无法保证。因为物理内存暴露,其中就有可能有恶意程序直接通过物理地址,进行内存数据的篡改。

猜你喜欢

转载自blog.csdn.net/qq_46994783/article/details/123183528