1. 进程状态
进程从核心态返回用户态时,有可能被抢占,从而处于被抢占状态。
进程通过系统调用进入核心态运行时,若该系统调用是请求磁盘IO操作,则进程进入内存睡眠状态。IO完成后,中断程序唤醒该进程,则进入内存就绪状态。
用户进程可以发起系统调用,从而切换到”内核状态“,但不能控制何时从内核返回。
进程中的u区只能由正在运行的进程来存取。
2. 系统存储
进程逻辑段: text, data(全局变量), stack。编译程序在虚地址空间上生成地址。由存储管理部分将虚地址转换成物理地址。因此,编译程序不必知道内核以后会把程序装入内存的什么地方执行。
1) 区
几个进程可以共享一个正文区,但其数据区和栈区是各自私有的。
每个进程有一个私有的本进程区表pregion,指向一个区表项,并含有该区在进程中的其实虚地址。
2) page
存储管理硬件将物理存储器分为一些大小相等的块,成为页,大小512到4k字节。分配物理页不一定是连续的。
内核将区中的逻辑页号映射为机器上的物理页号。在一个程序中,区是连续的地址空间,逻辑页号可以作为物理页号数组的下标。
3) u区
每个进程有一个私有的u区,然而当内核访问u区时,就好像系统中只有一个u区,即正在运行的u区。
内核只要通过一个新地址重写u区页表地址项,就能引用另一个进程的u区。内核的正文和数据是由所有进程所共享的。
3. 进程上下文
进程上下文包括:
- user-level context。包括进程正文、数据、用户栈、共享存储区。
- regiester context。计数器、状态寄存器、栈指针、通用寄存器。
- system-level context。即内核上下文,包括静态(进程表项、进程u区、本进程区表,区表决定进程的正文、数据、栈等区域),动态(进程核心栈、后进先出的context layer栈)
核心栈装有进程函数的调用序列。上下文层context layer处理中断中的context压入和弹出等。
一个进程在它的当前上下文层中运行。机器所能支持的中断级数目,限制了下下文层的数目。对于支持5中中断级的系统,一个进程最多可有7个上下文层:每个中断级共5个、系统调用一个、用户级一个。
4. 进程上下文保存
1)中断
中断发生时,处理过程为:
- 保存(压入)——当前上下文层
- 调用中断处理程序
- 恢复(弹出)前一上下文层
2)系统调用
3)上下文切换
内核在以下四种情况下允许发生上下文切换:
- 进程使自己进入睡眠
- 从系统调用返回用户态但不是最有资格运行的进程
- 在内核完成中断处理返回用户态但不是最有资格的进程
- 推出(exit)
5. 进程地址空间的管理
allocreg 分配一个区数据结构,返回一个上锁的、已分配的区。
attachreg 将区附接到进程。在fork,exec期间,内核要使一个区和一个进程地址空间联系起来。
6. sleep和wakeup
在一个事件上睡眠,实际上是将一组时间映射到一组虚地址上,代表这些时间的地址被编码在内核中。
sleep将睡眠地址和优先级保存在进程表中,将进程放到睡眠进程的散列队列中。
wakeup对睡眠在输入的睡眠地址上的每个进程,将其状态置为就绪,并从睡眠进程队列移除,放到调度队列中。
阅读(1141) | 评论(0) | 转发(0) |