海康一面9.13(嵌入式软件开发工程师)
总共半个小时的样子,主要是问了C++ 操作系统 计网的内容;
我简历上没写熟悉C,但前面还是问了不少
1.C/C++有哪些操作字符串的函数?
只想起了strcpy、strncpy、strcat
2.C函数函数调用的过程?用到了哪些栈指针?
(当时没回答上,这里就收集资料拓展一下)
栈地址是由高至低拓展的,和堆相反。
函数调用过程主要包括以下三个阶段( 这里以C/C++为例子,go中并未用到寄存器)
1.函数传参:c/c++中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等, 函数的参数分别存到对应的寄存器中(例如edi、esi)
2.函数执行
3.返回值返回, 使用寄存器来保存返回值。
部分常用寄存器
3.动态链接和静态链接的区别
动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入; 而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。
4.进程和线程的区别?
进程是资源分配的最小单位,线程是CPU调度的最小单位,系统并没有直接区分,只是把线程当做一个轻量级的进程。
5进程间通信的方式?
管道、信号量、共享内存、socket、消息队列
6.有哪些方法实现多线程的互斥同步?你用过什么实现?
信号量、锁(没说全,还有变量和共享内存也可以)
7.为什么用信号量?信号量和锁的区别是什么?
信号量能控制对临界资源访问的数量、锁不能控制
8.了解TCP和UDP吗?介绍一下TCP
TCP:三次握手、四次挥手、拥塞控制、流量控制、超时重传、
UDP:面向无连接、不保证可靠
9.了解socket吗?介绍一下过程?
客户端:socket、connect
服务端:建立socket、bind、listen、accept,顺便拓展了一下全连接队列和半连接队列
10.如何查询一个主机是否在连接?
一开始这个问法我没能理解,我想的是查询这个是否在tcp连接?想了想说了netstat 可以来查询是否在连接,但面试官说不是,问我知道ping吗?我说知道,他说用ping就能查询,我说ping不是用来判断主机之间是否网络联通吗,为什么能判断主机时间是否有连接,他说他问的是这个意思。
11.ping是什么实现的?ICMP是哪一层协议?TCP呢?
ICMP,网络层协议,TCP是传输层
12.了解哪些设计模式?
单例、工厂、观察者、代理
13.说说这几种设计模式他们的优缺点
看过,但让我说优缺点就感觉很不好说,感觉应该少说两个的-.-
现在重新总结一下优缺点:
单例模式
优点:系统提供了唯一实例, 节约系统资源。
缺点: 扩展略难,单例模式中没有抽象层,且单例的职责过重。
工厂模式:
优点:系统的拓展性很好,只需要关注对象的使用,不需要关注对象的创建,符合开闭原则。
缺点:需要在系统中增加相应的多个类,增大了系统复杂度。
抽象工厂模式:
优点:多了一个产品族的概念,多了一个管理层次。
缺点:增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
代理模式:
优点:降低系统耦合度,降低的代码复杂度,如果要增加代理操作,可以仅修改代理代码。
缺点:代理模式会造成系统中类的个数增加, 比不使用代理模式增加了代理类, 系统的复杂度增加
观察者模式:
优点:观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。观察者模式满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。
缺点:如果一个观察目标对象有很多直接和间接观察者,将所有的观察者都通知到会花费很多时间。如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
面试官说我前面的可能不太熟悉,但网络部分还掌握的比较好,我说挺久没去用C/C++了,忘了挺多。
然后反问
面试群里说7-14天给结果,感觉应该是凉了。
#海康##海康威视面经#一些面经总结