Unix内核提供了应用程序可以运行的执行环境。因此,内核必须实现一组服务及相应的接口。应用程序使用这些接口,而且通常不会与硬件资源直接交互。
如前所述,CPU既可以运行在用户态下,也可以运行在内核态下。实际上,一些CPU可以有两种以上的执行状态。例如,Intel 80x86 微处理器有四种不同的执行状态。但是,所有标准的Unix 内核都仅仅利用了内核态和用户态。当一个程序在用户态下执行时,它不能直接访问内核数据结构或内核的程序。然而,当应用程序在内核态下运行时,这些限制不再有效。每种CPU模型都为从用户态到内核态的转换提供了特殊的指令,反之亦然。一个程序执行时,大部分时间都处在用户态下,只有需要内核所提供的服务时才切换到内核态。当内核满足了用户程序的请求后,它让程序又回到用户态下。
进程是动态的实体,在系统内通常只有有限的生存期。创建、撤消及同步现有进程的任务都委托给内核中的一组例程来完成。
内核本身并不是一个进程,而是进程的管理者。进程/内核模式假定:请求内核服务的进程使用所谓系统调用(system call)的特殊编程机制。每个系统调用都设置了一组识别进程请求的参数,然后执行与硬件相关的CPU 指令完成从用户态到内核态的转换。
除用户进程之外,Unix 系统还包括几个所谓内核线程(kernel
thread)的特权进程(被赋予特殊权限的进程),它们具有以下特点:
1 它们以内核态运行在内核地址空间。
2 它们不与用户直接交互,因此不需要终端设备。
3 它们通常在系统启动时创建,然后一直处于活跃状态直到系统关闭。
在单处理器系统中,任何时候只有一个进程在运行,它要么处于用户态,要么处于内核态。如果进程运行在内核态,处理器就执行一些内核例程。
Unix 内核做的工作远不止处理系统调用。实际上,可以有几种方式激活内核例程:
1 进程调用系统调用。
2 正在执行进程的CPU 发出一个异常(exception)信号,异常是一些反常情况,例如一个无效的指令。内核代表产生异常的进程处理异常。
3 外围设备向CPU发出一个中断(interrupt)信号以通知一个事件的发生,如一个要求注意的请求、一个状态的变化或一个I/O操作已经完成等。每个中断信号都是由内核中的中断处理程序(interrupt handler)来处理的。因为外围设备与CPU 异步操作,因此,中断在不可预知的时间发生。
4 内核线程被执行。因为内核线程运行在内核态,因此必须认为其相应程序是内核的一部分
*进程实现
为了让内核管理进程,每个进程由一个进程描述符(process descriptor)表示,这个描述符包含有关进程当前状态的信息。
当内核暂停一个进程的执行时,就把几个相关处理器寄存器的内容保存在进程描述符中。
这些寄存器包括:
1 程序计数器(PC)和栈指针(SP)寄存器
2 通用寄存器
3 浮点寄存器
4 包含CPU 状态信息的处理器控制寄存器(处理器状态字,Processor Status Word)
5 用来跟踪进程对RAM 访问的内存管理寄存器
当内核决定恢复执行一个进程时,它用进程描述符中合适的字段来装载CPU寄存器。因为程序计数器中所存的值指向下一条将要执行的指令,所以进程从它停止的地方恢复执行。
当一个进程不在CPU上执行时,它正在等待某一事件。Unix 内核可以区分很多等待状态,这些等待状态通常由进程描述符队列实现。每个(可能为空)队列对应一组等待特定事件的进程。
阅读(1447) | 评论(0) | 转发(0) |