Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129791
  • 博文数量: 17
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-13 14:07
文章分类

全部博文(17)

文章存档

2011年(1)

2009年(5)

2008年(11)

我的朋友

分类: LINUX

2008-12-26 15:54:25


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对睡眠在输入的睡眠地址上的每个进程,将其状态置为就绪,并从睡眠进程队列移除,放到调度队列中。





阅读(1138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~