程序和进程
程序:为完成一些任务的指令的有序集合
程序 = 代码 + 数据 ,size命令可以看到程序在内存空间的分配
进程:
- 对用户:进程是程序的一次动态执行过程
- 对操作系统:进程是系统分配资源的基本单位和最小单位,每个进程有独立的地址空间和运行状态
进程 = 代码 + 数据 + 堆 + 栈
PCB:用来保存进程的相关信息的数据结构,Linux中叫task struct。
由于时钟中断技术,让进程有并发执行能力,即时间片法。
进程和程序的区别:
- 程序是静态的
- 程序的生命是永久的
- 程序没有PCB信息
- 进程 -> 一个程序,程序 -> 多个进程
MMU地址映射
我们在写程序时,只能决定变量的偏移地址,而在内存中的物理地址还要和段地址相加得到。
如果两个的进程创建的变量的偏移(虚拟)地址有重合,那不就乱套了,因此段地址由操作系统决定。
MMU就负责把虚拟地址映射为物理地址。
而且还有对地址空间存取权限的检查的功能。
进程的运行状态
经典:就绪 运行 阻塞
Linux七态:
用户空间:用户运行态
内核:运行态 就绪态 不可中断睡眠 可中断睡眠 暂停 僵尸
僵尸进程
子进程死亡,父进程还存在,子还占用系统资源
孤儿进程
父进程死亡,子进程被1号进程领养
PCB详解
PCB存放的进程相关信息如下
- 进程标识符,进程状态,优先级
- 程序入口地址
- 计时信息
- 进程间通信
- 占用内存
- 交换分区
- IO设备,缓存相关数据结构
- 文件系统相关信息
- 现场保护
进程标识符
每个进程有独一无二的一个 unsigned int
0号进程:os内核使用
1号进程:0创建的用户进程
创建一般进程的过程
- 分配一个描述符,复制父进程PCB大部分数据
- 复制父进程的环境
- 分配系统资源,代码,堆栈
- 父进程地址空间内容拷贝到子进程
- 置就绪态,放入就绪队列
利用fork创建进程:https://blog.csdn.net/hanzheng6602/article/details/79971887
- /proc/(pid)/ 目录放的是进程的所有信息
查看进程状态的命令
进程列表 ps -ef | grep “”
上下翻页查看 top shift >
查看进程树 pstree
进程优先级默认为0,且值越小优先级越高,-20 ~ 19 之间
三种方法调整优先级
- 开始执行程序前 nice -n 优先级 ./a.out
- 调整存在的进程 renice 优先级 -p pid
- top r 命令
环境变量和本地变量
本地变量定义:name=value 只能在本进程使用
环境变量:$PATH $HOME 可以在本进程和子进程使用,不能用于父进程
本地变量变为环境变量:export 本地变量
所有用户的环境变量 /etc/profile
env查看所有环境变量,获取所有环境变量用main函数第三个参数.
getenv()函数:获取一个环境变量,返回一个char*指针。可以用于避免读取配置文件,方便获取环境变量值。
内核的分类
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。
单内核(Monolithic kernel),是个很大的进程。它的内部又能够被分为若干模块,如Linux内核.
微内核(Microkernelkernel, 结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必需的几个部分,如线程管理,地址空间和进程间通信等。微核的目标是将系统服务的实现和系统的基本操作规则分离开来。
混合内核, 它很像微内核结构,只不过它的的组件更多的在核心态中运行,以获得更快的执行速度