① 为什么说OS实现了对计算机资源的抽象
OS首先在裸机上覆盖一层I/O设备管理软件,实现了对计算机硬件操作的第一层次抽 象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。
② 存储管理的抽象模型
虚拟地址到物理地址映射的抽象模型
在讨论Linux是如何具体实现对虚拟内存的支持前,有必要看一下更简单的抽象模型。
在处理器执行程序时需要将其从内存中读出再进行指令解码。在指令解码之前它必须向内存中某个位置取出或者存入某个值。然后执行此指令并指向程序中下一条指令。在此过程中处理器必须频繁访问内存,要么取指取数,要么存储数据。
虚拟内存系统中的所有地址都是虚拟地址而不是物理地址。通过操作系统所维护的一系列表格由处理器实现由虚拟地址到物理地址的转换。
为了使转换更加简单,虚拟内存与物理内存都以页面来组织。不同系统中页面的大小可以相同,也可以不同,这样将带来管理的不便。Alpha AXP处理器上运行的Linux页面大小为8KB,而Intel X86系统上使用4KB页面。每个页面通过一个叫页面框号的数字来标示(PFN) 。
页面模式下的虚拟地址由两部分构成:页面框号和页面内偏移值。如果页面大小为4KB,则虚拟地址的 11:0位表示虚拟地址偏移值,12位以上表示虚拟页面框号。处理器处理虚拟地址时必须完成地址分离工作。在页表的帮助下,它将虚拟页面框号转换成物理页面框号,然后访问物理页面中相应偏移处。
图3.1给出了两个进程X和Y的虚拟地址空间,它们拥有各自的页表。这些页表将各个进程的虚拟页面映射到内存中的物理页面。在图中,进程X的虚拟页面框号0被映射到了物理页面框号1。理论上每个页表入口应包含以下内容:
1、有效标记,表示此页表入口是有效的
2、页表入口描叙的物理页面框号
3、访问控制信息。用来描叙此页可以进行哪些操作,是否可写?是否包含执行代码?
4、虚拟页面框号是为页表中的偏移。虚拟页面框号5对应表中的第6个单元(0是第一个)。
为了将虚拟地址转换为物理地址,处理器首先必须得到虚拟地址页面框号及页内偏移。一般将页面大小设为2的次幂。将图3.1中的页面大小设为0x2000字节(十进制为8192)并且在进程Y的虚拟地址空间中某个地址为0x2194,则处理器将其转换为虚拟页面框号1及页内偏移0x194。
处理器使用虚拟页面框号为索引来访问处理器页表,检索页表入口。如果在此位置的页表入口有效,则处理器将从此入口中得到物理页面框号。如果此入口无效,则意味着处理器存取的是虚拟内存中一个不存在的区域。在这种情况下,处理器是不能进行地址转换的,它必须将控制传递给操作系统来完成这个工作。
某个进程试图访问处理器无法进行有效地址转换的虚拟地址时,处理器如何将控制传递到操作系统依赖于具体的处理器。通常的做法是:处理器引发一个页面失效错而陷入操作系统核心,这样操作系统将得到有关无效虚拟地址的信息以及发生页面错误的原因。
再以图3.1为例,进程Y的虚拟页面框号1被映射到系统物理页面框号4,则再物理内存中的起始位置为 0x8000(4 * 0x2000)。加上0x194字节偏移则得到最终的物理地址0x8194。
通过将虚拟地址映射到物理地址,虚拟内存可以以任何顺序映射到系统物理页面。例如,在图3.1中,进程X的虚拟页面框号0被映射到物理页面框号1而虚拟页面框号7被映射到物理页面框号0,虽然后者的虚拟页面框号要高于前者。这样虚拟内存技术带来了有趣的结果:虚拟内存中的页面无须在物理内存保持特定顺序。
③ 如何将实体抽象成数据模型这类的拜托了各位 谢谢
联系:实体集之间的对应关系称为联系,它反映现实世界事物之间的相互关联。联系分为两种,一种是实体内部各属性之间的联系。另一种是实体之间的联系。 机器世界 存入计算机系统里的数据是将概念世界中的事物数据化的结果。为了准确地反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示。数据模型将概念世界中的实体,及实体间的联系进一步抽象成便于计算机处理的方式。 数据模型由三部分组成,即模型结构、数据操作和完整性规则。这里主要介绍模型结构。DBMS所支持的数据模型分为四种:层次模型、网状模型、关系模型、面向对象模型。其中第四种数据模型目前并未成熟,因此传统的说法有前三种数据模型。 1、基本层次联系 层次模型和网状模型有共同点,可以把它们统称为格式化模型。基本层次联系就是包括两结点和一边的基本单元,两个实体间的有向边代表的基本层次联系表示一对多的联系。通常把表示1的实体放在上方,称为父结点,把表示N的实体放在下面,称为子结点。 2、层次数据模型 用村形结构表示实体及其之间的联系的模型称为层次模型。该模型的实际存储数据由链接指针来体现联系。特点:有且仅有一个结点无父结点,此结点即为根结点;其它结点有且仅有一个父结点。适合用表示一对多的联系。 3、网状模型 用网状结构表示实体及其之间的联系的模型称为网状模型。允许结点有多于一个的父结点,可以有一个以上的结点无父结点。适合用于表示多对多的联系。 层次模型和网状模型从本质上都是一样的。存在的缺陷:难以实现系统扩充,插入或删除数据时,涉及到大量链接指针的调整。
④ 阅读STL(Standard Template Library)中有关常见的抽象数据类型的实现源码并应用 要求:
阅读STL(Standard Template Library)中有关常见的抽象数据类型的实现源码并应用。(30分)
抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。在STL中实现了堆栈(stack)、队列(queue)、堆(heap)、优先队列(priority-queue)等抽象数据类型,每种类型都具有常用的操作。
要求:选其中一种抽象数据类型阅读其实现原理(不局限于以上列出的数据类型),其后根据自己的理解书写阅读心得,可将其与第1部分自己实现的数据结构进行比较优劣,并就自己选择的数据类型举一个应用例子实现。所选择例子可以是北大OJ上的题目,也可以是自己想到的合适应用实例。不管是何种情况,要有相应的源码实现。
有关STL的相应介绍可参考附件的《STL源码剖析》。
⑤ 统一软件过程的核心工作流
RUP中有9个核心工作流,分为6个核心过程工作流(Core Process Workflows)和3个核心支持工作流(Core Supporting Workflows)。尽管6个核心过程工作流可能使人想起传统瀑布模型中的几个阶段,但应注意迭代过程中的阶段是完全不同的,这些工作流在整个生命周期中一次又一次被访问。9个核心工作流在项目中轮流被使用,在每一次迭代中以不同的重点和强度重复。
1. 商业建模(Business Modeling)
商业建模工作流描述了如何为新的目标组织开发一个构想,并基于这个构想在商业用例模型和商业对象模型中定义组织的过程,角色和责任。
2. 需求(Requirements)
需求工作流的目标是描述系统应该做什么,并使开发人员和用户就这一描述达成共识。为了达到该目标,要对需要的功能和约束进行提取、组织、文档化;最重要的是理解系统所解决问题的定义和范围。
3. 分析和设计(Analysis & Design)
分析和设计工作流将需求转化成未来系统的设计,为系统开发一个健壮的结构并调整设计使其与实现环境相匹配,优化其性能。分析设计的结果是一个设计模型和一个可选的分析模型。设计模型是源代码的抽象,由设计类和一些描述组成。设计类被组织成具有良好接口的设计包(Package)和设计子系统(Subsystem),而描述则体现了类的对象如何协同工作实现用例的功能。 设计活动以体系结构设计为中心,体系结构由若干结构视图来表达,结构视图是整个设计的抽象和简化,该视图中省略了一些细节,使重要的特点体现得更加清晰。体系结构不仅仅是良好设计模型的承载媒介,而且在系统的开发中能提高被创建模型的质量。
4. 实现(Implementation)
实现工作流的目的包括以层次化的子系统形式定义代码的组织结构;以组件的形式(源文件、二进制文件、可执行文件)实现类和对象;将开发出的组件作为单元进行测试以及集成由单个开发者(或小组)所产生的结果,使其成为可执行的系统。
5. 测试(Test)
测试工作流要验证对象间的交互作用,验证软件中所有组件的正确集成,检验所有的需求已被正确的实现, 识别并确认缺陷在软件部署之前被提出并处理。RUP提出了迭代的方法,意味着在整个项目中进行测试,从而尽可能早地发现缺陷,从根本上降低了修改缺陷的成本。测试类似于三维模型,分别从可靠性、功能性和系统性能来进行。
6. 部署(Deployment)
部署工作流的目的是成功的生成版本并将软件分发给最终用户。部署工作流描述了那些与确保软件产品对最终用户具有可用性相关的活动,包括:软件打包、生成软件本身以外的产品、安装软件、为用户提供帮助。在有些情况下,还可能包括计划和进行beta测试版、移植现有的软件和数据以及正式验收。
7. 配置和变更管理(Configuration & Change Management)
配置和变更管理工作流描绘了如何在多个成员组成的项目中控制大量的产物。配置和变更管理工作流提供了准则来管理演化系统中的多个变体,跟踪软件创建过程中的版本。工作流描述了如何管理并行开发、分布式开发、如何自动化创建工程。同时也阐述了对产品修改原因、时间、人员保持审计记录。
8. 项目管理(Project Management)
软件项目管理平衡各种可能产生冲突的目标,管理风险,克服各种约束并成功交付使用户满意的产品。其目标包括:为项目的管理提供框架,为计划、人员配备、执行和监控项目提供实用的准则,为管理风险提供框架等。
9. 环境(Environment)
环境工作流的目的是向软件开发组织提供软件开发环境,包括过程和工具。环境工作流集中于配置项目过程中所需要的活动,同样也支持开发项目规范的活动,提供了逐步的指导手册并介绍了如何在组织中实现过程。
⑥ 抽象逻辑思维是什么的核心
抽象逻辑思维
以抽象概念为形式的思维,是人类思维的核心形态.它主要依靠概念、判断和推理进行思维,是人类最基本也是运用最广泛的思维方式.一切正常人都具备逻辑思维能力,但一定有高下之分.
⑦ 领域模型的抽象业务模型
经过分析,我们得出的实体是苹果、梨、葡萄、橘子、香蕉、荔枝、核桃,这些是不是模型呢?应该说还不是,还要经过进一步分析:在我们分析的业务领域内,它们有没有共性?苹果、梨、葡萄、橘子、香蕉、荔枝属于水果,核桃属于干果,它们都是果品的一个具体实例。而在水果中葡萄和荔枝属于不宜保存水果,通过这样进一步的分析得出如下的领域模型:
果品进销存领域模型
这个领域模型不但能反映当前的经营实体,同时给我们需求分析人员和系统功能提供了一定的扩展视野:将来会不会经营食品,短期保持水果采取什么利润空间来促销,长期保存的水果会不会因为保存成本而导致利润下降。
⑧ 抽象模型有哪些
几何,数学,五行,阴阳,八卦,五脏六腑,十二脉。
⑨ 什么是抽象数据模型主要特点是什么
数据抽象
概念结构是对现实世界的一种抽象
从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
把这些特性用各种概念精确地加以描述
这些概念组成了某种模型
三种常用抽象
1. 分类(Classification)
定义某一类概念作为现实世界中一组对象的类型
这些对象具有某些共同的特性和行为
它抽象了对象值和型之间的“is member of”的语义
在E-R模型中,实体型就是这种抽象
2. 聚集(Aggregation)
定义某一类型的组成成分
它抽象了对象内部类型和成分之间“is part of”的语义
在E-R模型中若干属性的聚集组成了实体型,就是这种抽象
3. 概括(Generalization)
定义类型之间的一种子集联系
它抽象了类型之间的“is subset of”的语义
概括有一个很重要的性质:继承性。子类继承超类上定义的所有抽象。
注:原E-R模型不具有概括,本书对E-R模型作了扩充,允许定义超类实体型和子类实体型。
用双竖边的矩形框表示子类,
用直线加小圆圈表示超类-子类的联系
数据抽象的用途
对需求分析阶段收集到的数据进行分类、组织(聚集),形成
实体
实体的属性,标识实体的码
确定实体之间的联系类型(1:1,1:n,m:n)
/**************稀疏矩阵的抽象数据模型**************/
#include<iostream>
#include<cstdlib>
using namespace std;
/***Writed by Yecon***/
const int MaxTerms = 20; //三元组表smArray中三元组个数的最大值
template <class Type> class SparseMatrix; //稀疏矩阵的类声明
template <class Type> class Trituple
{
//三元组类
friend class SparseMatrix<Type>;
private:
int row,col;
Type value;
};
template <class Type> class SparseMatrix
{
int Rows, //行数
Cols, //列数
Terms; //非零元个数
Trituple<Type> smArray[MaxTerms]; //三元组表
public:
SparseMatrix(int MaxRows,int MaxCols); //构造函数
bool input_data(int row,int col,Type value); //输入数据
SparseMatrix<Type> Transpose(); //转置矩阵
SparseMatrix<Type> Add(SparseMatrix<Type> b); //矩阵求和
SparseMatrix<Type> Mul(SparseMatrix<Type> b); //矩阵求积
SparseMatrix<Type> EmptyMatrix(); //返回零矩阵
};
template <class Type> SparseMatrix<Type>::SparseMatrix(int MaxRows,int MaxCols)
{
Rows = MaxRows; //行数置零
Cols = MaxCols; //列数置零
Terms = 0; //非零元个数置零
}
template <class Type> bool SparseMatrix<Type>::input_data(int row,int col,Type value)
{
if(Terms == MaxTerms || row > Rows || col > Cols)return false;
if(Terms == 0)//若是第一个元素
{
//插入第一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
if((row>smArray[Terms-1].row)||((row==smArray[Terms-1].row)&&(col>smArray[Terms-1].col)))//若是最后一个元素
{
//插入最后一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
//若非第一个活最后一个元素
//计算应该插入的位置
int k = Terms - 1;
for(int i = Terms - 1;i >= 0;i--)//确定行
if(smArray[i].row >= row)k = i;
for(int j = k;smArray[j].row == row;j++)//确定列
if(smArray[j].col <= col)k = j;
for(int i = Terms -1;i >= k;i--)//为待插入的元素腾出地方
smArray[i + 1] = smArray[i];
smArray[k].col = col;
smArray[k].row = row;
smArray[k].value = value;
Terms++;
return true;
}
template <class Type> SparseMatrix<Type> SparseMatrix<Type>:: Transpose()
{
//求矩阵的转置
int * rowSize = new int[Cols]; //辅助数组,统计个列非零元素个数
int * rowStart = new int[Cols]; //辅助数组,预计转置后各行存放位置
SparseMatrix<Type> b(Cols,Rows);//存放转置结果
// b.Rows = Cols;b.Cols = Rows;b.Terms = Terms;
if(Terms > 0)
{
//统计矩阵b中第i行非零元素个数
for(int i = 0;i < Cols;i++)rowSize[i] = 0; //清零
for(int i = 0;i < Terms;i++)rowSize[smArray[i].col]++;//根据矩阵this中第i个非零元素的列号,将rowSize相当该列的计数加1
//计算矩阵b第i行非零元素的开始存放位置
rowStart[0] = 0;
for(int i = 1;i < Cols;i++) //rowStart[i] = 矩阵b的第i行的开始存放位置
rowStart[i] = rowStart[i - 1] + rowSize[i - 1];
for(int i = 0;i < Terms;i++)
{
//从this向b传送
int j = rowStart[smArray[i].col]; //j为第i个非零元素在b中应存放的位置
b.smArray[j].row = smArray[i].col;
b.smArray[j].col = smArray[i].row;
b.smArray[j].value = smArray[i].value;
rowStart[smArray[i].col]++; //矩阵b第i行非零元素的存放位置加1
}
}
delete []rowSize;
delete []rowStart;
return b;
}
template <class Type> SparseMatrix<Type> SparseMatrix<Type>::Mul(SparseMatrix<Type> b)
{
//矩阵求积
if(Cols != b.Rows)
{
//this矩阵列数与b矩阵行数不能
cout << "Incompatible matrix" << endl;
return EmptyMatrix();
}
if(Terms == MaxTerms || b.Terms == MaxTerms) //有一个矩阵的项数达到最大
{
cout << "One additional space in a or b needed" << endl;
return EmptyMatrix(); //空间不足,返回空矩阵
}
int * rowSize = new int[b.Rows]; //辅助数组,矩阵b各行非零元素个数
int *rowStart = new int[b.Rows + 1]; //辅助数组,矩阵b各行的三元组起始位置
Type *temp = new Type[b.Cols]; //临时数组,暂存每一行计算结果
SparseMatrix<Type> result(Rows,Cols); //结果矩阵的三元组表
for(int i = 0;i < b.Rows;i++) rowSize[i] = 0; //统计矩阵b中第i行非零元素个数
for(int i = 0;i < b.Terms;i++)rowSize[smArray[i].row]++;
rowStart[0] = 0; //计算矩阵b第i行非零元素的开始位置
for(int i = 1;i <= b.Rows;i++)rowStart[i] = rowStart[i - 1] + rowSize[i - 1];
int Current = 0,lastInResult = -1;//a.smArray扫描指针及result存放指针
while(Current < Terms)
{
//生成result的当前行temp
int RowA = smArray[Current].row; //当前行的行号
for(int i = 0;i < b.Cols;i++)temp[i] = 0; //temp初始化
while(Current < Terms && smArray[Current].row == RowA)
{
int ColA = smArray[Current].col; //矩阵A当前扫描到元素的列号
for(int i = rowStart[ColA];i < rowStart[ColA + 1];i++)
{
int ColB = b.smArray[i].col; //矩阵b中相乘元素的列号
//A的RowA行与b的ColB列相乘
temp[ColB] = temp[ColB] + smArray[Current].value * b.smArray[i].value;
}
Current++;
}
for(int i = 0;i < b.Cols;i++)
if(temp[i] != 0)
{
//将temp中的非零元素压缩到result中去
lastInResult++;
result.smArray[lastInResult].row = RowA;
result.smArray[lastInResult].col = i;
result.smArray[lastInResult].value = temp[i];
}
}
result.Rows = Rows;
result.Cols = b.Cols;
result.Terms = lastInResult + 1;
delete []rowSize;
delete []rowStart;
delete []temp;
return result;
}
template <class Type> SparseMatrix<Type> SparseMatrix<Type>::EmptyMatrix()
{
SparseMatrix<Type> Z(0,0);
return Z;
}
int testSparseMatrix()//main()
{
SparseMatrix<int> A(7,8);
A.input_data(0,6,15);
A.input_data(0,3,22);
A.input_data(4,0,91);
A.input_data(2,3,-6);
A.input_data(1,5,17);
A.input_data(5,2,28);
A.input_data(1,1,11);
A.input_data(3,5,39);
//test Transpose()
SparseMatrix<int> B(8,7);
B = A.Transpose();
//test Mul()
SparseMatrix<int> C(7,4);
C.input_data(2,3,5);
C.input_data(1,1,10);
C.input_data(5,2,2);
SparseMatrix<int> D(8,4);
D = B.Mul(C);
return 0;
}
⑩ 什么是抽象模型
你是西邮的吧,我是李老师,这个题目的答案你是搜不到的,我在第一节课上面讲过,自己回去看看笔记吧。
其实我只是大二通工的一个学生,骗你们的啦,下午就要收啦,大家都要给力哦,亲!