面试心得

语言基础

C++这块无非就是封装,继承,多态。对于这三大特性需要有自己的理解,针对语言本身需要有自己的优缺点理解。
在多态这块无非就是模板和虚函数,关于重载,emmm(QAQ)。其实关于(静态)模板和(动态)虚函数的一些特性,可以从编译器的角度去理解如何实现的多态,模板我就不多说了,编译展开的特点限制了声明和定义需要在一起。关于虚函数如何实现的多态,紧紧抓住虚表和虚指针就好,用的是谁的虚指针,就指向谁的虚表,虚表是在编译阶段产生的。动态绑定是在运行时才确定的。
其他的两块就不想多说了,目前不晓得有啥有价值的。

数据结构

在C++领域,STL源码是一定要看的。stack,queue,vector,list,priority_queue ,map,hash_map,set等,不仅是用法 ,底层数据结构一定要了解,例如stack和queue底层是双端队列封口,双端队列底层就是一块线性连续的内存。此时就需要思考为啥底层不用vector,优缺点,如何扩容,系数多少,为何。其次问的最多的就是map和hash_map的区别,优缺点,应用场景,无非就是从构造上,底层数据结构上分析,map底层是红黑树,因此元素是有序的,hash_map底层是hash表。因此查找效率肯定是hash_map更胜一筹,然而在内存消耗上,hash_map表现不太好。如果对内存没有限制,但是需要求并集交集的情况肯定是map,有序呀。
最后一句话:看源码!!!

算法

万年不变,八大排序,时间空间复杂度,如何优化,优缺点。
海量数据找重复,找频率最高。
hash分文件,内排外排。(堆+归并也行)
字典树。
分布式,mapreduce。
布隆过滤器。
leetcode
leetcode某些题解
剑指offer,我一般在牛客网刷
ACM选手忽视

操作系统

1.进程线程协程,原理,调度方式,区别,优缺点。
2.进程线程通信方式,原理,是否线程安全,如何保证线程安全。
ex:两台机器如何安全读写第三台机器的一个文件。
3.同步互斥机制,死锁原理,如何避免死锁,如何减轻锁压力。mutex原理,cas原理等等。
4.网络IO模型,说烂的我就不想说了,啥ET,LT,epoll的底层数据结构,回调函数数据结构,如何实现高效通知。
5.Reactor和Proactor模型,发展历史,NIO,网络这块我感觉可以看看netty源码。多看看C++网络库源码,目前就看了boost.asio中的一部分实现,Proactor在Linux端的实现。还想看看陈硕老师的moduo网络库,能从中受益很多。
6.内存管理这块需要好好看看。目前我还在看源码,在STL中设计到内存池的实现,不过二级适配器目前并没有很好的实现对内存的释放,碎片整理等。Linux是有一套完善的实现方案,例如伙伴算法还有多级分配函数,后面慢慢看咯。

计算机网络

1.万年不变TCP,UDP区别。看<tcp/ip详解>,如何设计一个RUDP。TCP的拥塞控制和流量控制,具体到任何一个阶段的状态变化。了解socket基本用法,流程,对于数据的发送和接收具体到从应用层buffer拷贝到内核,再到数据链路层的数据包确认到发送。多用wireshark抓抓包,结合实际了解TCP通讯的具体细节。UDP因为是无连接,同时内部没有TCP的定时保活机制,因此在一段时间无数据包通过端口,路由器就会关闭该端口。
2.http,https,讲道理,我是没有做过这块的项目,最近 只是基于python的flask框架做了一个简单的web服务,因为http就是基于tcp协议的应用层协议。常问浏览器从输入域名到页面渲染的过程和涉及到的协议,中间就有tcp的三次握手和四次挥手过程。http和https中间就是多了一层ssl协议加密,关于https这块的请求过程,我就不多说咯,无非就是获取证书,获取秘钥,返回秘钥等等。
3.cookie和session,区别,存储位置,emmm其实我真的聊记得不多。
4.dns,httpdns。解析流程,httpdns的原理,为何要产生这门技术,emmm。
5.关于web漏洞的了解,啥sql注入啊啥的,我也不太了解2333。
6.nginx的用法,原理等等。

数据库

1.数据库引擎innodb myisam 区别,优缺点,应用场景。
2.Redis、Memcache和MongoDB,PGSQL的区别,优缺点,应用场景,底层数据结构。emmm关于Redis这块,后面决定就看看源码,可以很好的理解Redis的工作模型和网络IO。
3.Pgsql和Mysql的对比,emmm。
4.数据库索引原理,底层数据结构,索引的优缺点,如何避免索引失效,最左匹配原则,主要是mysql。
5.乐观锁,悲观锁原理,事务的几大特性,如何开启事务等等。
反正我数据库贼辣鸡,几个嵌套的sql语句就能把我搞晕。QAQ,到现在学的啥存储过程,游标等等都还给老师了。

项目

1.语音引擎,我以前做的很杂。毕竟刚刚毕业,去年实习的时候是做音频这块,也就是一个语音引擎,从声音的采集到到处理到编码到网络序列化到发送以及网络抖动缓冲消除到播放。同时也实现了多服的语音转发服务器以及客户端。我当时做了IOS端的底层硬件,也就是声音播放采集。实现C#,java,IOS,对C++接口的调用,弱鸡只配就是做壳子(QAQ),然后整个网络层是我做的,协议自研,协议预留字段,便于拓展,无任何加密,整个网络模块采用任务投递线程的模型,发送端序列完的数据包打包成任务投递到网络线程中同步发送。
后面有几步优化目前还没实现,首先是网络模型这块考虑用select监听所有的连接,采用CSP模型。但是解耦这块很难受,C++萌新布吉岛怎么办。其次是内存优化,考虑在采集和播放端利用内存池优化内存。最后就是考虑用cas来优化锁,减小锁的压力。线程池也预备后期投入到项目中。
2.语音服务器,主要是一些架构方面的事情,例如多机房的时候,如何保持数据库一致性,redis有一个同步策略可以试试。然后就是一致性hash的原理用法,我们这块主要是采用房间管理的模式,对于重复上线的问题用的token进行有效验证。语音同步主要是简化客户端分配策略,在同一个房间的人利用重定向服务器分配到一个服务器上。
3.基于boost的一个数据转发服务器,其实主要就是学到了boost的网络模型,boost.asio中的异步socket的使用,了解数据驱动器io_service的原理。原来单线程异步模型这么厉害也,单线程跑满整个CPU在千人级别上没啥压力。
4.C#的photon服务器和java的基于play framework框架的后台服务器,这俩东西我接手过来没啥说的,主要是photon的房间管理中的消息同步机制我想好好学学,可惜看不到也。难受,然后关于一个web后台,想要了解其后端组件和层次。

然后就是在运维这块,了解到了阿里云的swarm集群部署,加上docker的部署上线。
未完待续…

感言

所有的总结都是面试中问到的问题,可能还有很多没有说到的,如果有些东西有问题希望大家提出来,大牛们不要嫌弃幼稚,这是一个菜鸡的默默总结QAQ。
在未来的一年内,希望自己看完Linux内核源码的一部分,Redis源码,STL源码,在工程性项目上,能够在架构层次上深入或者是提出优化方案。
多用www.baidu.com,多看源码,多想原理,多思考。
希望自己能用好自己提升最快的几年,yeah~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值