面试

  1. 进程和线程的异同点?线程之间如何进行通信?进程之间如何进行通信?

    • 两个进程间的两个线程通信,相当于进程间通信:无名管道、有名管道、信号、信号量、消息队列、套接字、共享内存

    • 一个进程中的两个线程间通信方式:互斥锁、条件变量condition_variable、信号量、读写锁shared_lock

      • 互斥锁:在构造函数里加锁,在析构函数里解锁

      • 条件变量:互斥量可以保护共享数据的修改,如果线程正在等待共享数据的某个条件出现,仅用互斥量的话就需要反复对互斥对象锁定解锁,以检查值的变化,这样将频繁查询的效率非常低。条件变量可以让等待共享数据条件的线程进入休眠,并在条件达成时唤醒等待线程,提供一种更高效的线程同步方式。条件变量一般和互斥锁同时使用,提供一种更高效的线程同步方式。

    • 可以去看一下公众号“搞嵌入式的锋”中的“c++ 线程间通信方式”这篇文章

  2. 匿名管道和命名管道的区别是什么?

  3. 你说线程是共享资源的,那你知道线程之间有什么资源可以共享,什么资源不能共享吗?

  4. 线程/进程间通信

    • 线程间资源是共享的,讲安全:共享变量、信号量、wait/notify机制、锁、原子操作

    • 进程间资源是独立的,讲通讯:信号、信号量、管道、共享内存、消息队列、socket

  5. 进程和线程的优缺点

  6. 讲一下线程同步问题

    • 线程有可能其他线程共享内存、文件、数据库等资源。当多个线程同时读写同一份共享资源的时候,可能会引起冲突。

    • 所我们需要引入“线程同步”机制(对线程进行同步操作),即各个线程间要有先来后到。

    • 线程同步的本质是:排队。一个一个排队对共享资源进行操作,而不是同时操作。

    • 线程同步的目的:避免线程“同步”执行。

    • 线程同步注意点

      1. 共享:只有共享资源的读写访问才需要同步。如果不是共享资源就根本不需要进行同步

      2. 只有“变量”才需要同步访问。如果共享的资源是固定不变的,那么就相当于“常量”,线程同时读取常量也不需要同步。至少一个线程修改共享资源,这样的情况下,线程之间就需要同步。

      3. 多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。

  7. 线程同步怎么处理/线程同步的方法/线程同步的基本实现思路/如何在线程之间共享资源

    • 多线程访问共享内存,为了实现同步,常采用加锁的方式。

    • 可以给共享资源加一把锁,这把锁只有一把钥匙。哪个线程获取了这把钥匙,才有权利访问该共享资源。

    • 同步锁加在共享资源的代码段上。(一些比较完善的共享资源,比如,文件系统,数据库系统等,自身都提供了比较完善的同步锁机制。我们不用另外给这些资源加锁,这些资源自己就有锁。)但大部分情况下,我们在代码中访问的共享资源都是比较简单的共享对象。这些对象里面没有地方让我们加锁。

  8. 除了加锁还有什么别的方式/还有什么方法解决资源竞争的问题/如何采用不加锁的方式实现线程同步

  9. 进程线程相关,通信如何进行?在代码中实现过吗?怎么用的?

  10. 多进程和多线程?平常用哪个更多?用过多进程吗?

  11. chrome是多进程还是多线程的?为什么chrome一个标签崩了整个浏览器也崩了

  12. 问引用计数和实现起来时候需要注意的事情(多线程)

  13. 几种多线程的锁:互斥量/互斥锁、读写锁/共享互斥锁、自旋锁、条件变量、屏障。名词解释和代码见:https://blog.csdn.net/bian_cheng_ru_men/article/details/80210501?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

  14. 为什么要有虚拟内存?好处是什么?

  15. 进程间共享机制

  16. 线程的各种状态以及转化

  17. 生产者消费者模型

  18. 文件管理系统、存储系统、磁盘扇区、分页分段段页结合等

  19. 进程调度算法

    • LRU页面置换算法:选择最长时间没有被引用的页面进行置换(移出内存而腾出空间来加载另外的数据)
  20. 虚拟内存和物理内存

  21. 协程高效在哪

  22. 你了解进程的内存结构吗?

  23. 了解多线程吗?在具体使用时需要注意什么呢?

  24. 在同一进程下的两个线程a和b,在线程a中有一个static变量,线程b能访问得到吗,在线程a中new一个对象,线程b能访问得到吗。

  25. 在两个进程中,申请的指针,可能指向同一片内存吗

    • 不要让两个指针指向同一块内存,可能会造成的问题:1容易引发多次释放同一块内存;2容易引发野指针
  26. 物理地址和逻辑地址

    • 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。

    • 逻辑地址:CPU生成的地址。逻辑地址是内部和编程使用的,不唯一。比如:可以读取指针变量本身值(&操作),这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

  27. 代码中的变量是逻辑地址还是物理地址(逻辑地址)

  28. 怎么通过逻辑地址找到物理地址(属于微机原理内容!?)

    • 逻辑地址左移四位加偏移地址就是物理地址
  29. 给一道多进程和多线程的场景题。这个场景下会出现什么问题?为什么会出现这样的问题?你会如何解决呢

  30. 阻塞IO和非阻塞IO

    • 阻塞IO:

    • 非阻塞IO典型应用:socket

    • 非阻塞IO特点:进程轮询(重复)调用,消耗CPU的资源;实现难度低、开发应用相对阻塞IO模式较难;适用并发量较小、且不需要及时响应的网络应用开发;

  31. 同步IO和异步IO的区别?

  32. IO多路复用如何实现的?在实际应用当中解决了什么问题?给了一个场景

  33. 什么是IOCP?

  34. 32位操作系统会为每个进程分配多大的内存空间?为什么能为每个进程分配那么多虚拟内存空间?地址空间是连续的吗?

  35. 如果拔掉服务器网线和关掉对应的进程端口号,这两种有什么区别,客户端会发生什么情况?

  36. 实现一个线程池子,如何保证不让线程数超出,如何实现。

原文地址:https://www.cnblogs.com/OFSHK/p/14580179.html