进程——创建进程、进程状态

进程

  • 进程概念
  • 进程的特征
  • 程序和进程的差别
  • 进程控制块
    • 1.进程的组成
    • 2.Linux中进程相关指令
  • 进程的状态
    • 僵尸进程
      • 1.概念
      • 2.危害
      • 3.处理方式
    • 孤儿进程
      • 概念

进程概念

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

进程的特征

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

程序和进程的差别

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

进程控制块

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/ 下的内容就是正在进行的进程。

进程的状态

五态模型:
1.创建状态
2.就绪状态
3.执行状态
4.阻塞状态
5.终止状态
进程——创建进程、进程状态_第1张图片
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)进程领养,然后完成进程收集工作。

你可能感兴趣的:(Linux,操作系统,linux)