您的位置:首页 > 运维架构 > Linux

Linux进程入门学习(二)-基础知识

2017-08-12 14:31 519 查看

1. 进程的地址空间

进程的地址空间,通常指的是虚拟地址空间,是进程活动的地址范围。大小为4G,主要包括两大块地址空间

a. 内核空间(kernel space) ,大小为1G(0xc0000000 - 0xffffffff)
b. 用户空进(user space),大小为3G(0x00000000 - 0xbfffffff)


如下图表示



地址空间特点:

a. 用户地址空间与内核地址空间是隔离的,只能通过专用的系统调用才能交互;
b. 进程间的用户地址空间是独立的,而内核地址空间则是共享的。 进程虚拟地址空间的物理映射特点:
a.内核空间映射到指定的地址空间
b. 不同进程的用户空间地址动态映射到不同的物理地址空间
c. 不同进程的相同地址空间动态映射到不同的物理地址空间


进程虚据地址空间分布:

进程的4G 地址空间建立后,划分为固定的功能区间,进程的不同操作对应于不同的地址区间,如下图:



那么问题来了,每个进程都需要分配4G的内存空间,但是实际上内存肯定是不够分配的,那么系统是如何解决这一问题的呢?首先理清几个关系,进程要使用内存,就要向操作系统申请,操作系统就会把相应的指令发给MMU(内存处理单元),然后MMU会通过页表转换到实际内存当中(如上图)。实际上是这样子的,一个进程产生后就会向操作系统申请4G大小的内存空间,操作系统当然是答应的,如果操作系统不答应,那么进程就跑不起来,程序就无法运行。操作系统虽然是答应请求了,但是操作系统也不是直接操作内存的,而是通过MMU内存处理单元映射到实际地址空间,MMU就在这个过程当中,把操作系统申请4G地址空间通过页表来转换到实际内存中的实际地址,4G的空间被压缩后可能变成512M或者其他值,这个就取决于页表。那么问题又来了,如果进程要使用的内存空间小于实际地址空间当然是不会出事的,万一超过了实际内存地址空间怎样么办?这时MMU(内存处理单元)就会拒绝操作系统的请求,并告诉操作系统内存已经用完了(操作系统实际不知到进程用来多少内存),进程也无法执行相应超出实际内存部分的代码。

2.进程的生命周期

linux 系统中,进程的整个生老病死过程中,主要经历以下几个阶段

1)进程的创建

2)进程的调度

进程就绪,对应就绪态
进程运行,对应执行态
进程挂起,对应休眠态、暂停态


3)进程的销毁

正常退出,对应死亡态
非正常退出,对应僵尸态,孤儿态




注意:

1)处于执行态的进程,当其不满足某一条件时,会切换到休眠态;

2)当再次满足条件时,不能直接切换到执行态,而是要先到就绪队列中,等待时间片轮转让,再次获得处理;

3)处于僵尸态的进程称为僵尸进程,而处于孤儿态的进程则称为孤儿进程。

进程状态查看

a.pstree –以树的方式查看进程

b.pstree -p:显示当前所有进程的进程号和进程id

1)使用ps 命令查看进程

ps -Af

ps -ef

ps -lA (查看具体进程:ps -lA | grep 进程名)



相关参数如下:

F:代表这个进程旗标(process flags),说明这个进程的权限,常见有:

若4 表示此进程的权限root ;

若1 則表示此子进程仅能fork。

S:代表这个进程的状态(STAT),主要的状态有:

R (Running):该进程正在运行;

S (Sleep):该进程正在睡眠,可被唤醒。

D :不可被唤醒

T :停止状态(stop);

Z (Zombie):僵尸进程。

UID/PID/PPID:代表『此进程被该UID 所拥有/进程的PID 号/此进程的父进程PID 』

C:代表CPU 使用率,单位为百分比;

PRI/NI:Priority/Nice 的缩写,代表此进程被CPU 所执行的优先顺序,数值越小代表该进程越快被CPU 执行。

ADDR/SZ/WCHAN:都与内存,ADDR 是kernel function,指出该进程在内存的哪個部分,如果是个running 进程,一般就会显示『- 』/ SZ 代表此进程用掉多少内存/ WCHAN 表示目前进程是否工作,同样的, 若为- 表示正在工作中。

TTY:登入者的终端机位置,若为远程登入则使用动态終端介面(pts/n);

TIME:使用掉的CPU 时间,注意,是实际花费掉的CPU 运作的时间,而不是系統时间;

CMD:就是command 的缩写,造成此进程的指令。

2)使用top 动态查看进程

top -p 进程PID



参数介绍
PID 每个进程的ID。
PPID 每个进程的父进程ID。
UID 每个进程所有者的UID 。
USER 每个进程所有者的用户名。
PRI 每个进程的优先级别。
NI 该进程的优先级值。
SIZE 该进程的代码大小加上数据大小再加上堆栈空间大小的总数。单位是KB。
TSIZE 该进程的代码大小。对于内核进程这是一个很奇怪的值。
DSIZE 数据和堆栈的大小。
TRS 文本驻留大小。
D 被标记为“不干净”的页项目。
LIB 使用的库页的大小。对于ELF 进程没有作用。
RSS 该进程占用的物理内存的总数量,单位是KB。
SHARE 该进程使用共享内存的数量。
STAT 该进程的状态。
其中S 代表休眠状态;
D 代表不可中断的休眠状态;


关于进程祖先的说明:

逻辑电路->bootloader->系统启动->0号进程->1,2号进程。系统启动产生0号进程(内核进程),0号进程产生1号进程和2号进程,1号进程跑出内核,继续产生其他进程;2号进程则留在内核,继续管理内核中的进程。

3.进程的调度算法

当操作系统中同时执行多个进程时,决定进程获取CPU 控制权的先后顺序及控制时间长短就显得特别重要了,而这些事情是由操作系统的调度算法模块来完成的。

linux 操作系统从0.1 版本发布至今,采用的调度算法经历了无数次的改动,目前形成了

如下几种主要调度算法:

1.先来先服务调度算法

2.短作业(进程)优先调度算法

3.时间片轮转法

4.多级反馈队列调度算法

5 . 优先权调度算法的类型

6 . 高响应比优先调度算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: