2021-04-11面试
发布日期:2021-05-08 09:38:28 浏览次数:13 分类:精选文章

本文共 1246 字,大约阅读时间需要 4 分钟。

多线程与进程间通信

多线程编程在现代操作系统中占据重要地位,特别是在需要同时处理多个任务时。以下是关于多线程通信与共享数据的几点要点:

多线程之间如何通信/共享数据?

多线程之间的通信与共享数据有两种主要方式:

  • 加锁的队列
    例如,使用生产者-消费者模式(Producer-Consumer Pattern),通过加锁的队列实现数据的生产和消费。
    • 加锁的全局变量
      直接通过全局变量进行通信,但需要加锁保护,以避免竞态条件和数据不一致。
  • 如何排查死锁(锁的使用)?

    当线程间发生死锁时,可以通过以下方法排查:

    • 调试工具:使用Linux下的pstack命令或者类似的工具来获取线程状态。
    • 减小锁的粒度:尽量使用小粒度的锁,而不是大锁。
    • 加锁的方向一致:确保所有线程在加锁和释锁的顺序上保持一致。例如,线程a→A→B和线程b→A→B不会产生死锁,但线程a→A→B和线程b→B→A可能会导致死锁。
    • RAII技术:在编码时尽量使用RAII(资源获取与释放)技术,确保每个加锁操作都有对应的解锁逻辑。

    高级面试难点

  • 队列优化与锁效率
    在多线程环境下,优化队列的性能和锁的使用效率至关重要。
  • 多级队列设计
    在复杂的系统中,多级队列可能需要根据优先级进行策略设计。
  • 多进程之间如何通信?
    使用NIX模型(Unix IPC)进行通信,避免惊群效应。
  • 网络编程

    TCP服务器的基本流程

  • 创建一个TCP服务器socket。
  • 使用bind函数将socket绑定到特定的IP地址和端口。
  • 使用listen函数设置服务器监听队列。
  • 等待客户端连接。
  • 常用工具

    • tcpdump命令:用于抓包分析网络流量。
    • 查看进程开启的端口:可以使用netstatss命令。
    • send/recev函数的返回值:send返回发送的字节数,recev返回接收的字节数。

    阻塞与非阻塞模式

    • 阻塞模式:适用于连接建立时的等待,效率较低。
    • 非阻塞模式:允许多任务处理,适合高并发场景。
    • poll和epoll:用于更高效的网络事件处理,适合复杂的网络应用。

    高级网络库设计

    • 如何设计一个网络库?
      需要考虑数据传输的可靠性、连接的管理、错误处理等多个方面。
    • 疑难杂症的解决
      需要针对不同协议的特点,进行优化,如处理超时、丢包等问题。

    数据库

    数据库操作

    • 增删改查( CRUD):这是数据库操作的基本流程。
    • 索引:用于加快查询速度,但要避免过度索引导致锁竞争。
    • 索引的结构:索引通常基于主键或唯一性列,用于快速定位数据。

    Linux下常用命令

    • 权限管理:使用chmodchown命令。
    • 数据库连不上:检查数据库服务是否在运行。
    • 事务的四个级别
    • 读未提交(Read Uncommitted):最低级别,可能导致脏读。
    • 读已提交(Read Committed):保证已提交的读操作可见。
    • 可重复(Repeatable Read):防止幻读,保证相同事务在相同时间读到相同数据。
    • 串行化( Serializable):最高级别,确保事务的原子性。
    上一篇:leet code76
    下一篇:TCP 协议如何解决粘包、半包问题

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年03月31日 08时38分33秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章