/进程概念
//冯诺伊曼体系结构;现代计算机的硬件体系结构
//将计算机硬件划分为5大类 输入设备 输出设备 存储器 运算器 控制器
//在计算机中 数据流是围绕内存工作 意味着cpu要处理任意的数据 都需要先把数据放在内存中
//因此如果我们要应用一个程序 先把这个程序的指令加数据 加载到内存中
//操作系统的功能层次划分
//操作系统是什么 是一个软件 负责对计算机上的软硬件资源进行管理
//系统调用接口 操作系统内核提供给上层用于进行计算机操作的接口
//库函数 就是对系统调用接口进行二次封装接口
//库函数和系统调用的关系 库函数内部调用了系统调用接口
//进程概念
//站在用户的角度 运行中的程序
//站在系统的角度 对应运行中的程序的动态运行中的描述
//这个描述在linux下是结构体形式 struct task_struct{}
// 进程到底描述了什么信息
// 1 标识符 进程ID pid
// 2 进程调度信息 描述了如何调度一个程序的运行
// 3 进程状态 对进程不同运行状态进行描述 让进程在合适的时候做合适的事情
// 4 进程的内存管理 进程内部所有的数据都会占据内存 了解进程内部内存管理方式
// 5 进程内打开的文件信息 通过了解这块信息 更加深入的了解系统调用I/O
// 6 进程间通信资源管理 描述进程间通信相关资源信息
// 7 进程信号的软中断相关内容
// 8 . . .
// 1 标识符 进程ID 其实就是一个数字
// 在linux下可以通过ps指令查看进程信息 ps -ef
// 2 进程调度
// 并行 多个进程可以同时进行
// 串行 有多个进程 但是同一时间只能运行一个
// 并行和串行 在计算机上取决于CPU核心数量 每个CPU核心上都有一套独立的寄存器
// 计算机上运行的程序非常多 但CPU核心很少 如何让他们同时运行
// CPU分时机制
// 一个程序运行的时候 只能cpu上运行很短的一段数据(时间片) 时间片运行完毕 则切换下一个进程运行
// 分时机制 实现了多个进程在宏观上的并行 但是我们要理解微观上他们实际上是串行的
// 一旦程序是切换运行的 等切换回来的时候 cpu又怎么知道该从哪里开始继续运行
// 为了解决这个问题 因此在task_struct (PCB-进程控制块) 中就有一系列的程序保存程序的运行上下文
// pc寄存器内容 即将要执行的指令地址
// 一系列上下文数据 正在处理的数据 即将处理的数据
// 因此一旦cpu切换轮转回来了 就可以通过pid找到task_struct 从中取出这些上下文数据
// cpu寄存器中 cpu就可以从原来的位置继续向下执行 处理用来没有处理完的数据
//进程状态
//三态模型 就绪 运行 阻塞
//linux 的进程状态
// 运行态 就绪+运行 拿到时间片就能运行 以及正在运行的都属于运行态
// 可中断休眠态 不但可以被条件唤醒 还可以被打断的阻塞状态
// 阻塞态有一个唤醒条件 只有唤醒条件达成的时候才能转换为就绪态
// 不可中断休眠态 只能被条件唤醒 不可以被打断的阻塞状态
// 停止态 让进程停止运行 只能通过特殊方式唤醒
// 追踪态 调试的时候涉及到的状态
// 死亡态 进程退出后 资源全部释放完处于的一个短暂状态
// 僵尸态 一个进程退出了 但是资源没有被完全释放的状态
// 产生 由于子进程退出 但是父进程没有关注子进程的退出状态所导致的
// 危害 会造成系统资源泄露
// 解决 kill -9 强制杀死
// 避免 进程等待 等待子进程退出 获取他的返回值
//内存管理 程序地址空间
// 程序地址空间 进程的虚拟地址空间
// 进程的地址空间是虚拟的地址空间 ,并不是给每个进程都分配了4G内存
// 程序地址空间 实际上是系统给我们的进程所描述的一个虚拟的地址空间
// 这个描述在pcb中是 mm_struct结构体
// 虚拟地址空间的作用
// 实现数据在物理内存中的离散式存储 提高内存利用率 并进行内存访问控制 提高进程独立性
// 虚拟地址的实现 依赖一个关键性技术 页表 (内存的分页式管理)
// 虚拟地址空间 进行虚拟地址描述
// 页表信息 虚拟地址和物理地址的映射关系 访问权限 缺页中断标志
// 4k页面大小 4G内存有多少页面
// 1024*1024=2^20
// 虚拟地址组成 页号+页内偏移
// 32为系统下 地址大小4字节 32个比特位
// 页号 占据地址中的高20位
// 页内偏移 占据地址中的低12位