没答上来的笔试题。。。

6 篇文章 0 订阅

今天面试竟然被技术题给难住了。。。特意把题目照了下来,回来认真研究

 

1.简述类c++成员函数的重写、重载和隐藏的区别

2.简述c++中“聚合”和“组合”的区别

3.请画出TCP在连接建立和断开的时候的网络状态转换图,并说明TIME_WAIT状态的作用是什么

4.简述epoll和select的区别,epoll的两种触发模式以及可读可写时事件的触发条件

5.在网络编程中如何实现阻塞connect和非阻塞connect

6.请写出你所熟悉的两种高并发网络模型,并分析其优缺点

7.在大并发网络的连接下,如何设计一个连接会话管理模型(从采用的数据结构,查询一致性,快速查找,全局遍历等考虑)

8.如果要设计一个大型的分布式缓存系统,请给出设计思路(从客户端与服务器的实现,可靠性,数据一致性等角度考虑)

9.简述分布式系统中CAP理论,ACID模型和BASE模型分别是指什么

 

答案:

1.简述类c++成员函数的重写、重载和隐藏的区别

成员函数被重载的特征
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

———————————————————————————

 

2.简述c++中“聚合”和“组合”的区别

聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。

组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。

聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。

ps:摘自此文http://blog.csdn.net/gamecreating/article/details/5404589

———————————————————————————

 

3.请画出TCP在连接建立和断开的时候的网络状态转换图,并说明TIME_WAIT状态的作用是什么

 

TCP这两个图很重要,不过让我把图画下来,这有点。。。

TIME_WAIT状态的作用:主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_WAIT状态一般维持在1-4分钟。

TIME_WAIT状态存在的理由:
1)可靠地实现TCP全双工连接的终止
2)允许老的重复分节在网络中消逝 
摘自http://blog.csdn.net/wangwh485/article/details/6689836

————————————————————————————

 


4.简述epoll和select的区别,epoll的两种触发模式以及可读可写时事件的触发条件

区别主要有三点:

1).select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE    1024  表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。

2).epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。

3).使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。

epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知.

当fd的状态发生改变的时候,才触发相应的事件。
EPOLLIN:当fd从不可读变成可读时,触发事件。如果fd一直可读,即使有新数据到来,也不会触发这个事件。
EPOLLOUT:当fd从不可写变成可写时,触发事件。如果fd一直可写,写入新数据不会触发这个事件。

摘自:http://blog.csdn.net/ysu108/article/details/7570571

http://blog.csdn.net/hjxhjh/article/details/9374837

http://bbs.csdn.net/topics/100060188

————————————————————————————————

 

5.在网络编程中如何实现阻塞connect和非阻塞connect

处理非阻塞connect的步骤(重点):
1. 创建socket,返回套接口描述符;
2. 调用fcntl 把套接口描述符设置成非阻塞;
3. 调用connect 开始建立连接;
4. 判断连接是否成功建立。

判断连接是否成功建立:
A. 如果connect 返回0,表示连接成功(服务器和客户端在同一台机器上时就有可能发生这种情况);
B. 调用select 来等待连接建立成功完成;
     如果select 返回0,则表示建立连接超时。我们返回超时错误给用户,同时关闭连接,以防止三路握手操作继续进行下去。
     如果select 返回大于0的值,则需要检查套接口描述符是否可写,如果套接口描述符可写,则我们可以通过调用getsockopt来得到套接口上待处理的错误(SO_ERROR)。如果连接建立成功,这个错误值将是0;如果建立连接时遇到错误,则这个值是连接错误所对应的errno值(比如:ECONNREFUSED,ETIMEDOUT等)。

摘自:http://blog.163.com/li_xiang1102/blog/static/60714076201110298170975/

—————————————————————————————————

 

///下面这三道是真不会啊。。。。

6.请写出你所熟悉的两种高并发网络模型,并分析其优缺点

7.在大并发网络的连接下,如何设计一个连接会话管理模型(从采用的数据结构,查询一致性,快速查找,全局遍历等考虑)

8.如果要设计一个大型的分布式缓存系统,请给出设计思路(从客户端与服务器的实现,可靠性,数据一致性等角度考虑)

 

—————————————————————————————————

9.简述分布式系统中CAP理论,ACID模型和BASE模型分别是指什么

参考:http://www.jdon.com/37625

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值