进程执行需要一些资源,如内存、磁盘驱动、所需文件等。如果有可用资源,那么系统可以允许请求,并将控制交给用户程序;否则,程序应等待,直到有足够可用的资源为止。
操作系统控制的各种资源可看作设备。有的设备是物理设备(如磁盘驱动),而其他的可当作抽象或虚拟的设备(如文件)。多用户系统要求先请求(request())设备,以确保设备的专门使用。在设备用完后,要释放(release())它。这些函数类似于文件的系统调用 open() 和 close()。其他操作系统对设备访问不加管理。这样带来的危害是潜在的设备争用以及可能发生的死锁,这将在后续章节中讨论。
在请求了设备(并得到)后,就能如同对文件一样,对设备进行读(read())、写(write())、重定位(reposition())。事实上,I/O 设备和文件极为相似,以至于许多操作系统如 UNIX 都将这两者组合成文件-设备结构。这样,一组系统调用不但用于文件而且用于设备。有时,I/O 设备可通过特殊文件名、目录位置或文件属性来辨认。
用户界面可以让文件和设备看起来相似,即便内在系统调用不同。在设计、构建操作系统和用户界面时,这也是要加以考虑的。
信息维护
许多系统调用只不过用于在用户程序与操作系统之间传递信息。例如,大多数操作系统都有一个系统调用,以便返回当前的时间(time())和日期(date())。还有的系统调用可以返回系统的
21
其他信息,如当前用户数、操作系统版本、内存或磁盘的可用量等。
还有一组系统调用帮助调试程序。许多系统都提供用于转储内存(dump())的系统调用。对于调试,这很有用。程序 trace 可以列出程序执行时的所有系统调用。甚至微处理器都有一个 CPU 模式,称为单步(single step),即 CPU 每执行一条指令都会产生一个陷阱。调试器通常可以捕获到这些陷阱。
许多操作系统都提供程序的时间曲线(time profile),用于表示在特定位置或位置组合上的执行时间。时间曲线需要跟踪功能或固定定时中断。当定时中断出现时,就会记录程序计数器的值。如有足够频繁的定时中断,那么就可得到花在程序各个部分的时间统计信息。
再者,操作系统维护所有进程的信息,这些可通过系统调用来访问。通常,也可用系统调用重置进程信息
(get_process_attributes() 和 set_process_attributes ())。
通信
进程间通信的常用模型有两个:消息传递模型和共享内存模型。对于消息传递模型(message-passing model),通信进程通过相互交换消息来传递信息。进程间的消息交换可以直接进行,也可以通过一个共同邮箱来间接进行。在开始通信前,应先建立连接。应知道另一个通信实体名称,它可能是同一系统的另一个进程,也可能是通过网络相连的另一计算机的进程。每台网络计算机都有一
22
个主机名(hostname),这是众所周知的。另外,每台主机也都有一个网络标识符,如IP地址。类似地,每个进程有进程名(process name),它通常可转换成标识符,以便操作系统引用。系统调用 get_hostid() 和 get_processid() 可以执行这类转换。这些标识符再传给通用系统调用 open() 和 close()(由文件系统提供),或专用系统调用 open_connection() 和 close_connection(),这取决于系统通信模型。
接受进程应通过系统调用 accept_connection() 来许可通信。大多数可接受连接的进程为专用的守护进程(daemon),即专用系统程序。它们执行系统调用 wait_for_connection(),在有连接时会被唤醒。通信源称为客户机(client),而接受后台程序称为服务器(server),它们通过系统调用 read_message() 和 write_message() 来交换消息。系统调用 close_connection() 终止通信。
对于共享内存模型(shared-memory model),进程通过系统调用 shared_memory_create() 和 shared_memory_attach() 创建共享内存,并访问其他进程拥有的内存区域。
操作系统通常需要阻止一个进程访问另一个进程的内存。共享内存要求两个或多个进程都同意取消这一限制,这样它们就可通过读写共享区域的数据来交换信息。这种数据的类型是由这些进程来决定的,而不受操作系统的控制。进程也负责确保不会同时向同一个地方进行写操作。上面讨论的两种模型常用于操作系统,而且大多
23
数系统两种都实现了。消息传递对少量数据的交换很有用,因为没有冲突需要避免。与用于计算机间的共享内存相比,它也更容易实现。共享内存在通信方面具有高速和便捷的特点,因为当通信发生在同一计算机内时,它可以按内存传输速度来进行。不过,共享内存的进程在保护和同步方面有问题。
保护提供控制访问计算机的系统资源的机制。过去,只有多用户的多道计算机系统才要考虑保护。随着网络和因特网的出现,所有计算机(从服务器到手持移动设备)都应考虑保护。通常,提供保护的系统调用包括 set_permission() 和 get_permission(),用于设置资源(如文件和磁盘)权限。系统调用 allow_user() 和 deny_user() 分别用于允许和拒绝特定用户访问某些资源。
24
相关推荐: