Linux进程(进程概念、特征、状态、优先级、进程地址空间、环境变量)

1.进程概念

进程程序的一个执行实例,正在执行的程序。
它是可执行程序关于数据集合的一次运行活动。
内核观点:进程是分配系统资源(CPU时间,内存)的实体的运行过程。是系统资源分配、调度的基本单位。
程序文件加载到内存就变成了进程。

2.进程的特征

1.动态性。进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
2.并发性。指多个进程实体,同存于内存中,能在一段时间内同时运行,并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
3.独立性。指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB(Process Control Block )的程序都不能作为一个独立的单位参与运行。
4.异步性。由于进程的相互制约,使进程具有执行的间断性,即进程按各自独立的、 不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此,在操作系统中必须配置相应的进程同步机制。
5.结构性。每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制段三部分组成的。

3.程序和进程的差别

1.进程是程序的执行过程是动态概念,程序是指令和数据的集合是静态概念。
2.两个进程即使执行同一个程序,但只要它们的数据集合不同就是两个不同的进程。(多个用户同时调用一个编译器,编译他们的源程序,由于写的源程序代码不同即数据集合不同,那这几个不同的编译过程就是不同的进程。)

4.进程控制块

1.进程的组成

1.程序
2.数据
3.进程控制块(Process Control Block,PCB)。PCB操作系统为描述进程在内存中开辟的一块空间。它主要记录的是进程的属性包括:
①标识符:进程的唯一标识,每个进程都不同
②状态:进程当前的状态,退出代码,退出信号。
③优先级:相对于其它进程的优先级。
④程序计数器:程序中将要被执行的下一条指令的地址。
⑤内存指针:进程执行的代码指针和数据指针,指向和其它进程共享代码块的指针。
⑥上下文数据:进程执行时寄存器中的数据。
⑦I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被被进程使用的文件列表。
⑧记账信息:处理器时间总和,使用的始终数总和,时间限制,记账号等。
等等很多信息,上面列的是最常见的。
在Linux中,PCB是一个 task_struct的结构体。linux中是用进程队列将一个个进程结构体链接起来的。

2.Linux中进程相关指令

查看进程:
1.ps
2.ps aux
3.ps axj
4.top
查看进程具体信息:查看 /proc/ 下的内容就是正在进行的进程。
5.kill命令杀死一个进程。 ps axj 获取进程pid, shell下输入 kill 进程pid , 可以杀死一个进程

ps axj
kill pid 

5.进程的状态

五态模型:
1.创建状态
2.就绪状态
3.执行状态
4.阻塞状态
5.终止状态
在这里插入图片描述
Linux下系统的状态:
1.R运行状态(Runnnig):这并不意味着正在占用cpu,在进程队列中等待调度的过程也是。
2.S睡眠状态(Sleeping):等待事件完成比如I/O,可被中断。
3.D磁盘休眠状态(Disk sleep):等待事件完成,不可被中断,I/O或事件结束后状态结束。
4.T停止状态(stopped):发送 SIGSTOP停止进程,发送SIGCONT让程序继续运行。
5.X返回状态(dead):是一个返回状态,在任务列表中看不到。
6.Z僵尸状态(zombie):当子进程退出,父进程没有读取到子进程的返回代码时,子进程会变成僵尸状态,称为僵尸进程。

僵尸进程

1.概念

僵尸进程:僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态。
若子进程退出,父进程一直都没有读取子进程的退出状态和数据,那么子进程一直处于僵尸状态。僵尸进程不会自动退出释放资源,也不会被kill命令杀死。
父进程获取子进程状态信息方式:调用 wait 或waitpid函数。

2.危害

僵尸进程危害:进程在内存中就是一个结构体变量,占用一块内存。程序结束,但父进程没有读取退出状态,就不会回收子进程占用的内存。造成内存泄漏。类似c语言中malloc出来的内存没有被free

3.处理方式

1.退出父进程

在Linux下用成序模拟一个30s的僵尸进程:

	pid_t childId = fork();
	//分流
	if(childId > 0)
	{
    
    
		//父进程
		printf("parent\n");
		//父进程休眠 35 秒后退出
		sleep(35);
		
	}
	else if(childId == 0)
	{
    
    
		//子进程
		printf("child\n");
		//子进程休眠5s后退出
		sleep(5);
	}
	return 0;

在子程序退出后,父程序休眠的 30 s 时间内查看子进程状态是 Z
在这里插入图片描述

孤儿进程

概念

孤儿进程:子进程还在运行时,父进程被终止了。这时的子进程称为孤儿进程。
当子进程退出后,进入僵尸状态,父进程已经不存在了不能被父进程回收,它会init(1号进程或systemd)进程领养,然后完成进程收集工作。

6.进程优先级

1.什么是进程优先级

优先级就是cpu执行该进程的顺序,可以用优先级来表示,优先级越小进程优先级越高。一般情况,每个进程刚创建的时候优先级都相同,在Linux下是优先级值为80。

2.为什么要有进程优先级

方便cpu切换执行不同进程,最适用于进程较多时。

3.Linux下关于进程优先级操作

PRI:进程优先级值。越小优先级越高
NI:nice值。 范围 [-20, 19]
PRI(new) = PRI(old) + nice
补充:修改进程优先级只能通过 + nice值实现
指令:
1.查看进程优先级:ps -al
这条命令是只查看当前用的创建的进程。不包括系统创建的进程。
在这里插入图片描述
2.修改nice值(修改进程优先级)
在Linux中修改进程优先级的唯一方法就是修改nice值。
输入入top后按“r”–>输入进程PID–>输入nice值

进程的性质

1.竞争性:用户一般会创建多个进程,而cpu数量很少(一个或两个),多个进程为抢占cpu资源会相互竞争。为高效完成任务,合理利用cpu等硬件资源,才有了优先级的概念。
2.独立性:多进程运行期间要独享各种资源,进程间互不干扰。
3.并发性:多个进程轮流使用cpu资源,使它们的进度同时推进。
4.并行:不用的进程使用不同的cpu,同时运行。

7.环境变量

1.什么是环境变量

1.指定操作系统运行环境的参数。
2.例子:c/c++代码在在链接时,需要到动态库或静态库去查找,这时环境变量会帮助编译器到某个位置去查找动静态库。
3.环境变量具有全局属性。

2.为什么要有环境变量

帮助用户开发者,快速查找,定位,确认,提高开发效率。

3.常见环境变量

Linux中env指令是查看系统的所有环境变量。
echo $环境变量名 , 可以查看某个具体环境变量的值。

echo $PATH 

1.PATH:保存指令等的位置信息
2.HOME:指定用户的主工作目录(登入系统时默认使用的目录)
3.SHELL:一般是 /bin/bash

4.Linux中和环境变量相关命令

1.env:查看环境变量
2.echo $环境变量名:查看某个环境变量的值。
3.export:导出全局变量。注意:要访问某个环境变量必须加export,环境变量是全局的。
例如:在PATH中添加一个/home的新目录

[zjp@VM-0-4-centos ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zjp/.local/bin:/home/zjp/bin
[zjp@VM-0-4-centos ~]$ export PATH=$PATH:/home
[zjp@VM-0-4-centos ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zjp/.local/bin:/home/zjp/bin:/home

  1. unset: 清除环境变量
  2. set: 显示本地定义的shell变量和环境变量。既显示局部变量也有全局变量,所以当我们输入这个命令后会发现显示的变量数非常多。

5.代码获取环境变量

  int main(int argc, char *argv[], char *env[])  //argc命令行参数的个数,argv是命令行参数内容(是一个字符串),env是环境变量。
  {
    
    
      	for(int i = 0; env[i] != NULL ; i++)
      	{
    
    
      		printf("env[%d]:%s\n", i+1, env[i]);
      	}
  		return 0;
  }

6.系统调用获取环境变量

getenv(“环境变量名”)

int main()
{
    
    
	printf("%s", getenv("PATH"));
}

7.环境变量组织方式

在这里插入图片描述

进程地址空间

1.进程地址空间的分布:

在这里插入图片描述

2.进程地址空间与物理内存的关系

对于每个进程而言都有一个进程地址空间。进程地址空间的地址称为虚拟地址,每个进程的数据保存在内存中,但是它们的地址是虚拟地址,而进程地址空间内存通过页表建立一层映射关系。
在这里插入图片描述

3.进程地址空间结论

1.对数据取地址,取的是虚拟地址。
2.对两个不同进程中的数据取地址,可能得到相同的地址,但是它们存在不同的内存中。
3.进程地址空间和内存通过页表建立映射关系。每一个虚拟地址映射一个实际的物理地址。

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/113697415