2012年(17)
分类: 虚拟化
2012-07-09 02:39:56
第七章 APO的进程
1、概述
APO智初有4G个信胞的空间(256TDY)或16PZ或32PB或64K个域YU。一个域YU有64K个信胞或4G个单元或256TZ字符。反映信胞行为的是进程。APO架构使用一种高速进程切换技术,单指令周期切换!进程都是在各自的空间中运行。
A界CPU用的是32位指令集, 方法(函数)及所有的代码不过是一个字数组BU32 XX[N]!
进程与程序的区别:程序是进程的静态文本,进程是执行程序的动态过程;一个进程可以执行一个或多个程序,几个进程可以同时执行一个程序;程序可作为软件资源长期保存,进程只是一次执行过程,是暂时的;进程是系统分配调度的独立单位,能与其他进程并发执行。进程执行的间断性,决定了进程可能具有多种状态。事实上,运行的进程可能具有就绪状态、执行状态、阻塞状态三种基本状态。当进程已分配到除CPU以外的所有必要资源时,它便处于就绪状态,一旦获得CPU,便立即执行。已获得CPU的进程进入执行状态。正在执行的进程,由于发生某个事件而暂时无法执行时,便放弃处理机而进入阻塞状态。由于执行的进程变为阻塞状态后,调度程序立即把处理机分配给另一个就绪进程;因此,阻塞进程的事件消失后,进程不会立即恢复到执行状态,而转变为就绪状态,重新等待处理机。在实际系统中,进程还有其它几个状态。有的系统有时希望能人为地把进程挂起,使之处于静止状态,以便研究其执行情况或对它进行修改。
进程的两个特点:
资源所有权: 进程是一个可拥有资源的独立单位;
调度/执行:进程同时又是一个可以独立调度和分派的基本单位;
因而在进程的创建、撤消和切换中,系统必须为之付出较大的时空开销。也因此,在系统中所设置的进程数目不宜过多,进程切换的频率也不宜过高,同时也限制了并发程序的进一步提高。
在系统中引入线程,是为了减少程序并发执行时所付出的时空开销,使系统具有更好的并发性。线程的实质: 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,一个进程可有多个线程;线程除运行必需的资源外,不拥有系统资源,但它可与同属一进程的其它线程共享进程所拥有的全部资源;一个线程可创建和撤消另一线程;同一进程中的线程间可并发执行;线程间相互制约;线程在运行中呈现间断性;线程有就绪、阻塞、执行三种基本状态;线程具有许多传统进程所具有的特征,故又称轻型进程(Light-Weight-Process)或进程元;而把传统的进程称为重型进程(Heavy-Weight-Process),它相当于只有一个线程的任务。
APO的内核就相当于一个根进程,节点描述符是0。内存文件系统是小模式,只有64K个描述符,低端的0--8K个描述符是内核线程、设备文件、用户进程、内存段缓冲区等内核文件所有。一个用户进程只有一个描述符,用户线程是共用进程描述符的;而内核线程是独立的一个节点描述符。内核的节点描述符只有32Z,占用内存32*64KZ = 2MZ。调度策略有:
SCHED_OTHER 0 非实时进程,基于优先权的轮转法(round robin)。
SCHED_FIFO 1 实时进程,用基于优先权先进先出算法。
2、APO的进程文件
A界的对象都对应有最少一个描述文档;程序代码是描述对象的行为,所以一个对象必定对应有一个代码执行文档;一个代码执行文档可对应某对象类的n个对象文档。我们在电脑上用鼠标、键盘操作,是由用户外壳(SHELL)进程管理的。当鼠标双击一个对象描述文档图标时,它相应的代码文档也会被打开。首先是SHELL进程把鼠标双击一个对象描述文档图标转化为打开该文档的消息通知文件管理者。文件管理者在DDR内的目录文档查找该文档的基本属性,找到它相应的代码文档;并做进程号分配的系统调用,如果成功则装入相应的代码文档到进程CACHE;并置该进程为就绪态。
SNP为对象间的通信协议,非内核进程通过SNP对象通信线程来与对象管理者通信。为实现资源的互斥,所有的通信都是通过通信管理者来实施。
SNP协议: 8Z的SNP 描述了对象间的简单通信协议。
SNP{
BU16 msg_no; // 16位消息协议操作集。
BU16 fu_no; // 服务方的对象进程号。
BU16 kh_no; // 客户方的对象进程号。
BU16 TXC1; // 通信参数1,通常是长度
BU32 TXC2; // 通信参数2,通常是接收方数据空间的目标开始地址。
BU32 TXC3; // 通信参数3,通常是发送方数据空间的源开始地址。
}
进程节点描述符定义:32Z
WJT {
BU16 JDFS; // 所属内存根目录中本节点的节点描述符ID号。
BU16 FJDFS; // 所属内存根目录中的父节点的节点描述符ID号。
BU32 WJDFS; // 描述进程文件的外部节点描述符在内存中的位置。
BU32 files; // 包含了进程当前所打开的文件或资源的单元指针表,最大32K。
BU16 JDPWD; // 所属内存根目录中当前目录的节点描述符ID号。
BU16 priori; // 描述进程的静态优先级。最大4K个进程。
BU16 priority; // 描述进程的动态优先级,刚开始时counter = priority。
BU16 counter; // tick(时钟中断)减1,减到0时引起新一轮调度,空闲线程重置。
BU32 statef; // 进程的状态与标志,是否被修改过,被锁定,用于同步操作等。
BU8Z SNP; // 用于进程通信的域。
BU32 timeout; // 软件定时,指出进程间隔多久被重新唤醒。采用tick为单位。
BU16 it_real_value; // 初值,用于itimer(interval timer)软件定时。
BU16 it_real_incr; // t_real_value减到0/每个ticki时, 置标志并重置初值。
BU16 it_virt_value; // 初值,用于进程用户态执行时间的itimer软件定时。
BU16 it_virt_incr; // it_virt_value减到0/每个ticki时, 置标志并重置初值。
BU16 it_prof_value; // 初值,用于在用户态或内核态运行的itimer软件定时。
BU16 it_prof_incr; // it_ prof_value减到0/每个ticki时, 置标志并重置初值。
BU32 start_time; // 创建该进程的时间。
BU16 processor; // 进程正在使用的CPU。
BU16 last_processor;// 进程最后一次使用的CPU。
}
进程文件头(节点描述符)的定义: 64Z。节点树的节点数小于等于4G。
WJT {
BU20Z DXBU; // 进程文件标识。
BU32 FJDHU; // 所属卷根目录中的父节点的ID号。
BU32 JDHU; // 所属卷根目录中本节点的ID号。
BU32 CUVVB; // 取决于文件类型,通常是文件数据流的簇指针表的指针。
BU32 KWT; // 小文件时是块位图。
BU36Z WJMZ; // 最大36字符的文件名字。
}
进程文件的唯一标识:
DXBU{ // 进程文件标识
BU16 JDFS; // 所属内存根目录中本节点的节点描述符ID号。
BU48 UJID; // 进程文件的出生时间标识,单位10mS。
BU32 BBID; // 进程文件版本号或种类的细分或进化标识。
BU16 VLID; // 进程文件所属种类。/打开对象的方式/
BU16 IUDX; // 描述进程文件的初始大小(字符数)。
BU16 i_nlink; // 与进程文件建立链接的文件数
BU16 i_count; // 引用计数器
BU16 FWQX; // 描述进程文件的访问权限。
BU16 leader; // 描述进程的特权用户-主管级别,可对某一目录下有权限。
BU16 UID; // 描述运行进程的拥有者标识。
BU16 GID; // 描述运行进程的用户组标识。
BU16 FSUID; // 描述文件系统的拥有者标识。
BU16 FSGID; // 描述文件系统的用户组标识。
BU32 ZHFWUJ; // 进程文件最后访问日期时间标识。
BU32 ZHXGUJ; // 进程文件最后修改日期时间标识。
}