C++面试之操作系统

文章目录

      • 1.多线程和单线程的区别和联系:
      • 2. 如何指定多个线程的执行顺序?
      • 3.线程和进程的区别(必考)
      • 4.多线程产生死锁的 4 个必要条件?
      • 5.如何避免死锁?
      • 6.临界区与互斥体的区别
      • 7.分段分页的区别:

1.多线程和单线程的区别和联系:

  • 在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。
  • 多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。

结论:采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。

2. 如何指定多个线程的执行顺序?

解析:面试官会给你举个例子,如何让 10 个线程按照顺序打印 0123456789?(写代码实现)

答:设定一个 orderNum,每个线程执行结束之后,更新 orderNum,指明下一个要执行的线程。并且唤醒所有的等待线程。

在每一个线程的开始,要 while 判断 orderNum 是否等于自己的要求值!!不是,则 wait,是则执行本线程。

3.线程和进程的区别(必考)

  • 线程是进程的一个实体,是CPU调度的基本单位;一个进程中拥有多个线程,线程之间共享地址空间和其它资源(所以通信和同步等操作线程比进程更加容易);

  • 调度:进程是拥有资源的基本单位,线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程内的线程时,会引起进程切换。

  • 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO设备等,所付出的开销远大于创建或撤销线程时的开销。类似的,在进程切换时,涉及到当前执行进程CPU环境的保存及新调度进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

  • 并发性:进程可以并发执行,同一进程内的多个线程也可以并发执行,从而使操作系统拥有更好的并发性,大大提高了系统吞吐量

  • 通信方面:进程间通信需要进程同步和异步手段的辅助,以保证数据的一致性。而线程间可以直接读/写数据段(如全局变量)来进行通信。

4.多线程产生死锁的 4 个必要条件?

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

5.如何避免死锁?

  • 打破1,可同时访问
  • 打破2,进程执行前申请需要的全部资源,在执行过程中不再申请资源
  • 打破3,占有资源的进程若要申请新资源,必须主动释放已占用资源
  • 打破4,层次分配。

指定获取锁的顺序举例如下:
比如某个线程只有获得 A 锁和 B 锁才能对某资源进行操作,在多线程条件下,如何避免死锁?

获得锁的顺序是一定的,比如规定,只有获得 A 锁的线程才有资格获取 B 锁,按顺序获取锁就可以避免死锁!!!

死锁避免:银行家算法

6.临界区与互斥体的区别

临界资源:一次只允许一个进程使用的资源(许多物理设备都属于临界资源,例如打印机)
临界区:对临界资源的访问必须互斥地进行,每个进程中,访问临界资源的那段代码称为临界区(Critical Section)

  • 临界区只能用来同步本进程内的线程,而不能同步多个进程中的线程。互斥量(Mutex)、信号量(Semaphore)、都可以跨越进程使用来进行同步数据操作。
  • 临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
  • 临界区和互斥体在windows平台下都可用,Linux下只有互斥体可用

7.分段分页的区别:

  • 分页透明,分区需要程序员显式划分每个段。
  • 分页是一维地址,分段是二维地址。
  • 分页的大小不可变,而段的大小可以动态改变。
  • 分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了让程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

你可能感兴趣的:(面试,操作系统)