腾讯技术1面

记腾讯 服务端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++对象模型。应该能应付这个面试中的大多数问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值