前些时间去了腾讯面试, 可惜现场没回答好。
是一些基础问题,同时也比较深入的问题。 在此列出来, 欢迎大家讨论交流。
提问(不按时间顺序):
1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?
2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如何处理? 例如,socket缓存有8kB的数据,而你的缓存只有2kB空间。
3, 向socket发送数据时, 可能只发送了用户缓存里的一半,如何处理?例如,需要向socket发送8kB数据,返回值只有2kB发送成功。
4, C++的虚函数是怎么实现的?
5, C++的虚函数有什么作用?
6, 非阻塞connect()如何实现?
7,sizeof()问题
class A
{
char c;
int val;
short sh;
}
class B
{
char c;
int val;
short sh;
void func1(void);
virtual func2(void);
}
sizeof(A), sizeof(B) 分别是多少?
8, 实现字符串比较函数 strcmp(char *src, char * sub)
9, 实现内存拷贝函数 strcpy(void*dst, char * src, size_t len)
10,条件变量的如何使用? 你使用的线程函数是什么?
11, deamon进程如何实现?
12, HTTP和CGI是什么?
13, TCP的三次握手, TIME_WAIT和CLOSE_WAIT状态是什么?
因为第7题之后的属于客观题,不打算在此写答案。 朋友们如有好的答案也欢迎跟贴。
本人在此写出自己对前6个问题的回答:
1, 使用linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?
第一种最普通的方式:
当需要向socket写数据时,将该socket加入到epoll模型(epoll_ctl);等待可写事件。
接收到socket可写事件后,调用write()或send()发送数据。。。
当数据全部写完后, 将socket描述符移出epoll模型。
这种方式的缺点是: 即使发送很少的数据,也要将socket加入、移出epoll模型。有一定的操作代价。
第二种方式,(是本人的改进方案, 叫做directly-write)
向socket写数据时,不将socket加入到epoll模型;而是直接调用send()发送;
只有当或send()返回错误码EAGAIN(系统缓存满),才将socket加入到epoll模型,等待可写事件后,再发送数据。
全部数据发送完毕,再移出epoll模型。
这种方案的优点: 当用户数据比较少时,不需要epool的事件处理。
在高压力的情况下,性能怎么样呢?
对一次性直接写成功、失败的次数进行统计。如果成功次数远大于失败的次数, 说明性能良好。(如果失败次数远大于成功的次数,则关闭这种直接写的操作,改用第一种方案。同时在日志里记录警告)
在我自己的应用系统中,实验结果数据证明该方案的性能良好。
事实上,网络数据可分为两种到达/发送情况:
一是分散的数据包, 例如每间隔40ms左右,发送/接收3-5个 MTU(或更小,这样就没超过默认的8K系统缓存)。
二是连续的数据包, 例如每间隔1s左右,连续发送/接收 20个 MTU(或更多)。
回来查了资料,发现以下两种方式:
第三种方式: 使用Edge-Triggered(边沿触发),这样socket有可写事件,只会触发一次。
可以在应用层做好标记。以避免频繁的调用 epoll_ctl( EPOLL_CTL_ADD, EPOLL_CTL_MOD)。 这种方式是epoll 的 man 手册里推荐的方式, 性能最高。但如果处理不当容易出错,事件驱动停止。
第四种方式: 在epoll_ctl()使用EPOLLONESHOT标志,当事件触发以后,socket会被禁止再次触发。
需要再次调用epoll_ctl(EPOLL_CTL_MOD),才会接收下一次事件。 这种方式可以禁止socket可写事件,应该也会同时禁止可读事件。会带来不便,同时并没有性能优势,因为epoll_ctl()有一定的操作代价。
2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如果处理?
可以调用realloc(),扩大原有的缓存块尺寸。
但是临时申请内存的有一定性能损失。
这种情况要看接收缓存的方式。
第一种方式: 使用100k的大接收缓存为例。
如果要等待数据,并进行解析。可能发生缓存不够的情况。此时只能扩充缓存,或先处理100k的数据,再接收新的数据。
第二种方式: 使用缓存队列,分成8K大小的队列。
不存在接收缓存不够的情况。 除非用户解析已出错,使用数据接收、使用脱勾。 这种方式的代价是,可能需要将缓存队列再次拷贝、拼接成一块大的缓存,再进行解析。 而在本人的系统中,只需要将socket接收的数据再次原样分发给客户, 所以这种方案是最佳方案。
3, 向socket发送数据时, 可能只发送了用户缓存里的一半,然后失败,如何处理?
记录缓存的偏移量。 下一次socket写事件时, 再从偏移的位置接着发送。
那个面试官居然对这个问题问了我两次, 看来我解释的不够清晰。。。。。。 郁闷。
4, C++的虚函数是怎么实现的?
使用虚函数表。
回来查下资料: C++对象使用虚表, 如果是基类的实例,对应位置存放的是基类的函数指针;如果是继承类,对应位置存放的是继承类的函数指针(如果在继承类有实现)。所以,当使用基类指针调用对象方法时,也会根据具体的实例,调用到继承类的方法。
5, C++的虚函数有什么作用?
虚函数作用是实现多态, 很多人都能理解这一点。但却不会回答下面这一点。
更重要的,虚函数其实是实现封装,使得使用者不需要关心实现的细节。在很多设计模式中都是这样用法,例如Factory、Bridge、Strategy模式。 前两天在书上刚好看到这个问题,但在面试的时候却没想起来。
个人觉得这个问题可以很好的区分C++的理解水平。
6, 非阻塞connect()如何实现?
将socket设置成non-blocking,操作方法同非阻塞read()、write();
面试官是在听到我介绍之后,才问我这个问题。可惜还是问我两遍。
这次面试, 总的来说准备不够充足, 所以这次机会没有青睐我!
也有其它一些问题:
1, 对于一般的面试提问, 总是想很简要的回答完。因为对方可能本来就很清楚,所以自己就想一两句话说完。 但是有时候这样行不通。需要适当的回答清晰、完整一些。
2, 对TCP/UDP的问题本来是很熟悉的,但因为长时间没复习,忘的差不多了。
3, 以前已经对RTSP进行了仔细的学习。 HTTP、SIP属于同一类协议。而我却回答不了HTTP的问题。努力学习啊................
4, 有些问题要问我两遍,说明我的表达确实不够清晰。有的问题可能面试官自己并不清晰,所以除了表达清晰之外,完全有必要适当的回答稍完整些。否则很难让人满意。
5, 精神状态不太好,思维有些慢了。 因为总是睡的晚。
接下来打算继续研究 lighttpd源码, 这样对我自己的水平提高会有很大帮助。
机会总是青睐有准备的人! 期待下次
分享到:
相关推荐
主要收集大大小小的ctf比赛中自己做过的一些题
1. 选择题第1题考察了Java三目运算符的使用。`k=(x>y)?y:x` 当`x`大于`y`时,`k`的值为`y`;否则,`k`的值为`x`。因此,如果`x=20`,`y=30`,则`k`的值为`30`。 2. 第2题询问如何定义一个不能被实例化的抽象类。在...
老师给的文档,参考着看,,只有几个题哦,没有的靠自己理解0.0 老师给的文档,参考着看,没有的靠自己理解0.0
Java重点面试题 – 针对java面试过程中经常遇到的一些试题进行总结.docx JAVA面试基础知识点总结.docx Java面试笔记.docx 写出正则表达式,从一个字符串中提取链接地址.docx 出现几率最高和覆盖范围最广的一套经典...
每一套100题都应包括了各种类型的问题,如选择题、填空题和编程题,涵盖C语言的基本语法、数据类型、控制结构、函数、指针、数组、结构体等核心知识点。通过这些题目的反复练习,考生可以巩固基础知识,提高解题速度...
呵呵呵,就是我们老师给的复习题,还有那个课件
JAVA笔试面试资料JDBC HTTP、JSP、Servlet、Struts面试题汇总资料: 2014年最新Java笔试题及答案.docx 225道Java面试题 学会了Java面试随你问.docx Ant和Maven的作用是什么?...遇到的一些Java面试题回顾.docx
SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些练习题答案SQL的一些...
Java面试笔记 225道Java面试题...Java重点面试题 – 针对java面试过程中经常遇到的一些试题进行总结.docx JAVA面试基础知识点总结.docx Java面试笔记.docx 写出正则表达式,从一个字符串中提取链接地址.docx 出现几率最
以下是一些习题的解析,旨在帮助理解相关知识点: 第二章的习题涉及了微处理器的操作时间和内存管理。例如,2.9题解释了读操作的总线周期和时钟频率的关系,指出读操作需要5个时钟周期,每个时钟周期是0.25us,计算...
2000-2010历年程序员考试真题,对软考程序员的一些试题总结,包含答案;程序员考试上午科目和下午科目的考试形式与考核内容已经趋于稳定,考生应紧扣考试大纲和指南,有针对性地进行学习。
真题是网络上搜索的,我2天前才去考,3小时的题,69道需要答对70%,我花了20分钟,答对67道。...网上目前的真题,主要就是这239道,另外一套270道左右的,只是有一些题反复出现而已,但是没有新题。
windows 操作系统期末试题,只有一些试题。没有答案
EDA期末考试,一些试题,你可以认真看一下,希望对你有帮助。
很抱歉,但根据您提供的信息,这似乎是一个关于高中数学期末考试试题答案的PDF文件,内容包括了多项选择题、填空题、解答题等不同类型的数学问题及对应的答案。然而,具体的数学知识点并未直接在描述或部分内容中列...
2019年宏杉技术支持面试题,根据自己的记忆写下的比较经典运维的一些题都有,主要方向是存储运维的知识和Linux系统的一些知识,希望能够帮助到有需要的人。
自己整理一些大厂的面试题题库,都是一些常见的题目,希望能给大家提供帮助,题库分为3个部分这是第二部分
SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的一些考试题SQL的...
华为OD一些华为OD考试的练习题和真题.zip华为OD一些华为OD考试的练习题和真题.zip华为OD一些华为OD考试的练习题和真题.zip华为OD一些华为OD考试的练习题和真题.zip华为OD一些华为OD考试的练习题和真题.zip华为OD一些...
现代数字信号处理的一些习题及总结,用来备战期末考试,维纳滤波、卡尔曼滤波、自适应滤波器、含一些matlab代码...