一.进程与程序的概念
程序:程序就是放在硬盘中的文件。为了实现特定任务的一系列指令的有序集合
进程:
从用户角度:进程就是加载到内存上了,是程序的一次动态执行过程。(因为时钟中断,分时系统,时间片轮转的技术,CPU可以在没有执行完当前进程的情况下,执行其他进程)
从操作系统角度看;
- 进程是系统分配CPU,内存,时间片等系统资源的基本单位
- 也是系统分配资源的基本单位
- 每个进程都有自己独立的地址空间和运行状态
二.PCB
基本概念
进程是程序的一次动态执行过程,那么操作系统就需要有对应的数据结构来保存进程的一系列信息,这个结构体就叫做PCB,操作系统内有一个PCB链表,用来标识所有进程的相关信息
PCB内容分类
进程标识符,上下文,进程状态,优先级,程序入口地址,程序计数器等
三.程序和进程的区别
- 程序就是一个文件,所以程序是静态的,而进程是动态的
- 程序就存在硬盘里,而进程是加载到内存中,所以程序生命周期相对永久,进程的生命相对短暂
- 进程有PCB
- 程序可以对应多个进程,而进程只能对应一个程序
四.进程的虚拟地址空间
- c语言打出来的地址不是物理地址,而是虚拟地址
- 虚拟地址必须要能转换成物理地址
- 每个进程都有一个虚拟地址空间
虚拟地址空间在Linux内核中也是一个结构体
五.进程的状态
经典三态:就绪态,等待态,运行态。
Linux七态:用户运行态,运行态,可中断睡眠,不可中断睡眠,就绪态,暂停态,僵尸状态
- R运行状态:并不意味着进程一定在运行当中,它表明进程要么是在运行中要么是在运行队列里
- S睡眠状态:意味着进程在等待事件完成(这里的状态有时候也叫可中断睡眠)
- D磁盘休眠状态,有时也叫不可中断睡眠状态。在这个状态的进程通常会等待IO的结束
- T停止状态:可以通过发送SIGSTOP信号来暂停进程,这个被暂停的进程可以通过发送SIGCOUT信号来让进程继续运行
- X死亡状态:这个状态只是一个返回状态
查看进程状态:ps -al 或 ps -aux
改变进程状态:
killall 进程名 杀死进程
六.进程标识符
- 每个进程都有自己独一无二的进程标识符
- 0:操作系统内核使
- 1:被0号进程创建的一个用户进程
- 自己创建的进程,进程ID的取值范围为2~pid_max
在Linux下,下面的命令用来差最大pid
cat /proc/sys/kernel/pid_max
七.僵尸进程(Z)
- 僵尸状态是一个比较特殊的状态当进程退出,并且父进程(使用wait()系统调用)没有读取到子进程退出的返回码时就会产生僵尸进程,僵尸进程会占用系统资源
- 僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态码
- 只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
僵尸进程危害:
- 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct中,换句话说,Z状态不退出,PCB就一直要维护
- 僵尸进程会占用系统资源
- 父进程如果提前退出,那么子进程就称之为孤儿进程
- 孤儿进程被一号进程领养
(1)PRI表示进程优先级,值越小越快被执行,优先级越高
(2)NI就是nice值,表示进程可被执行的优先级的修正数值
(3)加入nice值后,PRI(new)=PRI(old)+nice
(4)所以调整进程优先级,在Linux系统下,就是调整nice值
NI 范围:-20--19(值越小,优先级越高)
调整优先级的方法
1.nice -n 优先级(root)
2.程序运行过程中:renice 优先级 -p pid(root)
3.用top命令更改已经存在进程的nice(root)
- top
- 进入top后按"r"-->输入进程PID-->输入nice值
1.本地变量:定义本地变量只能在当前进程使用,不能在子进程使用。定义:name=value(不能有空格)查看变量:echo $变量名
2.环境变量:export name(变量名)将本地变量变为环境变量,环境变量可以在本进程和子进程使用,但不能在父进程使用
常见环境变量:
- PATH:指定搜索命令的路径
- HOME:指定用户的主工作目录(家目录)。$HOME值不同(等于~)
- HISTSIZE:历史命令的记录总数
- SHELL:当前shell,它的值通常是bin/bash
3.删除变量:unset name(变量名)
4.env显示系统所有的环境变量,set显示本地定义的shell和环境变量
5.环境变量通常具有全局性getenv()获取环境变量