• 面试


    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. 实现一个线程池子,如何保证不让线程数超出,如何实现。

  • 相关阅读:
    按指定上下限区间进行数据统计的示例.sql
    树形数据层次显示处理示例.sql
    Flexi传授如何说服自己的老板采用Node.js
    sed的用法[转]
    [bash] string operators
    [shell script]脚本实现目录和文件名显示
    Bash快捷键
    [bash] Condition Tests
    整理一下博客
    老爸的工具箱之:根据日期批量重命名照片
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14580179.html
Copyright © 2020-2023  润新知