您当前的位置: 首页 > 

TechGuide

暂无认证

  • 3浏览

    0关注

    176博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

TechGuide 发布时间:2022-10-09 23:32:15 ,浏览量:3

基本信息

岗位:软开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(string.c_str()),一直报错,然后malloc了个char[]数组,终于过了)

  1. 为什么不能返回const_cast(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所以会排序,就是捞不到我吧…

关注
打赏
1665329535
查看更多评论
立即登录/注册

微信扫码登录

0.0374s