【读书笔记unix操作系统设计】进程控制

一、进程的创建

二、软中断信号

软中断信号的处理有几个方面:
1.内核如何向一个进程发送软中断信号。2.进程如何接受软中断信号。3.进程如何控制自己对软中断信号的反应。

1.如何发送软中断信号:
为了给一个进程发送一个软中断信号,内核在该进程的进程表中,按所要接受的信号类型设置软中断信号字段的某一位。如果该进程睡眠在一个可中断优先级上,内核就唤醒它

2.什么时间处理软中断信号:
当一个进程即将从内核态返回到用户态时,或它要进入或离开一个适当的低调度优先级睡眠状态时,内核要检查它是否收到了一个软中断信号。??????p154

3.如何识别软中断信号:
在这里插入图片描述

2.1软中断信号分类

在这里插入图片描述

2.2软中断信号的处理

进程在收到软中断信号的进程上下文中处理软中断信号,因此进程必须运行以便于处理信号。

处理软中断信号的三种情况:
1.进程收到软中断信号后退出exit。
2.忽略信号
3.收到信号后执行一个特殊的(用户)函数。可以用signal来定义收到某一个信号后要做的特殊动作。

	oldfunction = signal(signalnum,function);
//signalnum是进程要为其定义的软中断信号号。 
//function是收到该信号后,进程希望调用的函数地址。如果是0,则退出。如果是1,则忽略信号。

在这里插入图片描述
在这里插入图片描述
p158-p161?

三、进程组的概念

可以利用setpgrp()初始化一个进程的进程组号,将其设置为与该进程标识号相同的值。

	grp = setpgrp();

在系统调用fork期间,子进程得到父进程的进程组号。setpgrp()在设置一个进程的控制终端上有重要的作用。

四、从进程中发送软中断信号

进程使用系统调用kill发送软中断信号:

	kill(pid,signum);
	//pid标识了一个接受软中断信号的进程集合。signum是要发送的软中断信号号。
	//一组进程与pid之间的对应关系:
		//如果pid为正值,则内核将信号发送给进程号为pid的进程
		//如果pid为0,内核将信号发送给所有与发送进程同组的进程
		//如果pid为-1,内核将信号发送给所有用户标识号等于发送进程的有效用户标识号的进程。???如果发送进程具有超级用户的有效用户标识号,则内核将信号发送给出进程0和1以外的所有进程
		//如果pid为负数且不是-1,则内核将信号发送给组号为pid绝对值的进程组中的所有进程

	//上述对应关系中,如果发送进程不具有超级用户的有效用户标识号,或者它的真正的或有效的用户标识号与接收进程的真正的或有效的用户标识号不匹配,则系统调用kill失败。

五、进程的终止

unix系统中利用系统调用exit来终止运行。每个退出的进程都进入僵死状态,释放它的资源,撤出它的上下文,但还保留它的进程表项。

	exit(status);
	//其中,status为返回给父进程的值以便检查。
	//进程可以显式的调用exit或在程序结尾隐式的调用
	//进程收到非捕俘的信号时,可以从内部调用exit。如果是这样,则status的值是该软中断信号号。?????

系统调用exit的算法如下:
在这里插入图片描述
注释:

在进程状态改为僵死状态后:内核在进程表中保留退出的状态码、该进程及其后代的用户和内核的运行累计时间。

内核写记账记录到一个全局的记账文件中,记录中含有各种运行时的统计信息,如用户号、CPU及内存的使用情况,进程的输入输出量。用户层的文件可以读记账文件,收集各种统计数据,以利于性能监控以及做顾客账单。??

六、等待进程的终止???

一个进程可以通过系统调用wait使它的执行与子进程的终止同步。???

	pid = wait(stat_addr);
	//pid为僵死子进程的进程号;
	//stat_addr为一个整数在用户空间的地址,它将含有子进程的退出状态码。

在这里插入图片描述
注释:

如果执行wait的进程有子进程,但没有僵死进程,则其睡眠在可被中断的优先级上,知道出现一个软中断信号。

内核对于睡眠与系统调用wait上的进程没有显式的唤醒调用,这样的进程只有收到软中断信号时被唤醒。


对“子进程死”外的任意软中断信号,进程将像前面那样做出反应,但是如果软中断信号是“子进程死”,该进程将采取不同的对策:

  • 在缺省的情况下,进程从系统调用wait的睡眠中醒来。算法sleep将调用算法issig来检查软中断信号。其识别出子进程死的软中断信号的特殊情况,并返回“false”,接下来内核不为算法sleep做longjmp,而是返回系统调用wait。内核重新开始wait算法中的循环。????

  • 如果进程捕俘“子进程死”的软中断信号,内核就好像处理其他信号一样,安排调用用户的软中断信号处理子程序。

  • 如果进程忽略“子进程死”的软中断信号,内核重新开始wait中的循环,释放僵死子进程的进程表项,然后寻找其他的子进程。

七、进程对其他进程的调用

p169-p175?

exec可以实现引用另一个程序,它用一个可执行文件的副本覆盖一个进程的存储空间。除了exec的参数之外,在exec调用之前存在的用户级上下文内容,在exec调用之后就不能再存取了。

	execve(filename,argv,envp);
	//filename是要引用的可执行文件的文件名
	//argv是一个字符指针数组的指针,这组字符指针是可执行程序的参数
	//envp是另一个字符指针数组的指针,这一组字符指针是执行程序的环境
	系统调用exec的库函数有好几个,如execl,execv,execle等待。这些库函数最终都要调用execve

在这里插入图片描述

八、进程的用户标识号

九、改变进程的大小

通过系统调用brk可以增加或减少进程数据区的大小。

		brk(endds);
		oldendds = sbrk(increment);

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值