【2022-09-15】小米软开两轮面经

基本信息

岗位:软开c/c++
Base:深圳

一面(9月5日 45min)

  1. 面试官介绍部门(安卓)
  2. 自我介绍
  3. 成绩
  4. 算法题:链表内部指定区间反转
  5. c++虚函数表了解吗,创建时机是什么时候
  6. 怎么查找虚函数表中的函数,虚函数指针存放的位置在哪里
  7. 智能指针,shared_ptr和unique_ptr怎么实现的,什么场景需要智能指针
  8. 内存泄漏了解吗

面试官姐姐声音很好听

  1. stl的map和unordered_map
  2. std::move
  3. 讲一下程序栈空间
  4. 线程间同步怎么做的,信号量怎么使用
  5. 死锁产生的条件
  6. gdb用过吗,怎么调试core文件,查看变量类型的命令是什么
  7. gdb在线调试用过吗
  8. 汇编语言了解吗,用GDB看过反汇编吗

二面(9月15日 3h24min)

强度略高,几乎每个问题都以这个不是很清楚结尾,凭记忆写的,后面想起来更多的再补充

  1. 自我介绍
  2. 算法题:写题二叉树的序列化与反序列化

序列化的返回为char*,不是string(开始的写法是在序列化函数里面用string,返回const_cast<char*>(string.c_str()),一直报错,然后malloc了个char[]数组,终于过了)

  1. 为什么不能返回const_cast<char*>(string.c_str())呢?

局部变量的指针,string析构了,这里说到了string类长度以16字节为界,存储方式不一样,给后面留了个大坑

  1. 如果是string接收返回值可以直接返回吗,为什么?

可以,拷贝构造

  1. 如果一个函数string f(), const char* ret = f().c_str(), printf(“%s”, ret)能输出吗?为什么?

不能,临时变量析构了

  1. 如果是printf(“%s”, f().c_str())呢?(可以)
  2. 你刚刚说到了string类对于长短字符串存储方式不一样,那你要怎么设计这个数据结构?应该有哪些成员变量?

要求空间要极致压缩,要求只用16个字节,实现短字符串存在栈上,长字符串在堆上,并且栈上有一个指针指向长字符串,这里聊了非常久,答案是要用共用体

  1. 怎么设计一个迭代器?需要考虑哪些东西?

重载+,-运算符,自定义指针移动规则,定义起始与结束标志位,定义迭代器失效的规则

  1. c++的智能指针是怎么实现的?

shared_ptr引用计数,unique_ptr禁用拷贝构造和禁止重载赋值运算符

  1. shared_ptr怎么保证线程安全?(本身不能保证,要加锁)还有其他方式吗?(c++提供了atomic库支持一些原子的操作,但是没用过)

  2. 锁在操作系统怎么实现的?

内核标志位,硬件指令保证原子性,比如tsl

  1. 什么情况下会产生死锁?(四个条件)

  2. 怎么避免死锁呢?(让我讲银行家算法,乱讲一通)

  3. linux系统是靠什么来管理进程的?(pcb, 即代码实现中的task_struct)

  4. 那进程怎么通过task_struct来找到虚拟内存的呢?

task_struct中有个mm_struct结构体就是专门来描述进程的地址空间的

  1. 内核线程和用户线程有什么区别?(这里回答偏了,说成了内核态线程和协程)
  2. 系统启动的1号进程是什么?(init进程)那2号呢?(不知道,答案好像就是内核线程)
  3. 内核栈和用户栈有什么区别?分别存的是什么?(用户栈是函数栈帧,内核栈没说清楚)
  4. 系统调用的是什么?系统调用函数的栈帧存在哪儿的?(用户栈)
  5. 系统调用的中断现场保存在哪儿?

答案就是内核栈,但是答错了,说应该有tcb

  1. 内核线程和用户线程怎么区分的(task_struct中有flag,猜对了)
  2. 内核current了解吗(真不知道,投降)
  3. 进程怎么通过task_struct中的信息访址的?

mm_struct中有PGD指针,然后四级页表

  1. 四级页表里面分别是什么?页表条目只有地址吗?

还有一些标志位,比如标记为脏页

  1. TLB命中和未命中会怎么样?
  2. 你觉得刚刚讲的里面会有发生什么异常吗?(page fault, 会发生换入换出)
  3. 有哪些换入换出算法呢?怎么进行的?(LRU, 如果页表使用过需要刷脏)
  4. 操作系统是怎么管理内存的呢?比如malloc是怎么申请的?

brk和mmap,除了暴露给程序员的可用空间的起始地址之外,还有个header来记录快大小和是否被分配

  1. 什么时候会发生segmentation fault, 数组越界一定会发生吗?

不一定,要访问到非法的地址才会,这里又扯了很久

  1. mmap的单位是多少(4KB)
  2. 知道哪些allocator?(TCmalloc)
  3. 知道哪些磁盘调度算法?(不知道,其实磁盘io那部分压根没看)
  4. 对安卓了解多少?

写过安卓应用,Activity, Listener, MsgHandler

  1. 在校成绩怎么样,觉得自己想做哪方面的工作?
  2. 学校什么时候开三方?
  3. 手里面有哪些offer?

此时已经不想面了,估计也不想要我,后面随心所欲不逾矩了

  1. 为什么没有去华为呢?(投了,还没结果)
  2. 想过去嵌入式或者车企之类的吗?
  3. 觉得小米怎么样?

没用过小米手机,觉得小米的平衡车踩着很方便,面试官一声叹息

  1. 反问什么时候有个结果

说今年每个组仅有个位hc所以会排序,就是捞不到我吧…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其中记录了一些面试时可能会遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经还提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时会遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能会问一些不在面经中列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还会关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试中可能会遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试中展现自己的优势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值