Linux浅谈进程

来源:互联网 发布:电脑网络映射是断开的 编辑:程序博客网 时间:2024/06/10 06:02

什么是进程:
正在执⾏的程序。 能分配处理器并由处理器执行的实体。
我们把描述进程结构体叫做PCB(进程描述符),所有的管理只管理PCB

我们比较一下进程与可执行程序的区别:
1,存储位置的不同(可执行程序在磁盘中,内存映像在内存中),进程有代码和数据多了PCB而程序只有代码和程序,
2,进程具有动态属性,文件在硬盘上只有存储状态,可执行程序是静态的(普通的二进制文件)

我们先来看几条关于进程的指令:
ps aux:查看进程
ps aux | grep(进程名):查看进程
getpid:父进程()
getppid:子进程(bash)
我们是通过fork()创建的子进程

122
如图我们创建了子进程
结果是他们会出现相同的地址,不同的值。
虚拟地址(地址空间上的地址),一样物理地址不一样
创建的pcb以父进程为模版,代码 共享数据各自有一份(利用了写时拷贝)。
也就是说,fork创建的子进程,与父进程的地址相同但是内容不同。
那么它是怎么做到的呢?

22

页表:写入物理内存与虚拟内存完成映射工作。mmu:结合页表完成了虚拟地址与物理地址的转换。

如上图是我们虚拟地址转换为物理地址的过程,
这样我们就明白了代码共享和数据各自有一份是怎么做到的了,代码在物理地址中存储,通过页表和mmu映射到同一物理内存就可以共享,映射到不同的虚拟地址中就数据各一份。

下来我们看一下环境变量
环境变量具有全局属性:被子进程继承,当前进程以及子进程都可以被继承。
局部变量:只有本shell/进程内部存在。

获取环境变量的方法:

关于环境变量在后面的博客会专门介绍,在这里先简单介绍下
1,env(第三个参数)
1

运行该程序出来的结果为:
32
会出来好多环境变量

2,environ(第三方变量):无头文件,使用时要声明(声明不开辟空间)
21

程序运行出来:
32

同样获取到了环境变量。

但是以上两种方法并不推荐使用;
下面我们看一下第三种方法

3,使用getenv()函数获取环境变量——(头文件为#include<stdlib>
32

程序运行出来:
32
第三种方法是推荐大家使用的。

进程的状态

“R (running)”——运行状态(并不意味进程一定在运行中,表明进程在运行中或在运行队列中)
“S (sleeping)”——睡眠状态(做事情,进程在等待事件完成,可以自己或其他程序唤醒也叫做可中断睡眠)
“D (disk sleep)”——磁盘睡眠状态(不会因为任何命令/指令终止,保证数据完整性,只能关机重启,也叫不可中断睡眠)
“T (stopped)”——暂停状态(什么事情也不做)
“t (tracing stop)”——
“X (dead)”——死亡状态
“Z (zombie)”——僵尸状态

所有进程都保存在PCB中

补充几条指令:
kill -l (查看信号列表)
22

在这里我们学习使用编号为9,18,19.
9)SIGKILL: 终止进程
18)SIGCONT:继续进程
19)SIGSTOP:暂停进程

kill -对应编号或名称 进程

进程优先级

学习一条指令
ps -l:显示当前终端下开启的任务。
ps -al:显示当前终端下所有的任务。
32
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放在后台运行)

0 0