现代操作系统笔记2(操作系统概念和系统调用)

操作系统概念:

1.进程

本质上是正在执行的一个程序,进程在其地址空间内读写,该地址空间存放有可执行程序、程序的数据以及程序的堆栈,进程的资源集包括寄存器、打开文件的清单、突出的报警、有关进程的清单。进程基本上是容纳一个程序所需要所有信息的容器。

操作系统周期性的挂起一个进程然后运行另一个进程。进程被挂起后,当需要再次启动时,状态需要完全相同,这意味着挂起时进程所有的信息都要被保存下来。与一个进程有关的所有信息,除了该进程自身的地址空间的内容外,均存放在操作系统中的一张表中,称为进程表。

一个被挂起的进程包括:进程的地址空间以及相应的地址表项

若一个进程可以创建一个或多个子进程,子进程又可以创建新的子进程,就容易得到进程树:


合作完成某些作业的进程需要通信以同步行为,称为进程间通信。

当需要向正在运行的进程传递消息,而进程并没有等待接受消息。为保证消息不丢失,发送者要求他所在的操作系统在给定的若干秒后给出一个通知。在限定秒数之后,操作系统向该进程发送一个警告信号,引起该进程的暂时挂起,并运行一个特别的信号处理过程,如重新发送丢失的信息。

每一个进程有给定的UID标志

2.地址空间

每个进程有可以使用的地址集合,一般来说,最大地址空间小于主存。

本质上,操作系统创建了一个地址空间的抽象,作为进程可以引用的地址集合。

3.文件

为了隐藏磁盘和其他I/O设备的细节特征。

目录树可以把文件分类成组,如图所示:


进程与文件的树状结构的区别:进程的树状结构层次不深,且是暂时的,而只有父进程可以控制和访问子进程。文件树状结构恰好相反。

根目录一般用/表示。

每个进程都有一个工作目录,路径名不以斜线开始。进程可以使用系统调用进入新的工作目录。

打开文件时,若权限许可,返回一个小整数,称为文件描述符。否则返回错误码。

UNIX中的安装文件系统(就是挂载的概念)

UNIX中的特殊文件:为了使I/O设备看起来像文件一样,这样I/O设备可通过同样的系统调用进行读写。

块特殊文件:可随机存储的块组成的设备,如磁盘

字符特殊文件:用于打印机等用于处理字符流的设备。特殊文件一般放在/dev中

管道:一种虚文件,可以连接两个进程,作为两个进程通信的媒介


4.输入/输出

5.保护

UNIX中的文件二进制保护代码RWX

6.shell

UNIX的命令解释器,终端用户与操作系统之间的界面

7.个体重复系统发育(我去。。达尔文进化论==)

系统调用:

用户和操作系统之间的交互是通过操作系统为用户提供的抽象,这一节主要分析这个接口调用。

说明系统调以UNIX系统为例子。

任何单CPU计算机一次只能执行一条指令,如果一个进程正在用户态中运行一个用户程序,并且需要一个系统服务,那么它必须执行一个陷阱或者系统调用,并将控制转移给操作系统。操作系统通过参数检查,找到所需要的调用进程,然后执行系统调用,并把控制返回给系统调用后面跟随者的指令。

以read系统调用为例子,含有三个参数,第一个指定文件,第二个指向缓冲区,第三个说明读出的字节数

count=read(fd,buffer,nbytes);

在count中返回实际读出的字节数,如果系统调用不能执行。count会被置为-1。

具体过程先看下面这张图:


在准备调用这个实际用来进行read系统调用的read库过程时,调用程序首先把参数压进堆栈,如步骤1~3,压入的顺序由后至前是由于C/C++的历史原因。接下来是对库过程的实际调用(步骤4)。这个指令用来调用所有过程的正常过程调用指令。

在库过程中,一般把系统调用的编号放在操作系统所期望的地方,如寄存器中(步骤5),然后执行一个TRAP指令,将用户态切换为内核态,并在内核中的一个固定地址开始执行(步骤6)。

TRAP指令与过程调用指令都能跳转到其他地址,但TRAP指令能切换到内核态,且不能跳转到任意地址上。

然后内核代码开始检查系统调用编号,发出正确的系统调用命令。这通常是通过一个由系统调用编号所引用的、指向系统调用处理器的指针表来完成(步骤7),此时,系统调用句柄执行(步骤8)。一旦系统调用句柄完成工作,控制可能会在跟随TRAP指令后面的指令返回给用户空间库过程(步骤9)。然后库过程返回给用户程序(步骤10)。

上述的“控制可能会在跟随TRAP指令后面的指令返回给用户空间库过程”是有原因的,系统调用可能阻塞调用者,如读取键盘,如果没有任何输入,则必须阻塞调用者。

以下是一些常用的系统调用:




以下将对这些系统调用逐一介绍

1.用于进程管理的系统调用

fork(派生)是唯一可以在POSIX创建进程的途径,创建一个原有进程的精确副本。在fork之后,所有进程及其副本就分开了。fork调用返回一个值,在子进程中该值为0,并且等于子进程的进程标示符,或等于父进程的PID。使用返回的PID,就可以区分父子进程。

考虑shell的情形,从终端读取命令,创建一个子进程,等待该子进程执行命令,子进程终止时,读入下一条命令。为了等待子进程结束,父进程执行一个waitpid系统调用,它只是等待,直到子进程终止。waitpid完成后,将第二个参数statloc指向的地址设置为子进程的退出状态,可用选项由第三个参数决定,如图:


考虑shell如何使用fork。键入命令后,shell创建一个新的进程。子进程必须执行用户的命令,通过使用execve系统调用。这个调用会引起整个核心映像被一个文件所替代,该文件由第一个参数决定。

execve有三个参数:将要执行的文件名称,一个指向变量数组的指针,一个指向环境数组的指针。

考虑诸如 cp file1 file2

该命令将file1复制到file2.在shell创建进程之后,该子进程定位和执行cp,并将源文件和目标文件传递给它。

cp的主程序中都有声明:main(argc,argv,envp)

argc是参数的数目,argv是指向数组的指针(这些和C语言一样),envp指向环境的一个指针,该环境是一个数组,含有name=value的赋值形式,用以将诸如终端类型以及根目录等信息传送给程序。

在UNIX中的进程将其存储空间分为:正文段(程序代码)、数据段(变量)、堆栈段,如图:


2.用于文件管理的系统调用

要读写一个文件,先要使用open打开该文件,最常见的文件系统调用是read和write,lseek调用可以改变文件制作的位置。UNIX为每个文件保存了文件的信息,可用stat系统调用查看这些信息。

3.用于目录管理的系统调用

mkdir和rmdir分别创建和删除空目录,link的作用允许同一个文件以不同文件名出现(其实就像linux里的软硬链接),作用是可以使团队共享一个文件。

考虑link是如何工作的,如下图:


两个用户,ast和jim,每个用户有一些文件的目录。若ast现在执行一个含有系统调用的程序:

link("/usr/jim/meme","/usr/ast/note")

在jim中的文件memo以note的文件名进入到ast文件夹下,这两个指向的是相同的文件。

在UNIX中,每个文件都有唯一的编号,i-node,用以标志文件,一个目录其实就是包含了i-node集合的文件。

通过执行mount系统调用,可以将一个CD-ROM文件系统添加到根目录文件系统中,使用语句:

mount("/dev/fd0","/mnt",0)  其中,第三个参数说明是只读的还是可读写的。

4.其他系统调用

5.Windows Win32 API


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值