什么是进程
是被加载到内存中的程序,是运行时的程序。进程=pcb等相关数据结构+程序的数据和代码。
为什么要有进程
任务需要被计算机完成,任务是可能存在多个的,就有了管理的需求,所以就有了pcb等相关数据结构,任务=代码+数据
怎么办
进程管理(如何新建,如何调度,如何释放,如何进行其他管理)
进程=对应的文件+进程属性
struct task_struct(PCB){
1.标识符:pid,ppid。。。
2.状态:任务状态,退出代码,退出信号等。R(运行态) S(浅度睡眠:可中断睡眠,可用wakeup唤醒)
T(停止状态) D(深度睡眠:不可中断睡眠状态,不能被强制唤醒,知道IO结束才能被唤醒,) X(死亡状态) Z(僵尸状态)
查看进程状态的指令:ps aux / ps axj
3.优先级信息
4.程序计数器:程序中即将被执行的下一条指令的地址
5.内存指针:包括程序代码和进程相关数据的指针,还有其它进程共享的内存块的指针
6.上下文数据:进程执行是处理器的寄存器中的数据
7.I/O状态信息:包括现实的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8.记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。
其他信息
}
僵尸进程(重点)(Z—zombie)
产生原因:当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。
僵尸进程的危害:
1.进程不退出,其进程的退出信息就会一直在PCB里边,PCB的信息就得需要被一直维护,,会造成内存资源的浪费。
2.资源一直得不到释放,就会造成内存泄漏!
3.处于R状态的进程,一定在CPU上跑吗?
答:不一定!可能正在运行也可能在运行队列中
4.为什么要有僵尸状态?
保持进程基本退出信息,方便父进程读取,获得退出原因
有没有什么特征?
一般,僵尸的时候,task_struct是会被保留的,进程的退出信息,是放在进程控制块中的!
孤儿进程
产生原因:父进程比子进程提前退出,就会产生孤儿进程
孤儿进程会被init进程领养,而后被init进程回收资源,故不会造成内存泄漏
环境变量(重点)
环境变量是什么:
是系统的全局变量(体现在父进程的环境变量信息是可以被子进程继承下去的。),一般是指在操作系统中用来指定操作系统运行环境的一些参数。
环境变量的作用:为了方便用户,开发者对系统进行某种最简单化的查找。
常见的环境变量:
PATH:指定命令的搜索路径:安装软件本质就是把对应软件的可执行程序,拷贝到了PATH中的某个路径下。export PATH=$PATH:路径
HOME:指定用户的主工作目录(即用户登录到linux系统中时,默认的目录)
SHELL:当前Shell,它的值通常是/bin/bash
查看环境变量的内容:echo $(环境变量的名称)
环境变量的组织方式
每个程序都会受到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
获取env环境变量的代码实现
通过系统调用接口获取或设置环境变量
getenv(),头文件:#include<stdlib.h>
证明环境变量具有全局属性
首先调用export设置一个新的环境变量
export MYENV="it's my env"
其次编写代码,getenv获取环境变量
结果如下图所示,在bash进程中设置的环境变量信息是可以被子进程继承下去的,所以环境变量通常是具有全局属性的