什么是进程:
正在执⾏的程序。 能分配处理器并由处理器执行的实体。简单的说就是从磁盘上拿到内存上的程序叫做进程
我们把描述进程结构体叫做PCB(进程描述符),所有的管理只管理PCB
进程=代码段+数据段+堆栈+PCB(PCB将代码段和数据段粘合起来)
我们比较一下
进程与可执行程序的区别:
- 存储位置的不同(可执行程序在磁盘中,内存映像在内存中),进程有PCB。
- 进程具有动态属性,文件在硬盘上只有存储状态,可执行程序是静态的(普通的二进制文件)
- 进程的生命周期是短暂的,程序的生命周期是永久的。
- 一个进程只能对应一个程序,一个程序可以对应多个进程。
我们先来看几条关于进程的指令:
- ps:只显示当前只能终端的进程状态
- ps -e:查看前后台进程的状态
- ps -ef:显示更为详细的进程信息
- ps aux:查看进程
- ps aux | grep(进程名):查看进程
- getpid:子进程(bash)
- getppid:父进程()
我们是通过fork()创建的子进程
父进程会返回子进程id,子进程返回0;
原因:父进程有多个子进程,需要区分,而子进程只有一个,不需要区分
若出错pid==-1
检测方法:
- printf(“%s
”,strerror(errno));
- perror(fork);
(记得加头文件)
父子进程代码段是共享的,父子对应的都看为只读的,这样代码段数据段都为共享,若数据段要进行修改,则进行写时拷贝,不占用磁盘内存,为虚拟的。
如图我们创建了子进程
结果是他们会出现相同的地址,不同的值。
虚拟地址(地址空间上的地址),一样物理地址不一样
创建的pcb以父进程为模版,代码 共享数据各自有一份(利用了写时拷贝)。
也就是说,fork创建的子进程,与父进程的地址相同但是内容不同。
那么它是怎么做到的呢?
页表:写入物理内存与虚拟内存完成映射工作。
mmu:结合页表完成了虚拟地址与物理地址的转换。
如上图是我们虚拟地址转换为物理地址的过程,
这样我们就明白了代码共享和数据各自有一份是怎么做到的了,代码在物理地址中存储,通过页表和mmu映射到同一物理内存就可以共享,映射到不同的虚拟地址中就数据各一份。
下来我们看一下环境变量
环境变量具有全局属性:被子进程继承,当前进程以及子进程都可以被继承。
局部变量:只有本shell/进程内部存在。
获取环境变量的方法:
关于环境变量在后面的博客会专门介绍,在这里先简单介绍下
1,env(第三个参数)
运行该程序出来的结果为:
会出来好多环境变量
2,environ(第三方变量):无头文件,使用时要声明(声明不开辟空间)
程序运行出来:
同样获取到了环境变量。
但是以上两种方法并不推荐使用;
下面我们看一下第三种方法
3,使用getenv()函数获取环境变量——(
头文件为#include
)
程序运行出来:
第三种方法是推荐大家使用的。
进程的状态
“R (running)”——运行状态(并不意味进程一定在运行中,表明进程在运行中或在运行队列中)
“S (sleeping)”——睡眠状态(做事情,进程在等待事件完成,可以自己或其他程序唤醒也叫做可中断睡眠)
“D (disk sleep)”——磁盘睡眠状态(不会因为任何命令/指令终止,保证数据完整性,只能关机重启,也叫不可中断睡眠)
“T (stopped)”——暂停状态(什么事情也不做)
“t (tracing stop)”——
“X (dead)”——死亡状态
“Z (zombie)”——僵尸状态
所有进程都保存在PCB中
补充几条指令:
kill -l (查看信号列表)
在这里我们学习使用编号为9,18,19.
9)SIGKILL: 终止进程
18)SIGCONT:继续进程
19)SIGSTOP:暂停进程
kill -对应编号或名称 进程
进程优先级
学习一条指令
ps -l:显示当前终端下开启的任务。
ps -al:显示当前终端下所有的任务。
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
NI:就是我们所要说的nice值,其表示进程可被执行的优先级的修正数值。
如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:
PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变 小,即其优先级会变高,则其越快被执行。 到目前为止,更需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念, 但是进程nice值会影响到进程的优先级变化。
修改进程优先级的命令主要有两个:nice,renice
1,nice
nice -n 数值 +文件名
nice的范围为-20 ~ 19
PRI的范围为60 ~ 99
2,renice(进程跑起来,动态调整)
renice 数值 -p 文件名
renice改变的值是从最开始的数值上改变
./myenv &(把可执行程序myenv放在后台运行)