面经收录

《C/C++程序员面试宝典》 梁镇宇 清华大学出版社


C/C++

  1. C++基础数据类型:整数型、浮点型、void型。

  2. 操作符优先级:从右至左结合的有三个:单目运算符、条件运算符、赋值运算符。

  3. 左值和右值:左值是一个地址,右值是一个地址存放的内容。右值不能放在赋值语句的左边。变量是左值,可以出现在赋值语句的左边。数字字面值是右值,不能被赋值。

  4. 变量初始化:复制初始化、直接初始化。如果变量在定义的时候没有被初始化,他的值是不确定的。直接初始化的执行效率更高,复制初始化要擦除对象的当前值并用新值代替。系统有时候会默认初始化变量。内置类型变量是否自动初始化取决于变量定义的位置。函数体外定义的变量都初始化为0,函数体内的内置类型变量不自动初始化,除了作为赋值操作符的左操作数,否则未初始化的变量没有意义。类自身定义了怎么初始化,构造函数,如果类中没有定义某个类中变量的初始化,使用默认构造函数。

  5. 声明和定义:extern:声明变量名但不定义它。不会分配存储空间,它说明变量定义在程序的其它地方,含有初始化的extern声明被当作是定义,变量可以声明多次,只能定义一次。

    1
    extern int a;

操作系统

  1. os:管理计算机的硬件资源,软件资源,数据资源,控制程序运行,提供操作接口,为其它应用软件提供支持等的软件系统。

  2. 根据任务的处理方式

    1. 简单批处理系统

    2. 多道程序批处理系统:利用了处理机的空闲时间。

    3. 多道程序分时系统:现代操作系统。一个作业只在一个时间片的时间内使用cpu,时间到就剥夺作业的cpu使用权,根据算法将cpu分给其它作业使用。Unix,Linux,DOS,Windows,Mac等。

    4. 网络操作系统:一台计算机通过一个网络接口控制器连接网络,进行网络通信功能,网络资源的管理和使用的操作系统。

  3. 操作系统的最小调度单位:线程。进程是操作系统中正在运行的一个应用程序,线程是系统分配处理器时间资源的基本单元。一个进程至少包括一个线程,通常称作主线程。

  4. 资源的最小单位是进程。进程由进程控制块、程序段、数据段三部分组成。使用线程可以实现应用程序同时做几件事互不干扰。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源。线程与同属一个进程的其它线程共享进程所有的全部资源,一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。子进程和父进程有不同代码和数据空间,多个线程共享进程的数据空间,每个线程由自己的执行堆栈和程序计数器为其执行上下文。多线程主要为了利用CPU时间,同时在一个进程内运行多个任务。

  5. 进程和线程的区别:

    1. 一个程序至少由一个进程,一个进程至少有一个线程。
    2. 进程在执行过程中拥有独立的内存单元,多个线程共享进程所拥有的内存。
    3. 进程可以独立运行,线程不能独立执行,必须依存在进程中,使用该进程的应用程序提供多个线程执行控制。
  6. 任何实现多线程同步:多线程是为了使得线程并行地工作以完成多项任务,以提高系统的效率。

    好处:

    1. 把占据长时间的程序中的任务作为一个单独的线程放到后台处理。用户界面可以继续响应用户的操作。

    2. 加快程序的处理速度。

    3. 在一些等待的任务实现上,如用户输入、文件读写、网络收发数据等,可以释放一些资源如内存占用等。

    多线程同步:思想是避免多个线程对同一资源的访问,这个资源可以是一个对象、或者是一个方法、或者是一段代码。

    实现方法:

    1. 临界区
    2. 互斥量
    3. 信号量

C/C++面试题实战

  1. 进程之间通信的途径:

    1. 共享存储系统
    2. 消息传递系统
    3. 管道:以文件系统为基础
  2. 进程死锁的原因:死锁是两个或多个并发进程中,如果每个进程持有某种资源而又等待别的进程释放他们保持的资源,否则不能向前推进。

    根本原因是:系统能够提供的资源个数比要求该资源的进程数少,具体如下:

    1. 系统资源不足
    2. 进程推进顺序非法
  3. 死锁的4个必要条件:

    1. 互斥条件:一个资源每次只能被一个进程使用。
    2. 请求和保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放。
    3. 不剥夺条件:进程已获得的资源,在没使用完之前,不能强行剥夺。
    4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
  4. 死锁的处理:

    1. 鸵鸟算法忽略该问题。
    2. 检测死锁并恢复。
    3. 仔细地对资源进行动态分配,以避免死锁。
    4. 破环死锁产生的4个必要条件之一,防止死锁产生。
  5. 操作系统中进程调度策略:

    1. windows和linux的区别
    2. FCFS先来先服务
    3. 优先级
    4. 时间片轮转
    5. 多级反馈
  6. 类的静态成员和非静态成员的区别

    1. 类的static成员在类被实例化前创建,类的静态成员每个类中只有一个,静态函数的实现里不能使用非静态成员。
  7. 纯虚函数怎么定义:此函数是一个接口,子类定义时必须实现该接口。

    1
    virtual void f()=0;
  8. 数组和链表区别:数组大小固定,顺序存储。链表大小可变,随机存储。

  9. ISO七层模型:物理层、物理链路层、网络层、运输层、会话层、表示层、应用层。

to be continued…

Thanks for Support.