进程

进程的概念

  • 狭义定义:进程是正在运行的实例。
  • 广义定义:进程是一个具有一定功能的程序关于某个数据集合的一次运行活动;它是操作系统动态执行的基本单元,在传统的操作系统中,既是基本的分配单元,也是基本的执行单元。

进程的概念主要有两点:(1)进程是一个实体;每一个进程都有它自己的地址空间,一般情况下,包括文本区、数据区和堆栈区(文本区存储处理器执行的代码;数据区存储变量和进程执行期间使用的动态分配的内存;堆栈区存储活动过程调用的指令和本地变量)。(2)进程是一个“执行中的程序”;程序是一个没有生命的实体,只是处理器赋予程序生命时,它才能成为一个活动的实体,我们称之为进程。


进程控制块—PCB

进程信息被存放在一个叫进程控制块的数据结构中,可以理解为进程属性的集合,描述进程运动变化的过程;课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct(是Linux内核的一种数据结构,它会被装载到RAM里并且包含着进程的信息)。

task_struct内容分类:

  • 进程标识符:描述本进程的唯一标识符,用来区分其它进程(进程id(PID) 父进程id(PPID));
  • 状态:任务状态、退出状态、退出信号……;
  • 优先级:相对于其它进程的优先级;
  • 程序计数器:程序中即将执行的下一条指令的地址;
  • 内存地址:包括程序代码和进程相关数据的指针,还有和其它进程共享的内存块的指针;
  • 上下文数据:进程执行时处理器的寄存器中的数据;
  • I/O状态信息:包括处理器时间总和,使用的时钟总和,时间限制,记账号……
  • 其他信息

查看进程信息
在这里插入图片描述
UID:代表执行者身份
PID:代表这个进程代号
PPID:代表这个进程是由那个进程发展衍生而来的,亦即父进程代号
PRI:表示这个进程可被执行的优先级,其值越小越早被执行
NI:代表这个进程的nice值

ps命令常用选项

选项说明
-a显示所有用户进程
-e显示包括系统进程的所有进程
-l显示进程的详细列表
-f显示进程的详细信息
-x显示没有控制终端的进程
-u显示用户和启动时间等信息

进程调度------(最基本)基于优先级调度

  • CPU资源分配的先后顺序,就是只进程的优先权(priority);

  • 优先权高的进程有优先执行权利,配置进程优先权对多个任务环境的Linux很有用,可以改善系统性能;

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能;

    PRI and NI:

  • PRI:表示这个进程可被执行的优先级,其值越小越早被执行

  • NI:代表这个进程的nice值;

  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI = PRI + nice;

  • nice其值取值范围是 -20~19,一共40个级别;
    注:需要强调一点的是,进程的nice值不是进程的优先级,它们不是一个概念,但是进程的nice值会影响到进程的优先级变化,可以理解nice值是进程优先级的修正数据。


进程创建

  • fork()
    (1)以父进程为模板复制创建出一个子进程,父子进程代码共享,数据独有(写时拷贝技术);
    (2)fork的返回值,父进程=子进程pid 子进程返回0;
    (3)父子进程谁先运行取决于cpu调度;

  • vfork()
    (1)子进程没有(退出)或者运行其他程序则父进程是阻塞的,也就意味着子进程是先运行的。
    (2)子进程先运行的原因:因为创建出子进程,大多时候都是为了让它运行其他程序
    (3)父进程阻塞的原因:vfork创建子进程后,父进程是共用一块虚拟地址空间,那么他们共用一个栈区,有可能会造成共用栈混乱;
    vfork设计出来的目的就是为了创建一个子进程,然后直接运行其他的程序,重新运行其他的程序就是重新给子进程开辟新的空间,更新他自己的一份地址空间和页表自从fork函数使用了写时拷贝技术之后,这个函数就淘汰了。


进程终止

  • main 函数中return;
  • exit (int status)库函数调用:在程序任意位置调用都会使进程退出 status是进程的退出状态;
  • _exit(int status)系统调用接口:在程序在任意位置调用都会是进程退出 exit最终调用的就是这个接口退出的;
exit 与 _exit区别
exit温和性的退出,在退出前会温和的释放资源,刷新缓冲区
_exit是暴力退出,直接释放资源退出,不会刷新缓冲区

进程等待

  • 进程等待的必要性:一个子进程退出,父进不管不顾,就有可能造成‘僵尸进程’的问题,进而造成内存泄露;另外,进程一旦变成僵尸状态,那就刀枪不入,kill-9也无能为力,因为谁也没办法杀死一个已经死去的进程;最后,父进程派给子进程的任务完成的如何,我们需要知道(如:子进程运行完成,结果对还是不对,或者是否正常退出);父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
  • 进程等待方法:
	//(1)wait( )方法:
	
	#include<sys/types.h>
	#include<sys/wait.h>

	pid_t wait(int*status);

	返回值:成功返回被等待进程pid,失败返回-1;
	参数:输出型参数,获取子进程退出状态,不关心则可以设置成NULL

	//(2)waitpid( )方法:
	pid_ t waitpid(pid_t pid, int *status, int options);
	
	返回值:
		当正常返回的时候waitpid返回收集到的子子进程的进程ID;
		如果设置了选项WNOHANG,而而调用用中waitpid发现没有已退出的子子进程可收集,则返回0;
		如果调用用中出错,则返回-1,这时errno会被设置成相应的值以指示示错误所在;
	参数:
		pid:
			Pid=-1,等待任一一个子子进程。与wait等效。
			Pid>0.等待其进程ID与pid相等的子子进程。
		status:
			WIFEXITED(status): 若为正常终止止子子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非非零,提取子子进程退出码。(查看进程的退出码)
		options:
			WNOHANG:若指定的进程没有结束,则waitpid( )函数返回0,不予以等待;若正常结束,则返回子进程id.

如果子进程已经退出,调用wait/waitpid会立即返回,并且释放资源,获得子进程退出信息;如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞;如果不存在子进程,则立即出错返回。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值