进程的概念
- 字面上: 运行中的程序.(我们写的代码运行起来,就算一个进程了)
- 底层上: PCB + 代码和数据 + 空间资源(虚拟内存,页表,物理内存)
- PCB:操作系统通过其对程序进行管理(对数据的管理,先对其抽象,再使用数据结构管理)
- 虚拟内存:使得同时运行的程序不互相干扰
- 特点: 承担分配系统资源的基本实体(资源分配的基本单位)
PCB:记录了其相关的属性,如:内存指针,上下文数据等
冯诺依曼计算机结构: 程序要运行是要在CPU上跑的, CPU与内存交互, 先将程序加载到内存中
进程的状态
1.状态
- 新建:字面意思
- 运行:task_struct (Linux下的PCB)在运行队列中排队,就叫做运行态
- 阻塞:等待资源就绪, 就叫阻塞状态,挂在等待队列中.其它设备也有阻塞队列,如键盘
- 挂起:当内存紧张时,OS通过适当的置换进程的代码和数据到磁盘
2.Linux下的状态
进程:前台进程 和 后台进程(&)(不会影响命令行交互)
- R:运行态
- S:阻塞态 (可中断睡眠)
- D:睡眠状态 (磁盘睡眠/深度睡眠 不可被被动唤醒)
- T:暂停状态 (调试状态)
- X:终止 (死亡) 瞬时性非常强(当前资源可以被回收)
- Z:僵尸状态(一个进程已经退出,但还是不允许OS释放,处于一个被检测的状态)
3.僵尸进程与孤儿进程
僵尸进程: 一个子进程退出,但资源还未释放, 处于被检测状态.
孤儿进程:父进程比子进程先退出,处于无人看管状态
父进程: 一般都是要回收子进程的. 是其通过fork创建的, 让其执行其它命令,一般会关系执行的结果
进程的优先级
概念
- PRI :进程被执行的优先级,其值越小越早被执行(60 ~ 99)
- NI :代表这个进程的nice值 (-20 ~ 19)
操作
原因
环境变量
1.概念: 环境变量是一种文本数据(一般是某些程序的路径)
- 环境变量默认在系统的配置文件当中
- 默认我们所查到的环境变量是内存级的
2.功能: 告诉bash某些程序的路径
3.常见的环境变量
- PATH: 指定命令的搜索路径
- HOME: 用户主工作目录路径
- SHELL: shell路径(一般是usr/bin)
4.操作
- env : 显示所有环境变量
- echo $xxx 查看指定的环境变量
- export name=xxx 导入环境变量(覆盖)
- unset name : 取消环境变量
5.补充
- bash : 命令解释器, 用来执行用户的指令(创建子进程执行), 帮助用户使用OS
- bash的启动: 会将环境变量加载到自己的上下文中(所以执行ls等指令的时候可以不带路径)
- bash执行的指令
- 内建指令(bash自己完成不需要路径) 外建指令(需要环境变量告知路径)
- bash子进程的运行
- 生成argv表(命令行参数): 来自用户, 将某些数据传递给子进程(如某些指令的选项 -a等)
- 生成envc表(环境变量): 来自OS
6.获取环境变量的方式
- extern char** environ;
- 命令行参数
- 调用函数: getenv("path");
地址空间
虚拟地址空间:一种数据结构
为什么要有地址空间?
- 进程的独立性:
- 通过虚拟地址空间与页表来实现,每个进程认为自己独享内存4G(32).通过页表能将其映射到不同区域上,来实现互不干扰
- 让进程以统一的角度看待物理内存(各种区域的层次划分: 栈, 堆, 数据段, 代码段等)
- 让进程以有序的方式看待自己的运行区域(页表的映射修正, 物理内存不连续, 虚拟连续)
- 让进程模块的管理和内存模块的管理解耦
- 有效的保护内存:凡是非法的访问或者映射,OS都会识别到,并终止你这个进程
- 提高资源利用率:当你要写入数据的时候 OS 才帮你申请物理内存.
可执行程序的理解
3 可执行程序,按照区域被划分为了以4KB为单位(页帧)
//IO的基本单位是4KB,IO的时候:将页帧装进页框里
//OS使用struct Page来管理这些4KB
描述地址空间的数据结构
struct vm_area_struct Linux 内核中用于描述虚拟内存区域的结构体
unsigned long vm_start:虚拟内存区域的起始地址
unsigned long vm_end:虚拟内存区域的结束地址
struct vm_area_struct *vm_next:指向下一个虚拟内存区域的指针
struct vm_area_struct *vm_prev:指向上一个虚拟内存区域的指针
缺页中断
当程序试图访问虚拟内存中的一个页,但是该页不在物理内存中时,就会发生缺页中断。操作系统会响应这个中断,将需要的页从辅助存储(如硬盘)中加载到主内存中,然后重新执行产生中断的指令。
页表的映射
进程的调度
Linux系统
- 分时操作系统: 拆分为时间片
- 活动队列: 只出不进(出以及跑完时间片的进程)
- 过期队列: 只进不出(进新来的进程)
- 最后活动队列为空, 过期队列累计进程, 进行指针交换. 循环往复
- 实时操作系统: 每个进程必须跑完