某搜索公司面试 待续

商务搜索部门,方向是分布式计算,对数据结构和操作系统抠得比较细,数据结构还好,操作系统当年没选这门课,还得回过头好好补

1. 电话面试

某搜索公司商务搜索部,电话面试一个小时,在线写代码,你在这边写,人家远程看着

linux指令

没回答上,就搜了下,我跟他说我搜了下,找到了,然后面试官就有点毛了,说这种行为要影响面试表现什么的,问你什么问题不会就换下一个问题云云。。。搜完了不跟他说就是了。但是,linux命令这种东西用的时候搜一下不就完了,除了常用的谁会记这么多呢?

一个文本文件每行五列,打印第三列数据

awk

一个文本文件有多少行

wc

项目介绍

讲一下自己的项目,自己做视频编解码,图像处理相关的,比较偏的专业,电话里面也讲不太清楚

在线写代码

1. 单链表倒数第k个元素

常见的问题,一个快指针一个满指针,快指针先走k步,然后快慢指针一起走,当快指针走到结尾的时候,慢指针指到倒数第k个。
面试官比较抠代码风格,说我代码边界检查什么的要做好之类的。

2. 一个数组里面第k大的数

面试宝典里面有的,申请k个元素的空间作为最大堆,前k个元素复制进去,建一个最大堆,用来保存最小的k个元素,堆顶元素是这k个元素里面最大的,当做哨兵,后面每来一个元素跟这个哨兵元素比较,如果小于这个堆顶元素则交换数据,对堆进行再排序;否则跳过,最后返回堆顶元素。复杂度是O(n*log(k))

你这边还有什么问题?

这边做什么

搜索相关,推荐等等

对应聘者的要求

进来看具体能力,再分配工作

面试流程

电话面试,一面,二面,三面,电面结果会在一周内反馈。

2. 现场一面,工程师面

项目经历

专业相关,SIMD偏门技术,讲了人家也听不懂

多线程,问题很多

多线程,上下文切换,现成个数和任务关系

gdb多线程调试

多线程调试基本命令:

命令 介绍
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

进阶还有strace调试

sophamore和mutex

makefile,编译,

C源程序进行编译的过程

参考《操作系统教程》陆松年版,12.2章节

  • 预处理程序/lib/cpp
    • 对头文件和c源文件进行处理
    • 预处理程序包括
      • 文件包含:头文件展开,产生临时文件
      • 宏代换:#define
      • 条件编译:#if #else等
      • cc命令行的选项和预处理程序
  • 编译程序/lib/ccom,/lib/c2
    • 将预处理程序的输出翻译成汇编语言源程序
    • 包括:
      • 编译处理阶段:两遍编译扫描,第一遍称为符号生成,第二遍将符号于用于生成汇编语言代码的符号表格匹配
      • 编译选项:-g -p -O -S
  • 汇编程序/lib/as
    • 读入汇编语言源程序,产生包括二进制代码和重定位信息的目标文件.o文件
  • 连接装入程序/lib/ld
    • 对目标文件和库文件进行处理
    • 联接和装入所有的可重定位目标文件和库文件,生成可执行程序文件
    • 组合目标文件和搜索目标库以解决没有定义的引用

运行一个可执行二进制程序的过程

操作系统,很重要

推荐coursera上北大的os课程:http://c.open.163.com/coursera/courseIntro.htm?cid=2802

虚拟地址

物理内存大小为2G,能否申请到4G大小的空间
逻辑地址,物理地址

中断机制

中断发生后os底层工作步骤

  1. 硬件压栈:程序计数器等
  2. 硬件从中断向量装入新的程序计数器
  3. 汇编语言过程保存寄存器值
  4. 汇编语言过程设置新的堆栈
  5. c语言中断服务程序运行(例:读并缓冲输入)
  6. 进程调度程序决定下一个将运行的进程
  7. c语言过程返回至汇编代码
  8. 汇编语言过程开始运行新的当前进程

cpu现场信息

进程上下文切换,从一个进程换到另一个进程的过程

  1. 进程运行时,寄存器值(通用寄存器,程序计数器pc,程序状态字psw,栈指针,其他控制寄存器);进程不运行时,这些寄存器的值保存在进程控制块pcb中
  2. 指向该进程页表的指针

进程切换

含义:

  1. 切换全局页目录,加载新的地址空间
  2. 切换内核栈和硬件上下文,其中硬件上下文包括内核执行新进程的全部信息,如cpu相关寄存器

具体步骤,进程a上cpu,进程b下cpu

  1. 保存进程a的上下文环境
  2. 用新状态和其他相关信息更新进程a的pcb
  3. 将进程a移至合适的队列(就绪,阻塞…)
  4. 将进程b的状态设置为运行态
  5. 从进程b的pcb恢复上下文(程序计数器,程序状态字,其他寄存器…)

上下文切换开销cost

  1. 直接开销:内核完成切换所用的cpu时间
    1. 保存和恢复寄存器…
    2. 切换地址空间
  2. 间接开销
    1. 高速缓存,缓冲区缓存,TLB失效

编程语言

虚函数

高频常考,包含虚函数的类里面有个虚函数表指针,这个指针指向一个虚函数表,不同的类有不同的虚函数表指针,指向不同的的虚函数表
多态就是这样实现的:

//parent是父类,child是子类,parent里面有虚函数func,child里面的func多态实现
child* cp = new child;
parent* pp = cp;

parent指向child类的结构,但是parent->func是通过child类里面的虚函数表指针指向的虚函数表确定func的具体定义,虽然是父类的指针指向子类结构,但结构里面的内存数据并没有变化,虚函数表指针这个函数入口没有变,所以通过父类指针调用子类函数其实还是调用子类的函数,这样实现了多态。

类里面一个指向动态申请内存空间的地址,析构的时候安全,只有最后一个对象析构时,才释放申请的内存空间,如果实现?

现场代码

大小为n的数组,找出里面出现频次大于n/2+1的元素
我给出了两种解答:
一是快排里面的partition, 分区后如果刚好第a[n/2+1]左边的数小,右边的数大,那么a[n/2+1]为所求,算法复杂度为O(n)
二是hash map

3. 现场二面,经理面

linux命令

输入一个文本文件,第二列为姓名,生成文件二,输出两列,第一列为姓名,第二列为该姓名出现的频次

sort相关

后台开发经历

为什么用tornado

个人职业规划

我的问题

相关业务

分布式计算

岗位需求

最好有相关经历,当然对应届生另外考虑

入职承担角色

软件开发工程师,担心招进来做一些边边角角的活,对个人成长不好

你可能感兴趣的:(linux,面试,搜索)