进程控制:

  • 结束,放弃
  • 装入,执行
  • 创建进程。终止进程
  • 取得进程属性,设置进程属性
  • 等待时间
  • 等待时间,唤醒时间
  • 分配和释放内存

运行程序需要能正常或者非正常地中断其执行(end或者abort)。

如果一个系统调用(system call)被用来非正常地中断执行程序,或者程序运行后碰到问题而引起了错误陷阱,那么可能会有内存信息转储,并产生一个错误信息。

内存信息转储通常写到磁盘上,并被调试器(debugger)(即帮助程序员发现和纠正错误的系统程序)检查和确定问题原因。

无论是正常的还是非正常的中止,操作系统必须将控制权交给调用命令解释器。命令解释器(就是之前所讲的命令解释程序,即shell/cmd等)接着读取下一个命令。

对于交互式系统,命令解释器仅简单读取下一行命令,因为其假定用户会采取合适的命令来处理错误。

而对于GUI系统,可能会通过弹窗来提醒用户出现错误了,并寻求建议(比如你复制已经被打开的文件时候,window就会提示)

在批处理系统中通常会中止整个作业,并继续下一个作业

有的系统允许使用恢复操作来以防出现错误。如果程序员发现输入有错误,并想以异常终止,它可能需要定义一个错误级别。更高级的参数会显示更多的错误。将正常的终止定义为0级的错误,然后这样可以将正常的和非正常的终止结合起来。命令解释器或下面的程序可以使用这个错误级别来自动确定下一个动作。

执行一个程序的进程或作业,可能需要load()和execute()另一个程序。这个特性允许命令解释器根据命令执行一个程序,而该命令可以通过用户命令、鼠标点击或者批处理命令来标识。

BUT,当新装入的程序终止时候,控制权返回到哪里呢?

如果新程序终止时,控制权返回到现有程序,那么必须保存现有程序的内存映像。我们已经有效地创建了一个机制来调用另一个程序。如果两个程序并发继续,那么创建了一个新的作业和进程,以便多道执行。通常,有专门的系统调用用于这一目的(比如 create _process()或者submit_job()).

如果创建了一个/组新的作业或者进程,那么需要控制它的执行。这种控制要求能决定和重置进程或者作业的属性,包括作业的优先级,最大执行时间等( get process attributes()和 set process attributes())。如果发现所创建的进程不正确或者不再需要了,那么可以终止它( terminate process())

Example: C语言的printf()函数

当用户程序调用printf方法时,C函数库会拦截这个调用来调用必要的操作系统的系统调用(即write()系统调用)。C函数库会把write()的返回值传递给用户程序。

当创建了一个新的作业或者进程时候,我们会等待它结束执行,我们可能会等待一定的时间就终止(wait_time()),更可能情况下,

我们会等待某一事件的出现( wait event()),当事件发生时,作业或进程应该发出信号( signal event())

另一组系统调用有助于调试程序。许多系统提供转储内存信息的系统调用(system call).这有助于调试。程序trace在执行时能列出有用每条执行指令,即使微处理器也可以提供一个称为单步的CPU模式,这种模式在每个指令运行后能执行一个陷阱,而该陷阱通常为调试程序所用。

通常,两个或多个进程可以共享数据。为了确保共享数据的完整性,操作系统经常提供系统调用,允许进程锁定共享数据。然后,没有其他进程可以访问数据。通常,这种系统调用包括获取锁acquire lock()和释放锁release lock()。在第5章中详细讨论了这些类型的系统调用,处理并发进程的协调。

很多操作系统提供程序的时间表,即一个程序在某个位置或某些位置的执行时间.

进程或者作业的控制有很大的改变,下面分单任务和多任务两种情况解释:

1.单任务系统:

MS-DOS是单任务的,他在计算机启动时候运行一个命令解释程序(a),它将程序装入内存,并改写它自己的绝大部分,以便为新程序提供尽可能多的空间(b).然后将指令指针指向程序的第一条指令。接着运行程序,或者一个错误会引起中断,或者程序执行一个系统调用以终止。

无论如何,错误会保存到内存中,以便后面使用。

然后,因为之前命令解释程序改写自己,现在剩下的未改写的部分会重新开始执行,其首要任务就是从磁盘重装命令解释器的其他部分。当完成任务时,命令解释器会向用户或者下一个程序提供之前的错误代码。

2.多任务系统

FreeBSD是多任务系统。当用户登录时,从用户选择的shell会运行。因为是多任务系统,所以当另一个程序执行时,我们依然可以操作命令解释程序。

为了启动一个新的进程,shell使用了fork()系统调用,然后,通过exec()系统调用将所选程序加载到内存中,程序被执行。

根据命令发出的方式,shell要么等待进程完成,要么在后台运行进程。对于后一种方式,shell可以立即接受下一条命令。

而进程运行在后台,是无法接受键盘输入的,因为shell现在正在使用键盘,所以I/O要通过文件或者GUI界面完成。

同时,用户可以让shell执行其他的程序,监视运行进程的状态,改变进程优先级等的

当进程完成时,他可以执行exit()系统调用来终止,并将0或者非0错误代码返回给调用进程,而这状态(或者错误)代码可以为shell或者其他程序所用。第3章讨论了使用fork()和exec()系统调用的程序示例。

results matching ""

    No results matching ""