一、简答题
1、 简述数据库以及线程死锁产生的原理和必要条件,简述如何避免死锁。
答: 计算机系统中,如果系统的资源分配策略不当,更常见的问题可能是程序有错误等,则会导致进程因竞争资源部当而产生死锁的现象。
总的来说,死锁产生的原因主要有三方面:
1)因为系统资源不足
2)进程运行推进的顺序不合适
3)资源分配不当等
产生死锁有以下四个必要条件:
1)互斥:一个资源每次只能被一个进程使用
2)请求与保持:一个进程因为请求资源而阻塞时,对已获得的资源保持不放
3)非抢占:当进程已获得资源时,在未使用完之前,不能强行剥夺
4)循环等待:若干进程之间形成一种首尾相连的循环等待资源关系
这四个条件是产生死锁的必要条件,必须同时满足,才能产生死锁。因此,避免死锁的方式,必须要避免让四个必要条件同时成立。
可以通过确定合理的资源分配策略,防止进程在处于等待状态下占用资源,在系统运行过程中,对进程发生的每一个系统能够满足的
资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配资源系统可能发生死锁,则不分配。
具体而言,可以采取下列3种预防措施:
1)采用资源静态分配策略,破坏“部分分配”条件
2)允许进程剥夺使用其他进程占有的资源,从而破坏“不可剥夺”条件
3)采用资源有序分配法,破坏“环路”条件。
这里注意一点:互斥条件无法被破坏。
2、 请列举面向对象设计的三个基本要素和五种主要设计原则。
答:三个基本要素:封装、继承、多态。
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信
的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。简单地来说,一个类就是一个封装了数据以及操作
这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对
内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。继承是指这样一种能力:它可以使用现有类
的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或者“派生类”。被继承的类
称为“基类”或者“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。继承概念的实现
有二类:实现继承和接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用
属性和方法的名称,但是子类必须提供实现的能力。
所谓多态就是指一个类实例的相同方法在不同情形下有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部
接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们可以通过相同的方式予以调用。
五种主要设计原则:单一职责原则、里氏代换原则、依赖倒置原则、迪米特原则、开放-封闭原则等。
3、 简述windows内存管理的几种方式以及优缺点。
答:windows内存管理主要有4种方式。
1)块式管理 缺点:内存浪费比较大,一段很小的程序也要为其分配一个固定大小块的内存
2)页式管理
3)段式管理 缺点:一个程序可能分布在几十个段内,要花费大量的时间计算各个段的物理地址。
4)段页式管理(最常用) 结合了页式管理和段式管理的优点
二、算法与程序设计
1、 公司组织一次羽毛球比赛,采用淘汰制,假设公司有1001人,如果要评出“羽毛球第一高手”的称号,至少需要多少场比赛?请简述设计过程,并编写代码。
答:
2、 100个灯泡排成一排,第一轮将所有的灯泡打开;第二轮每隔一个灯泡关掉一个,即排在偶数的灯泡被关掉。第三轮每隔两个灯泡,将开着的灯泡关掉,关掉的灯泡打开。依次类推,第100轮结束的时候还有几盏灯泡亮着?
3、 假设有20个有序数组,每个数组中有500个数字,数字类型为32位uint型,降序排列,现在要取出这10000个数字中最大的500个,怎么做?
三、系统设计题
手机上通常采用9键盘输入,即1-9个数字键分别对应一定的英文字母(如:2对应ABC,3对应DEF,……,9对应WXYZ),因此用户可以方便的输入中文内容。比如,用户输入“926”,可以对应“WXYZ”,“ABC”和“MNO”的一系列组合“WAN”,“YAN”,“ZAO”等,这些对应“万”,“严”,“早”等汉字的中文拼音。
要求:现在我们把这样的输入方式应用在我们的手机联系人查找功能上,有一个联系人列表UserList,记录了(姓名,手机号)这样的组合,通过输入的数字字符串NumStr,按照下面的规则把对应的联系人查找出来,返回一个ResultList。
规则:
1、手机号能连续部分匹配输入的数字字符串NumStr。如输入NumStr=926,则手机号13926811111会被查找出来。
2、联系人姓名中的汉字转化成拼音后能够连续匹配输入数字字符串NumStr对应的英文字母组合。如输入NumStr=926,则联系“王二”、“李艳”、“万事通”会被查找出来,因为“王二”的“王”拼音“WANG”中含有“WAN”,和“926”能匹配。
输入:
联系人列表UserList<UserName,PhoneNo>;汉字拼音映射表Dict,数字字符串NumStr;
输出:
符合规则的联系人列表ResultList<UserName,PhoneNo>;