第一部分
- 桶排序
- 又要代码精简,又要运行效率提高,分别在 C 语言和 C++语言里面,你如何做优化?对于参加过算法比赛的学生来说这应该不难。在 C 里面比如把递归改成迭代,通过设置判断变量减少不必要的循环次数,在 C++比如用引用传递代替值传递
- 贪心算法,原理是什么
使用贪心算法需要具备两个性质:贪心选择性和最优子结构。贪心选择性是指所求问题的整体最优解可以通过一系列可以通过一系列局部最优的选择来达到。他总是作出当前最好的选择,该选择可以依赖于之前的选择,但绝不依赖于将来的选择和子问题的选择,这是他与动态规划的重要区别。最优子结构是指一个问题的最优解包含其子结构的最优解。在证明这两个性质的时候,比较好证的是证明最优子结构。最优子结构一般通过反证法证明,即,如果该问题的最优解不是子问题的最优解,那么假设子问题有一个最优解,然后由该最优解构造出原问题的一个最优解,产生了矛盾。需要注意的是,子问题是指作出贪心选择之后的子问题。贪心选择性的证明一般先假设一个问题的最优解,据此构造另一个最优解,使其第一步是贪心选择
- 什么是优先级数组?
每个运行队列都有两个优先级数组,一个活跃的和一个过期的。优先级数组在 kernel/ sched.c 中被定义,它是 prio_array类型的结构体。优先级数组是一种能够提供 O(1)级算法复杂度的数据结构。优先级数组使可运行处理器的每一种优先级都包含一个相应的队列,而这些队列包含对应优先级上的可执行进程链表。优先级数组还拥有一个优先级位图,当需要查找当前系统内拥有***优先级的可执行进程时,它可以帮助提高效率。
- OS 的三个指标是什么
吞吐量,响应速度,资源利用率
- 最常用的嵌入式操作系统是什么
Linux Android
-
- 进程的特征:动态性,并发性,独立性,异步性,结构性【程序段,数据段,进程控制块 PCB()】
- 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器( PC),线程之间切换的开销小。
- 同一进程的线程独享的资源有
a. 栈 栈是独享的
b. 寄存器 这个可能会误解,因为电脑的寄存器是物理的,
每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器 PC
- 在实时系统里面主要是用其中的哪一个进程调度算法?
可抢占优先级调度
- 死锁必要条件
互斥、不可剥夺、请求与保持、循环等待
- BIOS 做好检查、初始化工作,找到 MBR, MBR里的引导程序检查分区表并找到主分区,主分区的系统引导程序再去引导加载系统。
- 立即数寻址是直接给出操作数,直接寻址给出的是地址
- 总线周期。通常把 CPU 通过总线对微处理器外部 (存储器
或 I/O 端口 ) 进行一次访问所需要时间称为回一个总线周期 。
- 机器周期。在计算机中, 为了便于管理, 常把一条指令的执行过度程划分为若干个阶段, 每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完 成一个基本操作所需知要的时间称为机器周期。
- CDN 是什么
CDN 的全称是 Content Delivery Network,即内容分发网络。CDN 是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 CDN 的关键技术主要有内容存储和分发技术。
- JSP 与 html 有什么区别?
1、 HTML 能直接打开, jsp 只能发布到 Tomact 等服务器上才能打开 。
2、定义上 HTML 页面是静态页面可以直接运行, JSP 页面是动态页它运行时需要转换成 servlet
3、他们的表头不同,这个是 JSP 的头“ <%@ page
language="java" import="java.util.*"
pageEncoding="gbk"%>”在表头中有编码格式和倒入包等。
4、在 jsp 中用<%%>就可以写 Java 代码了,而 html 没有<%%>
二、在 html 里面是无法进行 java 编写的。原因: JSP 页面是动态页, HTML 是静态的。所以不支持。
定义:
1、 JSP:全名为 Java Server Pages,中文名叫 java 服务器页面,其根本是一个简化的 Servlet 设计,它是由 Sun
Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准。
2、 HTML:超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。
扩展资料:
jsp 与 servlet 的联系:
JSP 是 Servlet 技术的扩展,本质上就是 Servlet 的简易方式。JSP 编译后是“类 servlet”。
Servlet 和 JSP 最主要的不同点在于: Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 里分离开来。而JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。
JSP 侧重于视图, Servlet 主要用于控制逻辑 Servlet 更多的是类似于一个 Controller,用来做控制。
- 面向对象的 6 大原则:开闭原则(OCP),李氏替换原则
(LSP),依赖注入原则(DIP),接口隔离(ISP),单一职责(SRP),
迪米特法则(LKP)。
-
- malloc 函数分配的内存是在哪里?
在 C 语言中,根据数据在内存中存在的时间(生存周期)不同,将内存空间分为三个区:
1)程序区:用于存储程序的代码,即程序的二进制代码。
2)静态存储区:用于存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了。
3)动态存储区:用于在程序执行时分配的内存,又分为:堆区( heap)和栈区( stack)。堆区:用于动态内存分配,程序运行时由内存分配函数在堆上分配内存。在 C 语言中,只能使用指针才能动态的分配内存。栈区:在函数执行时,函数内部的局部变量和函数参数的存储单元的内存区域,函数运行结束时,这些内存区域会自动释放。
- java 的开发模式
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
二、设计模式的六大原则
1、开闭原则( Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则( Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
—— From Baidu 百科
3、依赖倒转原则( Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则( Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)( Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则( Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
一.工厂模式【普通工厂模式,】
多个类实现一个抽象接口,一个工厂根据条件返回一个特定的实例。
单例模式
数据库 Connection 只有一个适配器模式。适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题
- RUP( Rational Unified Process), 统一软件开发过程, 统一软件过程是一个面向对象且基于网络的程序开发方法论。软件统一过程( RUP)是 Rational 软件公司( Rational 公司被 IBM 并购)创造的软件工程方法 [1] 。 RUP 描述了如何有效地利用商业的可靠的方法开发和部署软件,是一种重量级过程(也被称作厚方法学),因此特别适用于大型软件团队开发大型项目。
RUP 最重要的它有三大特点: 1)软件开发是一个迭代过程,2)软件开发是由 Use Case 驱动的, 3)软件开发是以架构设计( Architectural Design)为中心的。
- 敏捷软件开发(英语: Agile software development),又称敏捷开发,是一种从 1990 年代开始逐渐引起广泛关注的新型软件开发方法,是一种能应对快速变化需求的软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发过程中人的作用。敏捷开发是一种从 1990 年代开始逐渐引起广泛关注的新型软件开发方法,是一种能应对快速变化需求的软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于"非敏捷",更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重做为软件开发中人的作用。敏捷软件开发描述了一套软件开发的价值和原则,在这些开发中,需求和解决方案皆通过自组织跨功能团队达成。敏捷软件开发主张适度的计划、进化开发、提前交付与持续改进,并且鼓励快速与灵活的面对开发与变更。这些原则支援许多软件开发方
法的定义和持续进化。 [1]
极限编程( ExtremeProgramming,简称 XP)是由 KentBeck在 1996 年提出的,是一种软件工程方法学,是敏捷软件开发中可能是最富有成效的几种方法学之一。如同其他敏捷方法学,极限编程和传统方法学的本质不同在于它更强调可适应性而不是可预测性。极限编程是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。
XP 是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。
极限编程的主要目标在于降低因需求变更而带来的成本。在传统系统开发方法中, 系统需求是在项目开发的开始阶段就确定下来,并在之后的开发过程中保持不变的。这意味着项目开发进入到之后的阶段时出现的需求变更(而这样的需求变更在一些发展极快的领域中是不可避免的)将导致开发成本急速增加。极限编程透过引入基本价值、原则、方法等概念来达到降低变更成本的目的。一个应用了极限编程方法的系统开发项目在应对需求变更时将显得更为灵活。
- 数据库 6 个设计阶段
系统需求分析阶段;
概念结构设计阶段;
逻辑结构设计阶段;
物理结构设计阶段;
数据库实施阶段;
数据库运行与维护阶段;
- 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
-
- acid 是什么
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:
原子性( Atomicity) 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚( Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性( Consistency) 事务必须始终保持系统处于一致的状态
隔离性( Isolation) 使得在同一时间仅有一个请求用于同一数据。
持久性( Durability) 在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。一个支持事务( Transaction)的数据库,必须要具有这四种特性,否则在事务过程( Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求
- 离散:什么是偏序集
离散:群,集群等概念问题
怎么解决 12306 同时订票
怎么解决服务器主动访问客户端
如果电信服务器崩溃了使用他的相关网站怎么办
还有怎么解决大家访问网站上传下载资源慢,除了增加带宽
你说说软件工程和计算机技术这两个专业有什么区别?
- maven 具体是用来做什么的,我说了版本管理本地仓库架包依赖等等
Maven 是一个构建工具,服务与构建.使用 Maven 配置好项目后,输入简单的命令,如:mvn clean install,Maven 会帮我们处理那些繁琐的任务.Maven 是跨平台的.Maven 最大化的消除了构建的重复.Maven 可以帮助我们标准化构建过程.所有的项目都是简单一致的,简化了学习成本.总之,Maven 作为一个构建工具,不仅帮我们自动化构建,还能抽象构建过程,提供构建任务实现.他跨平台,对外提供一致的操作接口,这一切足以使他成为优秀的,流行的构建工具.但是 Maven 不仅是构建工具,他还是一个依赖管理工具和项目信息管理工具.他还提供了中央仓库,能帮我们自动下载构件.使用 Maven 还能享受一个额外的好处,即 Maven 对于项目目录结构、测试用例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置( Convention Over Configuration)。
- 又问了 springMVC, MVC 是什么意思我就说了 Model 模型层, Viewer 视图层, Controller 控制层,又讲了讲具体的流程,MVC 的全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。V 即 View 视图是指用户看到并与之交互的界面。比如由 html元素组成的网页界面,或者软件的客户端界面。 MVC 的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。M 即 model 模型是指模型表示业务规则。在 MVC 的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。C 即 controller 控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。最典型的 MVC 就是 jsp+servlet+javabean 模式。JavaBean 作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模
型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
JSP 作为表现层,负责提供页面为用户展示数据,提供相应的表单( Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。Serlvet 作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。
MVC 的优点:
1.耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动 MVC 的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2.重用性高
MVC 模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何 WEB( HTTP)浏览器或者无线浏览器( wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格
式化,所以同样的构件能被不同的界面使用。
3.部署快, 生命周期成本低
MVC 使开发和维护用户接口的技术含量降低。使用 MVC 模式使开发时间得到相当大的缩减,它使程序员( Java 开发人员)集中精力于业务逻辑,界面程序员( HTML 和 JSP 开发人员)集中精力于表现形式上。
4.可维护性高
分离视图层和业务逻辑层也使得 WEB 应用更易于维护和修改。
MVC 的缺点:
1.完全理解 MVC 比较复杂。
由于 MVC 模式提出的时间不长,加上同学们的实践经验不足,所以完全理解并掌握 MVC 不是一个很容易的过程。
2.调试困难。
因为模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试。
3.不适合小型,中等规模的应用程序
在一个中小型的应用程序中,强制性的使用 MVC 进行开发,往往会花费大量时间,并且不能体现 MVC 的优势,同时会使开发变得繁琐。
4.增加系统结构和实现的复杂性
对于简单的界面,严格遵循 MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
5.视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能
- 服务器怎么做到负载均衡
- 数据库, ER 模型转换成关系模型是数据库设计的第几个阶段。
第四步骤
第一步,规划。规划阶段的主要任务是进行建立数据库的必要性及可行性分析。如系统调查(即对企业全面调查,画出组织层次图,以了企业组织结构),可行性分析,确定 DBS(数据库系统)的总目标和制定项目开发计划。
第二步,需求分析。需求分析阶段应该对系统的整个应用情况作全面的、详细的调查,确定企业组织的目标,收集支持系统总的设计目标的基础数据和对这些数据的要求,确定用户的需求,并把这些要求写成用户和数据库设计者都能够接受的需求分析报告。 这一阶段的工作只要有, 分析用户活动, 产生业务流程图;确定系统范围,产生体统范围图;分析用户活动涉及的数据,产生数据流程图;分析系统数据,产生数据字典。
第三步, 概念设计。 概念设计的目标是产生反应企业组织信息需求的数据库概念结构,即设计出独立与计算机硬件和 DBMS(数据库管理系统)的概念模式。 E-R 模型是主要设计工具。
第四步,逻辑结构设计。其目的是把概念设计阶段设计好的全局 E-R 模式转换成与选用的具体机器上的DBMS 所支持的数据模型相符合的逻辑结构(包括数据库模式和外模式)。
第五步,数据库的物理设计。对于给定的数据模型选取一个最适合应用应用环境的物理结构的过程。数据库的物理结构主要指数据库的存储记录格式、存储记录安排和存取方法,完全依赖于给定的硬件环境赫尔数据库产品。
第六步,数据库的实现。该阶段主要有 3 项工作: 1 建立实际数据库结构 2 装入试验数据对应用程序进行调试 3 装入实际数据,进入试运行状态。
第七步,数据库的运行与维护。数据库系统的正式运行,标志着数据库设计与应用开发工作的结束和维护阶段的开始, 该阶段有 4 项任务: 1 维护数据库的安全性与完整性 2 监测并改善数据库运行性能 3 根据用户要求对数据库现有功能进行扩充 4 及时改正运行中发现的系统错误
- 数据库,数据模型有哪几种,说出至少两种的特征
1、 非关系模型
� 层次模型:记录之间的联系通过指针实现,查找效率高。
� 网状模型:一个结点可以有多于一个的双亲,允许一个以上的结点无双亲。
2、关系模型: 概念简单,结构清晰,用户易学易用
3、面向对象模型
4、对象关系模型
- 数据库的表怎样分级
- 数据库里,如何解决数据冗余问题
- 两个时钟不同步的设备怎么通信?
异步通信
异步通信的应答方式可分为
1、 不互锁: 主模块发出请求信号后, 不必等待接到从模块的回答信号, 而是经过一段时间, 确认从模块已经收到请求信号后,便撤销其请求新信号。
2、 半互锁:主模块发出请求信号,必须等待接到从模块的回答信号后再撤销其请求信号。
3、 全互锁:主模块发出请求信号,必须等待从模块回答后再撤销其请求信号;从模块发出回答信号后, 必须获知主模块请求信号已经撤销后,再撤销其回答信号
- 什么是基带信号?什么是宽带信号?
基带信号:将数字信号 1 或 0 直接用不同的电压来表示,然后送到电路上去传输。
宽带信号:将基带信号调制后形成的频分复用模拟信号。由于基带信号经过调制,其频谱移动到较高的频率处。由于每一路基带信号的频谱都被移动到不同的频段上,因此合在一起后并不会互相干扰,这样可以在一条电缆中传送多路的数字信号,因而提高了线路的利用率
- 6. java 与 C++区别他说他想问的是地址方面的.
1.指针
JAVA 语言让编程者无法找到指针来直接访问内存无指针, 并且增添了自动的内存管理功能, 从而有效地防止了 c/ c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说 JAVA 没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于 Java 程序的安全。
2.多重继承
c++支持多重继承, 这是 c++的一个特征, 它允许多父类派生一个类。 尽管多重继承功能很强, 但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。 Java 不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了 c++多重继承的功能,又避免了 c++中的多重继承实现方式带来的诸多不便。
3.数据类型及类
Java 是完全面向对象的语言, 所有函数和变量部必须是类的一部分。 除了基本数据类型之外, 其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。 而 c++允许将函数和变量定义为全局的。 此外, Java 中取消了 c/ c++中的结构和联合, 消除了不必要的麻烦。
4.自动内存管理
Java 程序中所有的对象都是用 new 操作符建立在内存堆栈上,这个操作符类似于 c++的 new 操作符。下面的语句由一个建立了一个类 Read 的对象,然后调用该对象的 work 方法:
Read r= new Read();
r.work();
语句 Read r= new Read();在堆栈结构上建立了一个 Read 的实例。 Java 自动进行无用内存回收操作,不需要程序员进行删除。 而 c 十十中必须由程序贝释放内存资源, 增加了程序设计者的负扔。 Java 中当一个对象不被再用到时, 无用内存回收器将给它加上标签以示删除。 JAVA 里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
5.操作符重载
Java 不支持操作符重载。操作符重载被认为是 c 十十的突出特征,在 Java 中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。 Java 语言不支持操作符重载是为了保持 Java 语言尽可能简单。
6.预处理功能
Java 不支持预处理功能。 c/ c++在编译过程中都有一个预编泽阶段, 即众所周知的预处理器。 预处理器为开发人员提供了方便, 但增加丁编译的复杂性。 JAVA 虚拟机没有预处理器, 但它提供的引入语句(import)与 c 十十预处理器的功能类似。
7. Java 不支持缺省函数参数,而 c++支持
在 c 中,代码组织在函数中,函数可以访问程序的全局变量。 c 十十增加了类,提供了类算法,该算法是与类相连的函数, c 十十类方法与 Java 类方法十分相似,然而,由于 c 十十仍然支持 c,所以不能阻止 c十十开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。
Java 没有函数, 作为一个比 c 十十更纯的面向对象的语言, Java 强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
8 字符串
c 和 c 十十不支持字符串变量,在 c 和 c 十十程序中使用 Null 终止符代表字符串的结束,在 Java 中字符串是用类对象(strinR 和 stringBuffer)来实现的,这些类对象是 Java 语言的核心,用类对象实现字符串有以下几个优点:
(1)在整个系统中建立字符串和访问字符串元素的方法是一致的;
(2)J3 阳字符串类是作为 Java 语言的一部分定义的,而不是作为外加的延伸部分;
(3)Java 字符串执行运行时检空,可帮助排除一些运行时发生的错误;
(4)可对字符串用“十”进行连接操作。
9“ goto 语句
“ 可怕” 的 goto 语句是 c 和 c++的“ 遗物” ,它是该语言技术上的合法部分,引用 goto 语句引起了程序结构的混乱, 不易理解, goto 语句子要用于无条件转移子程序和多结构分支技术。 鉴于以广理由, Java 不提供 goto 语句,它虽然指定 goto 作为关键字,但不支持它的使用,使程序简洁易读。
l0.类型转换
在 c 和 c 十十中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在 c 十十中可将一浮点值赋予整型变量, 并去掉其尾数。 Java 不支持 c 十十中的自动强制类型转换, 如果需要, 必须由程序显式进行强制类型转换。
11.异常
JAVA 中的异常机制用于捕获例外事件,增强系统容错能力
try{//可能产生例外的代码
}catch(exceptionType name){
//处理
}
其中 exceptionType 表示异常类型。而 C++则没有如此方便的机制
- 网络中有三个层有差错检验,每个层用什么方法,为什么用这种方法。
数据链路层:在数据链路层传送的帧中,广泛使用了循环冗余检验CRC 的检错技术。为了完成数据链路间的帧的正确传输。网络层:要检查 IP 分组的头部是否正确,为了完成端到端的分组的正确传输。
传输层:用了编码机制和窗口机制,为了完成端到端的消息的正确传输。为此要完成分组的排序、流量控制、差错控制等等功能
- 网络分层结构,数据链路层和网络层那个检测错误能力强。
数据链路层强
- 电脑开机以后都发生了什么?
计算机的整个启动过程分成四个阶段。
一、 第一阶段: BIOS
上个世纪 70 年代初, "只读内存"(read-only memory,缩写为ROM)发明,开机程序被刷入 ROM 芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序叫做"基本輸出輸入系統"(Basic Input/OutputSystem),简称为 BIOS。
1.1 硬件自检
BIOS 程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为 POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出 CPU、内存、硬盘等信息。
1.2 启动顺序
硬件自检完成后, BIOS 把控制权转交给下一阶段的启动程序。这时, BIOS 需要知道, "下一阶段的启动程序"具体存放在哪一个设备。也就是说, BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序"(BootSequence)。
打开 BIOS 的操作界面,里面有一项就是"设定启动顺序"。
二、 第二阶段:主引导记录
BIOS 按照"启动顺序", 把控制权转交给排在第一位的储存设备。这时,计算机读取该设备的第一个扇区,也就是读取最前面的 512个字节。如果这 512 个字节的最后两个字节是 0x55 和 0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前面的 512 个字节,就叫做"主引导记录"(Master bootrecord,缩写为 MBR)。
2.1 主引导记录的结构
"主引导记录"只有 512 个字节,放不了太多东西。它的主要作用是, 告诉计算机到硬盘的哪一个位置去找操作系统。
2.2 分区表
硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统, "主引导记录"因此必须知道将控制权转交给哪个区。分区表的长度只有 64 个字节,里面又分成四项,每项 16 个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区"。
三、 第三阶段:硬盘启动
这时,计算机的控制权就要转交给硬盘的某个分区了,
四、 第四阶段:操作系统
控制权转交给操作系统后,操作系统的内核首先被载入内存。至此,全部启动过程完成。
- 数据相关分为几种?举出一个 RAW 的例子?可以用什么技术解决数据相关,具体解决的是哪种相关。
相关的定义是针对指令的,即两条指令之间存在的依赖关系。有三种类型的相关:数据相关、名相关、控制相关
分类:写后读相关 RAW,读后写相关 WRR,写后写相关 WRW
数据相关:
写后读 RAW 相关:对应真数据相关时的情况,下一条指令依赖于上一条指令的执行结果,必须先将结果写入之后再由下一条指令来读。如果先读的话读到的是旧值,不是运算的正确输入。
写后写 WRW 相关:这个对应于输出相关,比如最后将要输出的值为后一条指令的执行结果,可是这条指令却先执行并写入了,之后执行了上一条指令的写入操作,对应于输出的结果而言就出现冲突了。
读后写 WAR 相关: 这个对应于名相关,指令在读取某一数据之前其读取的对象先被相关的指令写入了运算结果,这导致了读取的数据不是原来的数据,而是下一条指令运行的结果。
- VPN 和 NAT 的区别
VPN 和 NAT 通过重新构建一个 IP 首部来实现的,但是他们的实现又有区别。 VPN 是将内部 IP 数据报加密后打包成外部 IP 数据报的数据部分,他的主要目的是为了数据的保密性,而 NAT 是纯进行地址转换,它的目的是为了解决本地编址的内部网络与外网通信的问题。
- 说出至少三种数据库类型(层次,网状,关系)并简要解释了一下
层次模型:用树形结构来表示各类实体以及实体间的联系,有且只有一个节点没有双亲节点(根节点),其他的都有且只有一个双亲节点。只能能直接表示的是一对多联系。
优点:效率高结构清晰,性能优于关系数据库,不低于网状。缺点:现实世界很多联系都不是层次的,如节点间多对多联系,还有一个节点具有多个双亲的情况都不好表示。
网状模型:对于非层次关系的联系,用层次表示非树形结构是很不直接的,网状模型可以很好的表示,它允许有一个以上的节点没有双亲,一个节点也可以有多个双亲,可以更直接地描述现实世界。
优点:更直接描述现实世界,性能也较好,存取效率也较高。缺点:结构比较复杂不利于掌握,用户编程还得了解系统结构细节,加重了编程的负担。
关系模型:通常来看关系就是一张规范二维表,实体还是实体间的联系都用关系来表示,对数据的检索和更新结果也是关系。
优点:概念单一,用户易懂易用,而且存取路径是对用户透明的,从而有更高的数据独立性和安全性,也简化程序员的工作。缺点:查询效率往往不如格式化数据模型,为了提高性能,增加开发 DBMS 难度。关系数据库
- 简述关系与关系模式的区别。
关系实质是一张二维表,关系模式是对关系的描述,关系是关系模式在某一时刻的状态或内容。
关系模式是静态的、稳定的,而关系是动态的,随时间不断变化的,因为关系操作不断更新数据库中的数据。
通俗的说:关系是一张二维表,关系模式是表格的描述(表头),关系名是表名,元祖是一行,属性是列,分量一条记录中的一个列值。
- 关系的完整性(实体完整性、参照完整性、用户自定义)和数据库主键的约束性
实体完整性:关系的主码不能取空值,如果主码由若干属性组成都不能为空。实体以主码作为唯一性标识。
参照完整性:一个关系中的外码,或者取空值(若属性组全为空),或者等于它参照的那个关系的主码值。
用户自定义完整性:针对具体关系数据库的约束。
- 什么是 DDL、 DML、 DCL?(数据库语言有哪几种?)
数据定义语言(DDL): Create、 Drop、 Alter
数据操纵语言(DML): Insert、 Update、 Delete
数据控制语言(DCL): Grant、 Revoke
数据查询语言: Select
- 你认为哪种排序算法最优?
没有最好,只有最适合,若 n 较小,用简单的排序算法较好比如简单选择,直接插入,如果数据初始状态已经按关键字基本有序,则选用直接插入或冒泡较好。如果 n 较大应该考虑用那几个时间复杂度较好的算法,快速排序是被认为是目前基于比较的内部排序算法中最好的方法,当待排序关键字是随机分布时,快速排序的平均时间最短。如果对负辅助空间有限制则可以考虑堆排序,另外求大数据的最大的几个数,堆排序最适合。如果要求排序稳定可以考虑归并排序。如果 n 很大,记录的关键字位数较少且可以分解,采用基数排序较好。当记录本身信息量很大,为了避免移动,可以考虑链表。
- 进程间的通信有几种方式?
共享存储:在通信进程之间存在一块可直接访问的共享空间,通过对这段空间的读写实现进程之间的信息交换,在对共享空间进行写/读操作时,需要使用同步互斥工具。
消息传递:数据交换是以格式化的消息为但单位,操作系统提供的消息传递方式,有直接通信方式和间接通信方式。
管道通信:管道就是连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,向管道提供输入的发送进程以字符流形式将大量数据送入管道,接受管道输出的进程,则从管道中接受数据,为了协调双方通信,管道机制需提供互斥、同步和确定对方的存在。
- 三网融合,指哪三网?
电信网络:主要业务是电话,传真等。
有线电视网络:单向电视节目传输网络。
计算机网络:我们现在用的很多的局域网和 Internet 等。
- 什么是基带信号?什么是宽带信号?什么是模拟信号?什么是数字信号?
基带信号:将数字信号1或0直接用不同的电压来表示,然后送到电路上去传输。
宽带信号:将基带信号调制后形成的频分复用模拟信号。由于基带信号经过调制,其频谱移动到较高的频率处。由于每一路基带信号的频谱都被移动到不同的频段上,因此合在一起后并不会互相干扰,这样可以在一条电缆中传送多路的数字信号,因而提高了线路的利用率
- 异步通信的信源和信宿没有时钟同步信号,怎么解决这个问题?
采用曼彻斯特或者差分曼彻斯特。简述这两个的原理
- 列举数据链路层的协议,至少两个
HDLC: 是一个在同步网上传输数据、面向比特的数据链路层协议,该协议不依赖于任何一种字符编码集,数据报文可透明传输,用于实现透明传输的0比特填充法易于硬件实现,全双工通信,较高的数据链路传输效率。
PPP:是使用串行线路通信的面向字节的协议,协议应用在直接连接的两个节点的链路上,主要用来通过拨号或专线方式建立点对点连接发送数据,因特网用户连接到 ISP 就是使用 PPP 协议。 PPP 协议功能帧定界,以便接受端能找到帧的开始和结束位置,在同一条物理链路上支持多种网络层的协议,差错检测。 Ppp 协议将一个 IP 数据报封装成帧,既支持异步也支持同步面向比特流,还有一个用来建立、配置和测试数据链路连接的链路控制协议 LCP,和一套网络控制协议 NCP,其中的每一个协议支持不用的网络层协议。
- 数据链路层可靠传输只有超时重传。传输层 TCP 连接中传送的数据流中每一个字节都编上一个序号,确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。超时重传和冗余确认(ACK),可以缩短时间发送方收到同一个报文段的三个冗余确认,就重传,也成为快重传。
- 简述 IEEE 802.3 协议
是一种基于总线型的局域网标准描述物理层和数据链路层的 MAC 子层的实现方法。采用 CSMA/CD 方式对总线访问控制。以太网 MAC 帧,每一块网络适配器有一个地址,物理地址, MAC 地址长6字节,高24位厂商代码,低24位厂商自行分配。
- 简述 P2P 协议
P2P 思想是整个网络中的传输内容不再保存在中心服务器上,每个节点都同时具有上传下载功能,每个节点即作为客户访问其他节点资源,也作为服务器提供资源给其他节点访问,当前比较流行的 P2P 应用如 PPLive。
优点:减轻了服务器压力,消除对某个服务器的完全依赖,可以将任务分配到各个节点上。可扩展性好,传统服务器有响应和带宽限制,只能接受一定数量请求,网络健壮性强,单个节点失效也不会影响其他部分的节点。
缺点:占用用户过多内存资源,影响整机速度,也使网络变得非常拥堵。
- 什么是 386 保护模式?
80386有的一种工作模式,在这种模式下80386处理器才能充分发挥它的高性能特点。保护模式的特点:在保护模式下80386采用了全新的分段和分页内存管理技术,不仅允许直接寻址4GB 内存空间,而且允许使用虚拟存储器。支持多任务工作方式。可以使用0-3级优先级保护功能,实现程序与程序之间,用户与操作系统之间的保护与隔离,为多任务操作系统提供优化支持。而8086只支持单任务。还引入优先级概念。每个存放程序和数据的存储段都被赋予不用的优先级。 0为最高3为最低,实际上是某一任务使用处理器资源的权利, 0级可以使用整个处理器资源,操作系统核心为0级, 1级赋予外设驱动,系统服务等, 2级用来保护一下子系统,如数据库系统。一般用户只能拥有3级权利,也称用户级。
- 8086 微处理器的组成和寻址方式,有哪些段寄存器?什么作用
总线接口部件 BIU:指令队列缓冲器、地址加法器、 4个段寄存器、 16位的指令指针寄存器和输入输出控制电路。 BIU 是8086与外部设备的借口负责处理所有总线操作。包括提供20位地址总线、 16位数据总线和所有的控制总线信号,并且生成2位物理地址,负责从内存指定地址处取出指令,送到指令队列缓冲器中排队,当需要操作数时,也由 BIU 从内存的指定地址中取出、传送给 EU 进行运算。执行部件 EU:包括4个通用寄存器、四个专用寄存器、标识寄存器、算数逻辑单元和EU 控制电路。 EU 负责指令的译码执行,指令规定的运算器都由 EU 完成。指令执行过程中取指令和译码执行阶段是分别由不同部件完成的。当 EU 执行一条指令时, BIU 就可以取出下一条指令,送往指令流队列中排队。在一条指令执行完以后,即可以立即执行吓一跳指令,减少 CPU 为取指令而等待的时间,提高了 CPU 利用率和整个微处理器的运行速度。寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址変址寻址、相对基址変址寻址。CS 代码段寄存器,存放当前程序所在段的首地址。 DS 数据段寄存器,存放当前程序所用数据段的首地址。 SS 堆栈段,存放当前程序所用堆栈段的首地址。 ES 附加段寄存器,存放附加数据所在段的首地址。
- call 和 return 具体做了哪些工作
call:参数压栈、返回地址压栈、保护现场
return:返回地址、恢复现场
- 什么是芯片组?有什么用?
芯片组(Chipset)是构成主板电路的核心。一定意义上讲,它决定了主板的级别和档次。它就是"南桥"和"北桥"的统称,就是把以前复杂的电路和元件最大限度地集成在几颗芯片内的芯片组。 芯片组是整个身体的神经,芯片组几乎决定了这块主板的功能,进而影响到整个电脑系统性能的发挥,芯片组是主板的灵魂。 芯片组性能的优劣,决定了主板性能的好坏与级别的高低。这是因为目前 CPU 的型号与种类繁多、功能特点不一,如果芯片组不能与 CPU 良好地协同工作,将严重地影响计算机的整体性能甚至不能正常工作。主板芯片组几乎决定着主板的全部功能。
北桥芯片:是主板芯片组中起主导作用的最重要的组成部分,也称为主桥。北桥芯片就是主板上离 CPU 最近的芯片,这主要是考虑到北桥芯片与处理器之间的通信最密切,为了提高通信性能而缩短传输距离。因为北桥芯片的数据处理量非常大,发热量也越来越大,所以现在的北桥芯片都覆盖着散热片或风扇用来加强北桥芯片的散热。提供对 CPU 类型和主频的支持、系统高速缓存的支持、主板的系统总线频率、 内存管理(内存类型、容量和性能)、 显卡插槽规格, ISA/PCI/AGP 插槽、 ECC 纠错等支持;南桥芯片:一般位于主板上离 CPU 插槽较远的下方, PCI 插槽的附近,这种布局是考虑到它所连接的 I/O 总线较多,离处理器远一点有利于布线。相对于北桥芯片来说,其数据处理量并不算大,所以南桥芯片一般都没有覆盖散热片。它提供了对 I/O 的支持,提供对KBC(键盘控制器)、 RTC(实时时钟控制器)、 USB(通用串行总线)、 Ultra DMA/33(66)EIDE数据传输方式和 ACPI(高级能源管理)等的支持,以及决定扩展槽的种类与数量、扩展接
口的类型和数量(如 USB2.0/1.1, IEEE1394,串口,并口, 笔记本的 VGA 输出接口)等
- 从抽象的角度说说什么是类的继承和泛化、 组合、 聚合
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力泛化表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。
一般化的关系是从子类指向父类的,与继承或实现的方法相反。关联关系的一种,是强的关联关系。聚合是整体和个体的关系。聚合关系也是通过实例变量实现的。例如汽车、发动机、轮胎,一个汽车对象由一个发动机对象,四个轮胎对象组成。
组合关系也是关联关系的一种,是比聚合关系更强的关系。合成关系是不能共享的。例如人有四肢、头等。表示类之间整体和部分的关系,组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
实现是说明和实体之间关系
- MVC 模型
MVC 是一个框架模式,它强制性的使应用程序的输入、 处理和输出分开。使用 MVC应用程序被分成三个核心部件: 模型、 视图、 控制器。它们各自处理自己的任务。视图是用户看到并与之交互的界面。模型表示企业数据和业务规则。控制器接受用户的输入并调用模型和视图去完成用户的需求,
- 计算机组成原理和计算机体系结构有什么区别
计算机体系结构是指那些被程序员看到的计算机系统的属性,这些属性通常被机器语言编程的程序员和汇编语言程序设计者以及汇编程序设计者看到(三者都对计算机系统中的传统机器 M1熟悉)。这些属性包括指令集,存储器寻址技术, I/O 机理等计算机组成是指如何实现计算机体系结构所体现的属性。简而言之就是实现计算机体系结构包含的属性。
两者的关系:存在两台机器体系结构相同,而组成不同。即结构与组成为一对多关系。
- 计算机系统层次结构
1)微程序机器层:硬件层,由机器硬件直接执行微指令
2)传统机器层:机器层,由微程序解释机器指令系统
3)操作系统层
4)汇编语言层
5)高级语言层
微程序机器和传统机器是物理机,其他是虚拟机
- DRAM 和刷新策略
1. 集中刷新:指在一个刷新周期内,利用一段固定的时间,进行刷新
2. 分散刷新:把每对每行刷新分散对各个工作周期中
3. 异步刷新:最大刷新间隔 2ms 除以行数,得每隔相应时长产生一次刷新请求。
- 控制器的功能和分类
功能: 1)从主存中取出一条指令,并指出下一条指令在主存中的位置
2)对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作
3)指挥并控制 CPU、主存、输入和输出设备之间的数据流动方向分类:硬布线控制器、微程序控制器
- CPU 控制方式
1) 同步控制方式:系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号。控制电路简单,但运行速度慢。
2) 异步控制方式:不存在基准时标信号,各部件按自身固有的速度工作,通过应答方式进行联络。运行速度快,但控制电路比较复杂。
3) 联合控制方式:同步和异步相结合,这种方式对各种不同的指令的微操作实行大部分同步、小部分异步的方法。
- 微指令的编码方式:
1)直接编码方式:简单、直观、执行速度快,操作并行性好;缺点是微指令字长过长,造成控制存储器容量极大。
2)字段直接编码方式:缩短了微指令的长度,但执行速度稍慢。
3)字段间接编码方式:进一步缩短了微指令字长,但削弱了并行控制能力。
- 微指令的格式: 1)水平型微指令:优点是微程序短,执行速度快;缺点是微指令长,编写微程序较麻烦。
2)垂直型微指令:优点是微指令短、简单、规整,便于编写微程序;缺点是微程序长,执行速度慢。
3)混合型微指令
- 总线基础知识
总线的特点:分时、共享
总线特性:机械特性、电气特性、功能特性、时间特性
总线分类:
1)片内总线
2)系统总线:数据总线、地址总线、控制总线
3)通信总线
总线仲裁:
1)集中仲裁:链式查询方式、计数器定时查询方式、独立请求方式 2
)分布仲裁
总线周期:申请分配阶段、寻址阶段、传输阶段、结束阶段
- I/O 接口的功能:
1)实现主机和外设的通信联络控制。
2)进行地址译码和设备选择
3)实现数据缓冲
4)信号格式的转换
5)传送控制命令和状态信息
- 保护模式和实模式?
保护模式:
寻址采用 32 位段地址和偏移量,最大寻址空间 4GB,最大分段4GB(PentiumPre 及以后为 64GB)。在保护模式下 CPU 可以进入虚拟 806 方式,这是在保护模式下的实模式程序运行环境。 保护模式下程序的运行:保护模式—从程序运行说起无论实模式还是保护模式,根本的问题还是程序如何在其中运行。因此我们在学习
保护模式时应该时刻围绕这个问题来思考。和实模式下一样,保护模式下程序运行的实质仍是“CPU 执行指令,操作相关数据”,因此实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,且功能、作用不变。那么保护模式下最大的变化是什么呢?答案可能因人而异,我的答案是“地址转换方式” 变化最大。
实模式:
实模式是指寻址采用和 806 相同的 16 位段地址和偏移量,最大寻址空间 1MB,最大分段 64KB。可以使用 32 位指令。 32 位的x86CPU 用作高速的 806。 实模式下程序的运行:程序运行的实质是什么?其实很简单,就是指令的执行,显然 CPU 是指令得以执行的硬件保障,那么 CPU 如何知道指令在什么地方呢?对了, 80x86系列是使用 CS 寄存器配合 IP 寄存器来通知 CPU 指令在内存中的位置.程序指令在执行过程中一般还需要有各种数据,80x86 系列有 DS、 ES、 FS、 GS、 S 等用于指示不同用途的数据段在内存中的位置。程序可能需要调用系统的服务子程序, 80x86 系列使用中断机制来实现系统服务。总的来说,这些就是实模式下一个程序运行所需的主要内容(其它如跳转、返回、端口操作等相对来说比较次要。 )
两者区别:
保护模式和实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的结果。 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有被区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并且改变了值,那么对于这个被修改的系统程序或用户程序,其后果很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样一来,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。至此,进程(这
时我们可以称程序为进程了)有了严格的边界,任何其他进程根本无法访问不属于自己的物理内存区域;甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库,这些区域也不能随意修改。 CPU 启动环境为 16 位实模式,之后可以切换到保护模式。但从保护模式无法
切换回到实模式
- 根据程序执行的互斥性和局部性两个特点,我们允许作业装入的时候只装入一部分,另一部分放在磁盘上,当需要的时候再装入到主存,这样以来,在一个小的主存空间就可以运行一个比它大的作业。同时,用户编程的时候也摆脱了一定要编写小于主存容量的作业的限制也就是说,用户的逻辑地址空间可以比主存的绝对地址空间要大。对用户来说,好像计算机系统具有一个容量很大的主存储器,称为“虚拟存储器”。虚存容量不是无限的,虚拟内存的最大容量是由计算机的地址结构确定的。且虚拟内存只是在逻辑上对内存容量加以扩充,其逻辑容量由内存容量和外存容量之和决定。地址总线结构能决定主存的访问范围。所以即使你的磁盘再大,但是地址寄存器访问主存的范围很小的话,虚拟存储器容量依然是很小的。
- 有哪些文件分配方式?
1. 连续分配
2. 链接分配
3. 索引分配
第二部分
- 文件存储空间管理有哪些方法?
1. 空闲表法
2. 成组链接法
3. 位图法
4. 空闲链表法
- 内存连续分配和非连续分配方式有哪几种?
1. 连续分配
a) 单一连续分配
b) 固定分区分配——内部碎片
c) 动态分配——外部碎片——首次、最佳、最坏、邻近适应
2. 非连续分配
a) 页式存储管理——页面、地址结构、页表、地址变换机构及变换过程、快表
b) 段式存储管理——段表、地址变换机构、段的共享与保护
c) 段页式存储管理——段表、页表
- 寻找中断源的方法有哪些?
寻找中断源可以用查询中断及矢量中断两种方法。
查询中断是采用软件查询方法,中断响应后启动中断查询程序,依次查询哪个设备的中断请求触发器为 1,检测到后,转向此设备预先设置的中断服务程序入口地址。此方法较简,单,但花费时间多,并且后面的设备服务机会少,在 806 系统中一般采用矢量中断方法。
矢量中断是将每个设备的中断服务程序的入口地址(矢量地址)集中, 依次放在中断向量表中。当 CPU 响应中断后,控制逻辑根据外设提供的中断类型号查找中断向量表,然后将中断服务程序的入口地址送到段寄存器和指令指针寄存器, CPU 转入中断服务子程序。这样大大加快了中断处理的速度。矢量中断:是根据 CPU响应中断时取得中断处理子程序入口地址的方式而得名的,它是一种寻找中断源的方法。它提供一个矢量,指向中断处理子程序的起始地址。
中断矢量:就是中断处理子程序的起始地址。
中断矢量表:全部矢量放在内存的某一区域中,形成一个中断矢量表
- 简述 open 打开文件的过程
首先,操作系统根据文件名 a, 在系统文件打开表中查找第一种情况:如果文件 a 已经打开,则在进程文件打开表中为文件 a 分配一个表项,然后将该表项的指针指向系统文件打开表中和文件 a对应的一项;然后再 PCB 中为文件分配一个文件描述符 fd,作为进程文件打开表项的指针,文件打开完成。
第二种情况:如果文件 a 没有打开,查看含有文件 a 信息的目录项是否在内存中,如果不在,将目录表装入到内存中,作为 cache;根据目录表中文件 a 对应项找到 FCB 在磁盘中的位置;将文件 a 的FCB 装入到内存中的 Activeinode 中;然后在系统文件打开表中为文件 a 增加新的一个表项,将表项的指针指向ActiveInode 中文件 a 的 FCB;然后在进程的文件打开表中分配新的一项,将该表项的指针指向系统文件打开表中文件 a 对应的表项;然后在PCB 中,为文件 a 分配一个文件描述符 fd,作为进程文件打开表项的指针,文件打开完成
- 常用的存储保护方法
1. 界限寄存器
2. 上下界寄存器方法
3. 基址、限长寄存器方法
4. 存储保护键:给每个存储块分配一个单独的存储键,它相当于一把锁。
- 交换技术,覆盖技术,以及两者的区别。
覆盖技术:把一个大的程序划分为一系列覆盖,每个覆盖是一个相对独立的程序单位,把程序执行时并不要求同时装入内存的覆盖组成一组,成为覆盖段,这个覆盖段分配到同一个存储区域,这个存储区域成为覆盖区,它与覆盖段一对应。覆盖段的大小由覆盖段中最大的覆盖来确定。(为了解决内存容量太小的问题,打破了必须将一个程序全部信息装入内存后才能运行的限制)交换技术:把暂时不用的某个程序及数据部分从内存移到外存中去,以便腾出必要的内存空间;或者把指定的程序或数据从外存读到相应的内存中,并将控制权交给他,让其在系统上运行的一种内存扩充技术。处理器的中级调度就是采用交换技术。
区别:
1. 与覆盖技术相比,交换技术不要求程序员给出的程序段之间的覆盖结构;
2. 交换技术主要在进程和作业之间进行,覆盖技术主要在同一个进程或作业中进行;
3. 覆盖技术只能覆盖于覆盖程序段无关的程序段,交换进程由换出和换入两个过程组成。
- Windows 下的内存是如何管理的?
Windows 提供了 3 种方法来进行内存管理:虚拟内存,最适合用来管理大型对象或者结构数组;内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据;内存堆栈,最适合用来管理大量的小对象。Windows 操纵内存可以分两个层面:物理内存和虚拟内存。 其中物理内存由系统管理,不允许应用程序直接访问,应用程序可见的只有一个 2G 地址空间,而内存分配是通过堆进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆大小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。如果要知道某个地址是否被占
用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。
- 说出你所知道的保持进程同步的方法?
进程间同步的主要方法有原子操作、信号量机制、自旋锁、管程、会合、分布式系统等
- 计算机网络的功能
1)数据通信
2)资源共享
3)分布式处理
4)提高可靠性
5)负载均衡
- 频分复用如何避免各路信号间的干扰?
答:为了防止子信道间的干扰,相邻信道之间需要加入“保护频带”。即在给定信道的.上下限处留出的未占用窄频带。其目的是确保信道间有足够隔离,防止相邻信道干扰。
- 随机访问介质访问控制
所有用户可随机发送信息,发送信息时占全部带宽。胜利者通过争用获得信道,从而获得信息的发送权。
1)纯 ALOHA 协议
不监听信道,不按时间槽发送,随机重发
冲突如何检测:接收方检测出错,不予确认,发送方在一定时间内收不到确认就判断发生冲突
冲突如何解决:超时后等待一个随机时间再重传数据
2)时隙 ALOHA 协议
把时间分成若干个相同的时间片,所有用户在时间片开始时刻同步接入网络信道,若发生冲突,则必须等待下一个时间片开始时刻再发送。
3) CSMA 协议(载波侦听多路访问)(Carrier Sense MultipleAccess)
1-坚持 CSMA:
思想:发送帧之前,先监听信道,信道空闲则直接传输,不必等待,信道忙则一直监听,直到空闲马上传输。如果有冲突,则等待一个随机长的时间再监听,重复上述过程。
优点:只要媒体空闲,站点就马上发送,避免了媒体利用率的损失。
缺点:若有两个或以上的站点有数据要发送,冲突就不可避免。
非坚持 CSMA:
思想:发送帧之前,先监听信道,信道空闲则直接传输,不必等待,信道忙则等待一个随机时间之后再监听。
4)介质访问控制方法: CSMA/CD、令牌总线和令牌环
5)局域网分类:以太网、令牌环网、 FDDI 网、 ATM 网、无线局域网
6) MAC 子层:介质访问控制子层,与接入传输媒体有关的内容都放在 MAC 子层,它向上屏蔽对物理层访问的各种差异,提供对物理层的统一访问接口。主要功能包括组帧和拆卸帧、比特传输差错检测、透明传输。
7) LLC 子层:逻辑链路控制子层,与传输媒体无关,负责识别网络层协议,然后对它们进行封装,为网络层提供服务。他向网络层提供无确认无连接、面向连接、带确认无连接、高速传送 4 种不同的而连接服务类型。
- PPP 协议
面向字节的点对点协议
1) PPP 提供差错检测但不提供纠错功能,只保证无差错接收。它是不可靠的传输协议,因此也不使用序号和确认机制。
2)它仅支持点对点的链路通信,不支持多点链路。
3) PPP 只支持全双工链路
4) PPP 两端可以运行不同的网络层协议,但仍然可使用同一个PPP 协议进行通信
5) PPP 是面向字节的,当信息段出现和标志字段一致的比特组合时, PPP 有两种不同的处理方法:异步线路采用字节填充法、同步线路采用比特填充。
组成:链路控制协议 LCP、网络控制协议 NCP、一个将 IP 数据报封装到串行链路的方法。
- HDLC 协议
高级数据链路控制协议,是 ISO 制定的面向比特的数据链路层协议。该协议不依赖于任何一种字符编码集;数据报文可透明传输,用于实现透明传输的“0 比特填充法”易于硬件实现;采用全双工通信,有较高的数据链路传输效率;所有帧采用 CRC 检验,对信息帧进行顺序编号,可防止漏发或重发,传输可靠性高;传输控制功能与处理功能分离,具有较大的灵活性
- ICMP 报文分类: ICMP 差错报告报文、 ICMP 询问报文
ICMP 差错报告报文:终点不可达、源点抑制、时间超过、参数问题、改变路由(重定向)
ICMP 询问报文:回送请求和回答报文、时间戳请求和回答报文、掩码地址请求和回答报文、路由器询问和通告报文
常见应用:分组网间接探测 PING(用来测试两个主机之间的连通性,使用 ICMP 回送请求和回答报文)和
Traceroute(可以用来跟踪分组经过的路由,使用 ICMP 时间超过报文)
- 数据库设计六个阶段
需求分析:分析用户,数据,功能和性能需求
概念结构设计:画 E-R 图
逻辑结构设计: E-R 图转换为表
数据库物理设计:为数据库选择存储结构和存储路径
数据库实施:编程,测试,运行
数据库运行和维护:日常维护
- 列举几种表连接方式,有什么区别?
内连接、自连接、外连接(左、右、全)、交叉连接 内连接:只有两个元素表相匹配的才能在结果集中显示。 外连接: 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 全外连接:连接的表中不匹配的数据全部会显示出来。 交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积
- c 语言中 static 关键字的作用有哪些?
答:在 C 中, static 主要定义全局静态变量(限制作用域)、定义局部静态变量(改变存储区)、定义静态函数(限制作用域)。(还可以用于定义 c++中静态函数和静态成员)
- 不能做 switch()参数的是?
答:实型变量(float, double, string),能做 switch()参数的是: byte, char, short, int, long, bool,整数类型和枚举类型
- 自增运算符前置和后置,在无编译器优化的情况下,哪个效率更高?
答:自增运算符前置效率更高。因为前置运算符先将自身递增,然后返回自身;后置运算符先创建自身的一个副本,而后自身递增,然后返回副本。
- alloc malloc calloc realloc 的区别?
答: alloc 向栈申请空间
malloc 向堆申请空间,参数为空间大小
calloc 和 malloc 类似,参数为元素数目和大小
realloc 是给一个已经分配了地址的指针重新分配空间
- C 语言参数压栈顺序?
答:从右到左
- 什么是回调函数?
答:回调函数即定义一个函数,然后把这个函数作为参数传入子程序中,由子程序在运行时通过函数指针来调用的函数。
- 如果 const 位于星号的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向的对象为常量;如果 const 位于星号的右侧, const 就是修饰指针本身,即指针本身是常量
- 什么是 const_cast?
答: const_cast 强制类型转化,去掉变量的 const 类型
- c 语言怎么实现封装?
答:用 c 语言中的函数指针模拟类的封装
- explicit 关键字? =delete 标识符? =default 标识符?
答: explicit:表示只支持显示构造函数,不支持隐式转换 注:支持 A a(name) 不支持 A a=’ name’
=delete:删除默认构造函数=default:显示指出默认构造函数
- new delete 与 malloc free 的区别?
答: new:分配空间,调用构造函数delete:调用析构函数,释放空间malloc 和 free 不会调用构造和析构当 new 和 delete 一个基本数据类型而不是对象时,不会调用构造和析构new 和 delete 要配套使用,特别是申请对象数组时
- 数据库的索引
数据库的索引分为 B+树索引(也可以是 B 树索引)和哈希索引,哈希索引虽然快但是维护的代价很高,为了降低哈希冲突率,需要保持合适的装填因子,也就是说需要浪费额外空间,同时哈希需要扩容,扩容是一个代价很高的操作,因为它需要把所有已经在哈希表上的键值对都重新计算哈希值并分配到新的空间上的正确位置。B+树索引分为中间节点和叶子节点,每个节点的大小都和数据库定义的页(数据库以页为单位读取磁盘)大小一致,中间节点仅做索引之用,包含了 n+1 个指向下一层的指针和 n个索引键,而叶子节点包括了 n 个索引键和 n 个指向该索引键对应的记录的指针。 B+树的好处为,快速索引,缓存友好,支持根据索引进行遍历或者范围查询。
- 函数指针实际指向的是函数的入口地址。
- C++智能指针该怎么用?
C++智能指针的原理是 C++的 RAII 技术,用通俗的话说就是,某个变量在栈上被分配时,会在离开作用域时被调用析构函数,所以智能指针类的大概实现方式就是拥有一个指针p,然后这个类的析构函数是 delete 这个 p 指针,这样一来,当你把这个类的对象定义局部变量的时候(在栈上分配),当这个对象离开自己的作用域时,它的析构函数就会被调用,从而 delete 它保存的 p 指针。实际实现时,还需要考虑线程安全等复杂问题。
C++11 的智能指针目前有三种
unique_ptr,shared_ptr,weak_ptr
unique_ptr 这个智能指针单独占有某个指针所指向的对象,当这个智能指针离开自己的作用域时,这个对象就会被析构。
shared_ptr 允许多个智能指针指向同一个对象,并采用了引用计数机制,当一个 shared_ptr 指向这个对象时,引用计数就会加一,所有指向这个对象的 shared_ptr 都离开作用域时,这个对象才会被析构。
但 shared_ptr 无法解决循环引用的问题,考虑如下这段代码:
class A {
public:
shared_ptr p;
};
class B {
public:
shared_ptr p;
};
int main() {
while (true) {
shared_ptr pa(new A());
shared_ptr pb(new B());
pa->p = pb;
pb->p = pa;
}
return 0;
}
由于离开作用域时, pa 和 pb 的引用计数无法变为 0,导致 A 对象和 B 对象无法被析构,从而这个 while 循环会导致内存逐渐泄漏,最终导致 new 无法分配到更多的内存而崩溃。weak_ptr 就解决了上面这个问题,因为使用 weak_ptr 指向某个对象时,编译器所维护的引用计数并不会增加,所以用weak_ptr 替换上面的任意一个 shared_ptr 即可解决问题。
- 数据库,数据模型有哪几种,说出至少两种的特征
2020 科软复试一本通
1、非关系模型
层次模型:记录之间的联系通过指针实现,查找效率高。
网状模型:一个结点可以有多于一个的双亲,允许一个以上的结点无双亲。
2、关系模型: 概念简单,结构清晰,用户易学易用
3、面向对象模型
4、对象关系模型
- 数据库中怎样预防死锁
死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进 程都无法继续下去。 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。下列方法有助于最大限度地降低死锁: ( 1)按同一顺序访问对象。 ( 2)避免事务中的用户交互。 ( 3)保持事务简短并在一个批处理中。 ( 4)使用低隔离级别。 ( 5)使用绑定连接。
- FPGA FPGA( Field- Programmable Gate Array),即现场可编程门阵列,它是在 PAL、 GAL、 CPLD 等可编程 器件的基础上进一步发展的产物。它是作为专用集成电路( ASIC)领域中的一种半定制电路而出现的,既 解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点
- DMA 和中断数据传输有什么区别
中断虽然是对设备实时地进行了响应,但是还是需要通过 CPU 对数据进行读写操作,导致数据的传输速率受到影响,而且执行中断响应要执行多条指令,这样还是降低了 CPU 的效率。 DMA 是直接存储器访问技术,它可以避开 CPU,让 CPU 暂停对总线的控制,独自占用总线达到对外设和内存之间的数据传输,传输结束时,释放总线并通知 CPU 重新控制总线。如此一来,数据的传输速率基本只受限于存储器的性能。
PC 机中一般都设有 DMA 控制器来提高数据的吞吐率,减轻 CPU 负担,提高操作系统运行速度。
DMA 的一般过程如下:
1、向 CPU 发出 hold 信号;
2、当 CPU 返回 HLDA 信号后,接管和控制总线,进入 DMA 方式;
3、发出地址信息,能对存储器寻址以及能修改地址指针;
4、发出读、写等控制信号;
5、决定传送的字节数,判断 DMA 传送是否结束;
6、发出 DMA 结束信号,使 CPU 恢复正常工作状态
- 80x86 的寻址方式
IA-32 结构的 CPU 通常有四种主要的寻址方式:立即数寻址,寄存器操作数寻址,(前面两类比较简单,跟单片机差不多), IO 端口寻址(在第 10 题里说过)和存储器操作数寻址。以下是存储器操作数寻址方式详解:8086 采用段寻址方式,有 4 个 16 位段寄存器: CS:代码段寄存器; DS:数据段寄存器; SS:堆栈段寄存器; ES:附加段寄存器(第二个数据段)。8086 把 1MB 的存储空间分为若干段,每段用一个段寄存器标识。每个段的起始值(段基值)按如下方法得出:段基值=(段寄存器内容) *16=(段寄存器内容) *10H (即左移四位)。8086 的物理地址形成方法:段地址:偏移;即在段基址的基础上加上偏移地址量。偏移地址量存放在 IP(代码指针), SP(堆栈指针), SI(源变址寄存器), DI(目的变址寄存器)四个寄存器中,或使用一个有效地址 EA,该 EA 地址的内容就是偏移量。
80286 开始有了实地址、保护方式两种不同的存储器管理模式,往后的 CPU 物理存储空间逐渐加大,也都拥有这两种管理模式。实地址方式类似于 8086 类似的物理地址生成。保护方式下, CPU 可提供一定大小的虚拟存储空间,这个大小一般比物理地址空间大得多。执行程序时,若相应的程序段未调入内存,则向操作系统发出中断,把所需要的程序段和数据从外存调入内存,所以用户可以不受实际物理空间大小的限制,有利于开发大规模的程序
- 信道共享技术:
信道共享技术又称为多点接入(multiple access)技术,包括随机接入和受控。
从层次上讲,信道共享是由数据链路层的媒体接入控制MAC子层来完成的。总的来说,在计算机网络中使用的信道共享技术可以分为三种,即随机接入、受控接入和信道复用。
1. 随机接入,特点是所有的用户都可以根据自己的意愿随机地向信道上发送信息。当两个或两个以上的用户都在共享的信道上发送信息的时候,就产生了冲突(collision),它导致用户的发送失败。随机接入技术主要就是研究解决冲突的网络协议。随机接入实际上就是争用接入,争用胜利者可以暂时占用共享信道来发送信息。随机接入的特点是:站点可随时发送数据,争用信道,易冲突,但能够灵活适应站点数目及其通信量的变化。典型的随机接入技术有ALOHA、CSMA、CSMA/CD。将会在后面章节中详细介绍。
2. 受控接入,特点是各个用户不能随意接入信道而必须服从一定的控制。又可分为集中式控制和分散式控制。
集中式控制的主要方法是轮询技术,又分为轮叫轮询和传递轮询,轮叫轮询主机按顺序逐个询问各站是否有数据,传递轮询主机先向某个子站发送轮询信息,若该站完成传输或无数据传输,则向其临站发轮询,所有的站依次处理完后,控制又回到主机。
分散式控制的主要方法有令牌技术,最典型的应用有令牌环网,其原理是网上的各个主机地位平等,没有专门负责信道分配的主机,在环状的网络上有一个特殊的帧,称为令牌,令牌在环网上不断循环传递,只有获得的主机才有权发送数据。
3. 信道复用,指多个用户通过复用器(multiplexer)和分用器(demultiplexer)来共享信道,信道复用主要用于将多个低速信号组合为一个混合的高速信号后,在高速信道上传输。其特点是需要附加设备,并集中控制,其接入方法是顺序扫描各个端口,或使用中断技术。
关系可以有哪三种表?
基本表:实际存储数据的逻辑表示
查询表:查询结果对应的表
视图表:虚表,不对应实际存储的数据
解释一下关系的三类完整性约束
实体完整性:关系数据库中每个元祖是可以唯一区分的,这样的约束由实体完整性保证
参照完整性:
用户定义完整性:
数据字典是什么?
数据字典是关系数据库管理系统内部的一组系统表、它记录了数据库中的所有定义信息:
关系模式定义、视图定义、索引定义、完整性约束定义、统计信息。
关系数据库管理系统在执行SQL的数据定义语句时,实际上是在更新数据字典表中相应的信息
如何保障数据库的安全性?
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
数据加密
什么是审计?
启用一个专用的审计日志(Audit Log)
将用户对数据库的所有操作记录在上面
审计员利用审计日志
监控数据库中的各种行为,找出非法存取数据的人、时间和内容
C2以上安全级别的DBMS必须具有审计功能
有哪些审计事件?
服务器事件
审计数据库服务器发生的事件(服务器的启动、停止、加载等)
系统权限
对系统拥有的结构或模式对象进行操作的审计
要求该操作的权限是通过系统权限获得的
语句事件
对SQL语句,如DDL、DML、DQL及DCL语句的审计
模式对象事件
对特定模式对象上进行的SELECT或DML操作的审计(updata delete)
什么是数据库的完整性?
数据符合现实、符合逻辑、语义
完整性约束命名子句有哪些?
<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY短语、FOREIGN KEY短语、CHECK短语等
游标的作用?
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
每个游标区都有一个名字
用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
简述操作系统中系统调用过程
系统调用提供了用户程序和操作系统之间的接口,应用程序通过系统调用实现其余OS的通信,并取得它的服务。系统调用不仅可供所有的应用程序使用,而且也可供OS本身的其它部分,如命令处理程序。
系统调用的处理步骤(三步):
首先,将处理机状态由用户态转为系统态;然后由硬件和内核程序进行系统调用的一般性处理,即首先保护被中断进程的CPU环境,将处理机状态字PSW、程序计数器PC、系统调用号、用户栈指针以及通用寄存器内容等压入堆栈;再然后将用户定义的参数传送到指定的地址保存起来。
其次,分析系统调用类型,转入相应的系统调用处理子程序。(通过查找系统调用入口表,找到相应处理子程序的入口地址转而去执行它。)
最后,在系统调用处理子程序执行完后,应恢复被中断的货设置新进程的CPU现场,然后返回被中断进程或新进程,继续往下执行。
处理死锁的基本方法:
1. 预防死锁:这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
2. 避免死锁:该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3. 检测死锁:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
4. 解除死锁:这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
18.什么是滑动窗口协议
滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
说一下路由器的原理
传统地,路由器工作于OSI七层协议中的第三层,其主要任务是接收来自一个网络接口的数据包,根据其中所含的目的地址,决定转发到下一个目的地址。因此,路由器首先去掉数据包的二层头,取出目的IP地址,在转发路由表中查找它对应的下一跳地址,若找到,就在数据包的帧格前添加下一个MAC地址,同时IP数据包头的TTL(Time To Live)域也减一,并重新计算校验和。当数据包被送到输出端口时,它需要按顺序等待,以便被传送到输出链路上。