记腾讯 服务端cpp技术一面
问:进程间通信有哪些方式
答:信号量,信号,管道,socket,共享内存
问:哪种方式最快
答:共享内存
问:为什么
答:共享内存只在创建时有系统调用,创建好后,就和访问自己的内存一样,而管道,socket等方式不仅创建时有系统调用,在读写数据时都有,需要多次进入内核,上下文切换。而且他们在内核和用户态之间多次复制数据,速度肯定慢
问:进程和线程的区别
答:进程是资源分配的基本单位,线程是CPU资源分配的基本单位,进程间不共享内存,线程间共享内存。操作系统书上说线程是轻量级进程,但实际在linux系统上,线程和进程的区别并没有那么大,strace fork()和pthread_create()可以发现它们最终都调用clone。线程的优势是共享数据方便,同时这也是它的劣势,用锁控制起来麻烦。
问:你刚说用锁,你用过哪些锁
答:实习时,公司只让用自旋锁
问:什么是自旋锁
答:就是一种不睡眠进程,而是轮询的锁
问:为什么要这样
答:为了响应时间,如果用一般锁,程序会被阻塞,这是无法忍受的,可能行业的特殊性吧
问:锁有哪些种类?
答:可重入的,不可重入的
问:说一下区别
答:可重入的,在发现资源不可得后不阻塞程序,但是我个人觉得这种锁很奇怪啊,在逻辑上看起来很奇怪,资源已经不可得了,应该让程序卡主。
问:你用过valgrind,gdb,perf strace之类的东西啊,还不错。还有其他的东西吗?
答:top算不算?跑程序时怕出系统问题,会用top监视
问:(不记得了,但是问top的具体用法的)
答:我现在不记得了,但如果要我用,估计一百度就可以知道吧。
问:如果让你来写一个文件传输服务器,你如何设计
答:两条TCP链接,一条控制线,一条数据线,上面传输压缩数据
问:什么叫传送压缩数据,你只传压缩数据就够了?怎么保证数据的完整和正确
答:TCP自有这个保证,传输正确且有序的数据
问:TCP如何保证这些的
答:每个分组都有一个序号,按这个序号排序好了再给用户态就是完整的数据
问:要是数据丢了呢?
答:那接收方会重复发ACK
问:若是ACK也丢了呢?
答:发送方会在一段时间后超时,然后自动重发丢失的分组
问:你用过wirshark,说下你平时用这东西干嘛,都抓过怎么样的包
答:有时候程序出现奇怪的现象时,会抓包,比如我的程序突然死在read上,这种情况下会抓到rst包
问:什么是RST包
答:读一个不可读的socket时,会有这种情况
问:什么是不可读
答:比如有两个进程AB,A去读B的某个端口,但实际上那个端口根本就没有开。就会有出现RST
问:知道tcpdump吗
答:这个只在书上看到过,用的少,没有图形界面时,似乎也只能用这东西了
问:40亿个QQ号,现在要查询某个QQ号的昵称,你准备如何设计这个系统
答:做成分布式吧? 分10个节点,每个节点4亿数据,然后分别到每个数据库里面同时查找。(不满意的样子)
问:有两个文件,每个中都有20亿个QQ号,你怎么找出相同的QQ的号
答:用A文件做一个链式hash表,用B的QQ去查表。
问:还有其他方法吗
这个没想出来其他方法,这个问题也不是很满意
问:说说你简历上的那个项目
……….
问:你都用过哪些方法提升这个项目中程序的性能
答:因为程序主逻辑是做数据IO,所以将IO无关的解析任务放到另外一个线程中去
问:你写这个程序时都遇到哪些问题
答:遇到好多coredump,然后写的接口耦合性非常强,别人用的很困难
问:两个相关的类,有组合和继承两种方式,一般为了低耦合性,你选哪种
答:继承
问:你了解设计模式吗
答:最近在看
问:多路IO的底层原理是怎么实现的?
答:用户向内核注册想监听的事件,内核在检测到这些事件就绪时,会返回一个就绪的事件表给用户
问:我是问,内核如何做到这一点的
答:没研究过
问:网络IO中,数据从网卡到内核到用户手中经过多次复制,这个地方是不是有什么提升空间
答:对,kerner bypass技术,之前还看到一个zero copy socket。但是我感觉这个东西不安全,而且不好用吧
问:为什么不安全
答:少了内核的buffer,为了保证数据的完整性,用户又要有一个自己的buffer,而且这个buffer在收到完整的数据前又不能释放,这个管理起来太麻烦了,具体怎么不安全,我以前想明白过,现在不记得了。
问:了解dpkg吗
答:那是啥
问:看你c++用的多,那你说说一个空类A的对象的大小吧
答:我记得是一个字节吧?但我知道若有虚函数,则在64位机上是8个字节
问:为什么是一个字节?
答:………(乱扯了一段)
问:一个空类,编译器会为其合成哪些函数
答:默认构造函数,复制构造函数,析构函数
问:子类构造时是如何构造的
答:先构造super,再构造自己
问:子类析构时。如何析构
答:好像是和构造是反的
问:到底是怎样
答:就和出入栈的那种操作差不多啊,我的直觉告诉我是这样的
问:你的直觉是对的,但为什么呢?
答:因为不这样就不安全?
问:为什么会不安全?
答:若子类引用了父类的资源,若先析构父类,在子类没析构时是不是有点不安全啊?但父类是不会引用子类的资源的
问:c++中类的成员变量内存布局是怎么样的
答:在没有虚函数时,一般和 c struct差不多吧,按8字节对齐(64位机)
问:在子类中也是这样吗?
答:这个问题我几个月前看到过,但是我忘了。。。。
总结:看过APUE ,UNP1 ,TCPIP详解v1,csapp, effective c++, 深度理解c++对象模型。应该能应付这个面试中的大多数问题。