[面试]百度搜索架构部面试记录

自我介绍

  1. 部门是做什么的,百度搜索架构部,是百度搜索的主要部门,日常负责维护百度搜索以及搜索优化。

C++问题

  1. 声明和定义的区别?
    声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述,涉及到内存空间的分配以及初始值的设定。声明和定义有时是同时存在的。
    常见的赋值语句为定义即声明。

几种只声明不定义的情况:
void display(); 提供函数声明
extern int a;
class A;
typedef 声明;
在类中定义的静态数据成员的声明

  1. 内存分配的几种方式?
    栈区(Stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
    操作方式类似于数据结构中的栈。

堆区(Heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

全局区(静态区静态static):全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。

文字常量区 (Stack):常量字符串就是放在这里的。 程序结束后由系统释放。

程序代码区(Stack):存放函数体的二进制代码。

栈区和堆区的区别

堆和栈中的存储内容:栈存局部变量、函数参数等。
堆存储使用new、malloc申请的变量等。
申请方式:栈内存由系统分配,堆内存由自己申请。
申请后系统的响应:
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
申请大小的限制:Windows下栈的大小一般是2M,堆的容量较大。
申请效率的比较:栈由系统自动分配,速度较快。堆使用new、malloc等分配,较慢。
总结:栈区优势在处理效率,堆区优势在于灵活。

  1. memcpy和memset的区别?为什么memset不能初始化一些其他类。
    对于memcpy:
    功能:由src所指内存区域复制count个字符串到dest所指内存区域.
    说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.

对于memset:
功能:把buffer所指内存区域的前count个字节设置成字符c
说明:返回指向buffer的指针.

memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '
memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度.

memset是一个字节一个字节设置的,取要赋的值的后8位二进制进行赋值。所以当memset赋值为1时会出现错误。

  1. c++使用c代码使用什么关键字?
    使用 extern "C" {}.

  2. const关键字以及其使用场景?

  • const变量: 不能修改值,定义时初始化 const int pi = 3.1415;
  • const类对象: 不能修改成员变量的值,不能调用非const函数。const myClass a;
  • 指向const变量的指针:指向内容不可变,指向可变. const int* a;
  • const 指针:指向内容可变,指向不可变。 int* const a;
  • 指向 const 变量的 const 指针。指向不可变,指向内容也不可变。const int* const a;
  • const 变量作为函数参数。函数内部不能修改该参数值。void myFun(const int a);
  • const 返回值. 用以返回const引用,上层不能用返回的引用来修改对象。 const string& myFun()
  • const 成员变量. 必须在初始化列表进行初始化,之后不能改变。
  • const 成员函数。 此函数不应该修改任何成员变量,传给const成员函数的this指针,是指向const对象的const指针。

内存问题

  1. 内存分配的几种方式?
    从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。
    从栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高 但是分配的内存容量有限。
    从堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和delete释放内存。

操作系统问题

  1. 进程和线程之间的区别?
    进程是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独立运行的一段程序。
    线程又是什么?线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。
    联系:

    1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
    2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
    3. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
    4. 处理机分给线程,即真正在处理机上运行的是线程。
    5. 线程是指进程内的一个执行单元,也是进程内的可调度实体。
  2. 进程间通信的方式?

    1. 管道/匿名管道(pipe):
    2. 有名管道(FIFO)
    3. 信号(Signal)
    4. 消息(Message)队列
    5. 共享内存(share memory)
    6. 信号量(semaphore)
    7. 套接字(socket)
  3. 线程对内存进行读写时会出现哪些问题?怎么解决这些问题?

    1. 临界区(Critical Section)
    2. 互斥量(Mutex)
    3. 信号量(Semaphores)
    4. 事件(Event)
    5. 队列
  4. cpu调度机制?

    1. 先到先服务调度算法(FCFS)
    2. 最短作业优先调度(SJF)
    3. 优先级调度
    4. 轮转法调度(RR)
    5. 多级队列调度
    6. 多级反馈队列调度

编程题

  1. 快排
  2. 合并两个有序链表
原文地址:https://www.cnblogs.com/wildkid1024/p/13456598.html