您的当前位置是:第七章 操作系统接口>>学习内容>>知识点四

观看视频7.4学习本节知识点


一、UNIX系统调用类型

1.进程控制

①创建进程(fork)

一个进程可以利用fork系统调用来创建一个新进程。新进程是作为调用者的子进程,它继承了其父进程的环境、已打开的所有文件、根目录和当前目录等,即它继承了父进程几乎所有的属性,并具有与其父进程基本上相同的进程映像。

②终止进程(exit)

一个进程可以利用exit实现自我终止。通常,在父进程创建子进程时,便在子进程的末尾安排一条exit系统调用。这样,子进程在完成规定的任务后,便可进行自我终止。

③等待子进程结束(wait)

wait用于将调用者进程自身挂起,直至它的某一子进程终止为止。这样,父进程可以利用wait使自身的执行与子进程的终止同步。

④执行一个文件(exec)

exec可使调用者进程的进程映像(包括用户程序和数据等)被一个可执行的文件覆盖,此即改变调用者进程的进程映像。

⑤获得进程ID

UNIX系统提供了一组用于获得进程标识符的系统调用。比如,可用getp-id系统调用来获得调用进程的标识符,利用getgrp系统调用来获得调用进程的进程组ID,利用getppid系统调用来获得调用进程的父进程ID等。

⑥获得用户ID

UNIX系统提供了一组用于获得用户ID的系统调用,如getuid可用于获得真正的用户ID,geteuid用于获得有效用户ID,getgid用于获得真正用户组ID等。

⑦进程暂停(pause)

可用此系统调用将调用进程挂起,直至他收到一个信号为止。

2.文件操纵

①创建文件(creat)

根据用户提供的文件名和许可权方式,来创建一个新文件或重写一个已经存在的文件。如果系统中不存在指名文件,核心便以给定的文件名和许可权方式,来创建一个新文件;如果系统中已有同名文件,核心便释放其已有的数据块。创建后的文件随即被打开,并返回其文件描述符fd。若creat执行失败,便返回“-1”。

②打开文件(open)

把有关的文件属性从磁盘拷贝到内存中,以及在用户和指名文件之间建立一条快捷的通路,并给用户返回一个文件描述符fd。文件被打开后,用户对文件的任何操作,都只须使用fd而非路径名。

③关闭文件(close)

断开用户程序与该文件之间已经建立的快捷通路。在UNIX系统中,由于允许一个文件被多个进程所共享,故只有在无其他任何进程需要此文件时,才能真正关闭该文件。

④读和写文件(read/write)

仅当用户利用open打开指定文件后,方可调用read或write对文件执行读或写操作。两个系统调用都要求用户提供三个输入参数:

①文件描述符fd。

②buf缓冲区首址。对读操作,这是用户所要求的信息传送的目标地址;对写操作,则是信息传送的源地址。

③用户要求传送的字节数nbyte。

read表示从fd所指示的文件中去读入nbyte个字节的数据,并将它们送到由指针buf所指示的缓冲区中;write表示把nbyte个字节数据,从指针buf所指示的缓冲区中写到由fd所指向的文件中。

⑤连接和去连接(link/unlink)

为了实现文件共享,必须记住所有共享该文件的用户数目。为此,在该文件的索引结点中,设置了一个连接计数i.link。每当有一个用户要共享某文件时,须利用系统调用link来建立该用户(进程)与此文件之间的连接,并对i.link做加1操作。当用户中再使用此文件时,应利用系统调用unlink去断开此连接,亦即做i.link减1操作。当i.link减1后结果为0时,表示已经没有用户需要此文件,此时才能将该文件从文件系统中删除。

3.进程间通信

为了实现进程间的通信,在UNIX系统中提供了一个用于进程间通信的软件包,简称IPC。它由消息机制、共享存储器机制和信号量机制三部分组成。在每一种通信机制中,都提供了相应的系统调用供用户程序进行进程间的同步与通信用。

①消息机制

用户(进程)在利用消息机制进行通信时,必须先利用msgget系统调用来建立一个消息队列。若成功,便返回消息队列描述符msgid,以后用户便可利用msgid去访问该消息队列。

①发送消息:用户(进程)可利用发送消息的系统调用msgsend向用户指定的消息队列发送消息。

②接收消息:利用msgrcv系统调用从指定的消息队列中接收指定类型的消息。

②共享存储器机制

当用户(进程)要利用共享存储器机制进行通信时,必须先利用shmget系统调用来建立一个共享存储区,若成功,便返回该共享存储区描述符shmid。以后,用户便可利用shmid去访问该共享存储区。进程在建立了共享存储区之后,还必须再利用shmat将该共享存储区连接到本进程的虚拟地址空间上。以后,在进程之间便可利用该共享存储区进行通信。当进程不再需要该共享存储区时,可利用shmdt系统调用来拆除进程与共享存储区间的连接。

③信号量机制

UNIX系统中的信号量机制与第二章介绍的一般信号量集机制相似,允许将一组信号量形成一个信号集,并对这组信号量施以原子操作。

4.信息维护

①设置和获得时间(stime)

超级用户可利用设置时间的系统调用(stime),来设置系统的日期和时间;如果调用进程并非超级用户,则stime失败;一般用户可利用获得时间的系统调用time来获得当前的日期和时间。

②获得进程和子进程时间(times)

利用该系统调用可获得进程及其子进程所使用CPU的时间,其中包括调用进程在用户空间执行指令的所花费的时间,系统为调用进程所花费的CPU、子进程在用户空间所用的CPU时间、系统为各子进程所花费的CPU时间等,并可将这些时间填写到一个指定的缓冲区。

③设置文件访问和修改时间(utime)

该系统调用用于设置指名文件被访问和修改的时间。如果该系统调用的参数times为NULL时,文件主和对该文件具有写权限的用户,可将对该文件的访问和修改时间设置为当前时间;如果times不为NULL,则把times解释为指向utime buf结构的指针,此时,文件主和超级用户能将访问时间和修改时间置入utim buf结构中。

④获得当前UNIX系统的名称(uname)

利用该系统调用可将有关UNIX系统的信息存储在utsname结构中。这些信息包括UNIX系统名称的字符串、系统在网络中的名称、硬件的标准名称等。

二、被中断进程的环境保护

在UNIX系统V的内核程序中,有一个trap.S文件,它是中断和陷入总控程序。该程序用于中断和陷入的一般性处理。为提高运行效率,该文件采用汇编语言编写。由于在trap.S中包含了绝大部分的中断和陷入向量的入口地址,因此,每当系统发生了中断和陷入情况时,通常都是先进入trap.S程序。

1.CPU环境保护

当用户程序处在用户态,且在执行系统调用命令(即CHMK命令)之前,应在用户空间提供系统调用所需的参数表,并将该参数表的地址送入R0寄存器。在执行CHMK命令后,处理机将由用户态转为核心态,并由硬件自动地将处理机状态长字(PSL)、程序计数器(PC)和代码操作数(code)压入用户核心栈,继而从中断和陷入向量表中取出trap.S的入口地址然后便转入中断和陷入总控程序trap.S中执行。

trap.S程序执行后,继续将陷入类型type和用户栈指针usp压入用户核心栈,接着还要将被中断进程的CPU环境中的一系列寄存器如R0~R11的部分或全部内容压入栈中。至于哪些寄存器的内容要压入栈中,这取决于特定寄存器中的屏蔽码,该屏蔽码的每一位都与R0~R11中的一个寄存器相对应。当某一位置成1时,表示对应寄存器的内容应压入栈中。

2.AP的FP指针

为了实现系统调用的嵌套使用,在系统中还设置了两个指针,其一是系统调用参数表指针AP,另一个是调用栈帧指针FP。

①AP:系统调用参数表指针地址,通常是把该地址放在某个寄存器中。

②FP:栈帧指针,指示本次系统调用所保存的数据项。

系统调用与一般的过程调用有什么区别?