第五章 进程管理与内存实例
5.1 LINUX简介
一 层次结构
1 进程执行的两个级别
(1)用户态
用户态下只能存取自己的指令和数据,不能执行特权指令。
(2)核心态
核心态下的进程可以访问OS核心和用户进程的地址空间。
综上:虽然系统在执行的时候处于以上两种状态之一,但是核心是为用户进程运行的。核心不是与用户进程平行运行的孤立的进程的集合,而是每个用户进程的一部分。用户进程通过系统调用由用户态切换到核心态。
2 LINUX的三个接口
(1)系统调用接口
用户在程序中(一般是汇编语言)调用OS提供的一些功能。
(2)库接口
以高级语言(比如c语言)标准库函数的形式,为程序员调用OS提供的功能。
(3)命令接口
在操作系统与用户之间提供的双向通信机制。接口一般包括:
一组联机命令、终端处理程序、命令解释程序等等。
实现方式包括:命令行方式(要求用户记忆命令格式),图形用户接口方式(用户可以利用鼠标对屏幕上的图标进行操作,完成与操作系统的交互,从而减少记忆内容,方便用户使用)
3 系统调用
(1)什么是系统调用?
前文已经说过,就是指用户在程序(一般是汇编语言)中调用OS提供的功能。
系统调用本身也是若干指令构成的过程(函数),但是与一般过程不同的是,系统调用运行在核心态,但是一般过程运行在用户态。
系统调用发生在用户进程通过特殊函数(比如OPEN)请求OS内核提供服务的时候。
系统调用负责对内核所管理资源的访问。
每个操作系统都提供许多种系统调用 。
(2)系统调用的方式
为了保证OS不被用户程序破坏,不允许用户程序访问系统程序和数据。那麽如何得到系统服务?
答案是通过一条陷入指令(或者说访管指令),由用户态切换到核心态,转入执行相应的处理程序(陷入处理程序)
注:
系统调用是一个低级过程,只能由汇编语言直接访问。
系统调用是操作系统提供给程序设计人员的唯一接口。
C语言为每个系统调用提供对应的标准库函数,应用程序可以通过c语言库函数来使用系统调用。
(3)系统调用的处理过程
每个系统调用对应一个事先给定的功能号。比如0、1、2等。
系统为实现系统调用功能的子程序(过程)设置入口地址表。
每个入口地址与相应的陷入处理程序对应。
在系统调用之前,保护处理器现场。
系统调用返回后,要恢复处理器现场。
在系统调用处理结束之后,用户程序可以利用系统调用的返回结果继续执行。
怎么样实现用户程序和系统程序之间的参数传递?
一般有以下三种方法:
·由陷入指令自带参数:但是由于陷入指令的长度是有限的,并且还要携带系统调用功能号。所以只能自带有限的参数。
·通过有关寄存器来传递参数:这些寄存器应该是用户程序和系统程序都能访问的,但是由于寄存器的长度和个数是有限的,所以无法传递较多的数据。
·大多在内存中开辟专用的区域(比如堆栈区)来传递参数。
(4)系统调用的分类
系统调用一般分成两个大类:一个是系统自身所需要的,另外一
个是作为服务提供给用户的。
(5)系统调用与一般过程调用的比较
相同点:
改变指令执行过程(调用之后转去执行系统调用子程序,然后再回来执行用户程序,这也就是为什么要保护处理器现场)。
是为了实现某个特定功能而设计的,可以多次调用。
执行完成之后返回。
不同点:
运行在不同的系统状态:一般的用户过程运行在用户态,而系统调用运行在核心态。
返回问题:在抢占式调度的系统当中,系统调用在返回的时候,OS会判断是否应该调度执行新的进程。(也就是需不需要剥夺调用进程)如果调用进程不需要剥夺,就返回调用进程继续执行(可能是调用进程优先级最高,或者时间片没到等等)。否则,就引起重新调度,在就绪队列中选择一个新的进程投入运行。
递归调用:系统调用一般不允许递归(不同进程可以重入一个系统调用)。
进入和返回方式不同:一般利用int或者trap指令进行系统调用,利用call指令进入普通的过程调用。并且一般的过程调用返回用ret指令,系统调用返回使用iret指令。这种情况下,核心态与用户态的切换由系统在int指令和iret指令内部自动完成。
(6)进入和返回指令
Call指令:
返回地址压栈(就是call指令下一条指令的地址,这样做其实是为了返回之后能继续执行调用进程)
将该call指令中的地址(被调用代码的地址)送入pc
Ret指令:
从栈顶弹出返回地址并且送入pc(这样就能继续执行调用进程)
Int指令和iret指令:
要处理程序状态字PSW,int指令中要保存用户程序的老psw,iret指令要在返回用户程序前恢复用户程序的老psw。
二 shell
Linux的命令解释器就是shell。Shell常常被普通用户看作“linux”,但是实际上它与操作系统本身没有关系,可以很容易被替换掉。Linux可以支持很多shell。
5.2 LINUX进程管理
一 进程的结构task_struct
每个进程对应一个task_struct,称为进程描述符,相当于PCB。
二 进程控制
1 进程创建fork
Pid=fork()。创建子进程,子进程是父进程的一个逻辑副本。父进程返回的是子进程的pid,子进程返回0.
三 进程调度
主要说了一个实时调度,实时进程优先级高于普通进程。并且实时进程关注绝对优先,而普通进程主要关注公平。
四 进程同步与通信
1 信号(signal)
信号是软件层次上对中断的一种模拟,又称为软中断。表示进程之间传送预先约定的信息类型,用于通知某进程发生了一个事件。
2 信号和中断的区别
√中断有优先级;信号没有优先级(所有信号是平等的)
√信号处理程序在用户态运行;而中断处理程序运行在核心态
√中断响应是及时的;信号响应通常有较大的时间延迟,必须等到接收进程执行时才生效
第17讲没看