2025年c++ 条件变量性能(c++ 条件语句)

c++ 条件变量性能(c++ 条件语句)p 1 多线程共享虚拟地址空间 其中栈空间和 text 代码段 被每个线程瓜分 不共享 其他都是共享的资源 br 线程 id error 变量 线程特有数据等也不共享 br p p 2 p p 3 线程同步 线程安全 br 原因 相较于进程需要通过各种来共享信息进行通信 br p

大家好,我是讯享网,很高兴认识大家。




讯享网

 <p>(1)多线程共享虚拟地址空间,其中栈空间和.text(代码段)被每个线程瓜分(不共享),其他都是共享的资源。<br>线程id、error变量、线程特有数据等也不共享。</p> <p>(2)</p> <p>(3)线程同步/线程安全:<br>原因:相较于进程需要通过各种来共享信息进行通信,线程可以很方便的使用<strong>全局变量</strong>来共享信息。<br>【注】<strong>临界区</strong>是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,不会被打断。一次仅允许一个线程使用的共享资源。</p> <p>概念:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程则处于等待状态。</p> <p>线程同步的实现一般有下面5种:<strong>互斥量</strong>,<strong>读写锁</strong>,<strong>条件变量</strong>,<strong>自旋锁</strong>,<strong>屏障</strong>。</p> <p>(4)死锁:忘记释放锁;多次加锁;多线程多锁,抢占锁资源。</p> <p>产生死锁的四个必要条件:<br><strong>互斥条件</strong>:一个资源每次只能被一个进程使用。<br><strong>请求与保持条件</strong>:一个进程因请求资源而阻塞时,对已获得的资源保持不放。<br><strong>不剥夺条件</strong>: 进程已获得的资源,在末使用完之前,不能强行剥夺。<br><strong>循环等待条件</strong>:若干进程之间形成一种头尾相接的循环等待资源关系。存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一资源,……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。</p> <p>解决死锁的四个方式:<br><strong>鸵鸟算法</strong>(直接忽略该问题)。<br><strong>检测死锁并且恢复</strong>(检测与解除策略)。<br><strong>仔细地对资源进行动态分配,以避免死锁</strong>(避免策略)。<br><strong>通过破除死锁四个必要条件之一,来防止死锁产生</strong>(预防策略)</p> <p>(5)生产者与消费者模型:<br>条件变量:</p> <p>信号量:互斥锁+条件变量</p> <p>(6)读写锁:<br><strong>读多写少</strong>时使用读写锁,提高效率。</p> <p>(1)网卡功能:数据的封装与解封装;链路管理;数据编码与译码。</p> <p>(2)MAC地址:48位(6个字节)。<br>IP地址:32位(4个字节)。</p> <p>(3)特殊地址:</p> <p>(4)子网掩码:将IP地址分为<strong>网络地址</strong>和<strong>主机地址</strong>两部分。<br>【注】网络号:IP与子网掩码&amp;<br>主机号:子网掩码取反与IP&amp;</p> <p>子网数:首先根据第一个字节判断是哪个类:<br>&lt;=127:A——255.0.0.0<br>&lt;=191:B——255.255.0.0<br>&lt;223:C——255.255.255.0<br>看子网掩码比默认的多几个1,就是2的几次方个子网数;<br>主机数:后面的0有几个,就是2的几次方主机数。</p> <p>(5)端口:网络通信中应用程序对外的一个接口,2个字节。</p> <p>(6)网络模型;TCP/IP协议族;UDP、TCP、IP、以太网帧、ARP的报文头部结构。</p> <p>(7)上层使用下层提供的服务,通过<strong>封装</strong>实现。<br>从下往上进行解析:<strong>分用</strong>。</p> <p>(8)socket套接字:一套通信的接口。<br>socket地址——结构体。</p> <p>(9)字节序:<br>大端(网络字节序):整数的<strong>高位字节</strong>在内存的<strong>低地址</strong>处。<br>小端:整数的<strong>高位字节</strong>在内存的<strong>高地址</strong>处。</p> <p>(10)TCP:可靠、面向连接、字节流、传输层。<br>三次握手目的:为了让双方都知道可以互相通信。<br>TCP的状态转换。</p> <p>(11)服务端的端口复用:防止服务器重启时之前绑定的端口还未释放;程序突然退出而系统没有释放端口。</p> <p>(12)通信并发:多进程/多线程解决。</p> <p>缺点:耗费资源。</p> <p>(13)I/O多路复用技术:使程序能<strong>同时监听多个文件描述符</strong>,提高程序性能。分为阻塞()和非阻塞()。<br>、、。</p> <p>具体参考这篇答应我,这次搞懂 I/O 多路复用!</p> <p>epoll的工作模式:LT水平触发、ET边缘触发(减少了epoll事件被重复触发的次数)。</p> <p>(1)阻塞/非阻塞、同步/异步(网络I/O):<br>【注】磁盘IO(I:从磁盘读入内存;O:从内存写入磁盘)。网络IO。</p> <p><strong>在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO。</strong></p> <p>一个典型的网络IO接口调用,分为两个阶段,分别是 “<strong>数据就绪</strong>” 和 “<strong>数据读写</strong>”,数据就绪阶段分为阻塞和非阻塞,表现得结果就是,<strong>阻塞当前线程或是直接返回</strong>。数据读写阶段分为同步和异步。</p> <p>同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是 由请求方<strong>A自己来完成</strong>的(不管是阻塞还是非阻塞)——效率低,编程简单,消耗用户时间。<br>异步表示A向B请求调用一个网络IO接口时 (或者调用某个业务逻辑API接口时),向B传入请求的事件(fd)以及事件发生时通知的方式(sigio),A就<strong>可以处理其它逻辑</strong>了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果——效率高,编程复杂,不消耗用户时间。<br><img alt="在这里插入图片描述" src="https://uploadfiles.nowcoder.com/files//_25/aa011ef3dd5640ecb85e3b62c6decfc2.png"><br>(2)Unix/Linux的五种IO模型:</p> <p>===========================================================================<br>(3)HTTP协议:</p> <p>(4)HTTP请求报文和响应报文格式。</p> <p>(5)HTTP请求方法:</p> <p>(6)HTTP状态码:</p> <p>【注】200 OK; 404 Not Found;403 Forbidden; 500 Internal Server Error。</p> <p>===========================================================================</p> <p>(7)服务器编程的基本框架:<br>| 模块 | 功能 |<br>|--|--|<br>| I/O 处理单元 |处理客户连接,读写网络数据/接收发送数据|<br>|逻辑单元 | 业务进程或线程/解析数据|<br>| 网络存储单元 | 数据库、文件或缓存 |<br>| 请求队列 | 各单元之间的通信方式 |</p> <p>(8)两种高效的事件处理模式:<br> 和 ,<strong>同步</strong> I/O 模型通常用于实现 模式,<strong>异步</strong> I/O 模型通常用于实现 模式。</p> <p>和模式的主要区别就是 <strong>真正的读取和写入操作是由谁来完成的</strong>。<br>来了事件操作系统通知应用进程,让应用进程来处理;<br>来了事件操作系统来处理,处理完再通知应用进程。</p> <p><strong>工作流程:</strong><br>1、<strong>Reactor:</strong>(同步I/O)<br>主线程往 内核事件表中<strong>注册</strong>() 上的<strong>读就绪</strong>事件;<br>主线程调用 <strong>等待</strong> 上有数据可读;<br>当 上有数据可读时, <strong>通知主线程</strong>。主线程则将 可读事件<strong>放入请求队列</strong>;<br>睡眠在请求队列上的某个<strong>工作线程被唤醒</strong>,它从 读取数据,并处理客户请求,<br>然后往内核事件表中<strong>注册</strong>()该 上的<strong>写就绪</strong>事件;<br>当主线程调用 <strong>等待</strong> 可写;<br>当 可写时, <strong>通知主线程</strong>。主线程将 可写事件<strong>放入请求队列</strong>;<br>睡眠在请求队列上的某个<strong>工作线程被唤醒</strong>,它往 上写入服务器处理客户请求的结果。</p> <p>2、<strong>Proactor:</strong><br>(异步I/O 模型)(同步I/O模型)<br>见Linux高并发服务器开发</p> <p>【注】服务器处理三类事件:I/O事件、信号事件、定时事件。</p> <p>(9)线程池:<strong>由服务器预先创建的一组子线程</strong>;线程池中的线程数量应该和 CPU 数量差不多;线程池中的所有子线程都运行着相同的代码。</p> <p>实质:<br>1、<strong>空间换时间</strong>,浪费服务器的硬件资源,换取运行效率。<br>2、池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为<strong>静态资源</strong>。<br>3、当服务器进入正式运行阶段,开始处理客户请求的时候,如果它需要相关的资源,可以直接从池中 获取,<strong>无需动态分配</strong>。<br>4、当服务器处理完一个客户连接后,可以把相关的资源放回池中,<strong>无需执行系统调用释放资源</strong>。</p> <p>===========================================================================</p> <p>(10)有限状态机:有的应用层协议头部包含数据包<strong>类型字段</strong>,每种类型可以映射为逻辑单元的<strong>一种执行状态</strong>,服务器可以根据它来编写相应的处理逻辑。<br>是逻辑单元内部的一种高效编程方法。可使用枚举+switch语句==&gt;解析头还是解析体。</p> <p>(11)正则:<br><img alt="在这里插入图片描述" src="https://uploadfiles.nowcoder.com/files//_07/f7bc5e39e9db716fcf088.png"></p> <p>(12)异步日志:开启一个<strong>子线程</strong>,从队列里读,开始<strong>写日志</strong>。<br>同步日志:在<strong>主线程里写日志</strong>。(要等待,效率慢,浪费性能)</p> <p>(13)事件:<br>即使可以使用 ET 模式,<strong>一个 socket 上的某个事件还是可能被触发多次</strong>。这在并发程序中就会引起一个问题。比如一个线程在读取完某个 socket 上的数据后开始处理这些数据,而在数据的处理过程中该socket 上又有新数据可读( EPOLLIN 再次被触发),此时另外一个线程被唤醒来读取这些新的数据。<br>于是就出现了<strong>两个线程同时操作一个 socket</strong> 的局面。<strong>一个 socket 连接在任一时刻都只被一个线程处理</strong>,可以使用 epoll 的 事件实现。</p> <p>对于注册了 事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且<strong>只触发一次</strong>,除非我们使用 函数<strong>重置</strong>该文件描述符上注册的 事件。这样,当一个线程在处理某个 socket 时,其他线程是不可能有机会操作该 socket 的。<br>但反过来思考,注册了 事件的 socket 一旦被某个线程处理完毕, 该线程就应该<strong>立即重置</strong>这个socket 上的 事件,以确保这个 socket 下一次可读时,其 事件能被触发,进而让其他工作线程有机会继续处理这个 socket 。</p> <p>(14)服务器的压力测试:<br>展示服务器的两项内容: <strong>每秒钟响应请求数</strong>和<strong>每秒钟传输数据量</strong>。<br>基本原理:<br> 首先 fork 出多个子进程,每个子进程都循环做 web 访问测试。子进程把访问的结果通过pipe 告诉父进程,父进程做最终的结果统计。</p> <p>webserver</p> <p>参考:</p> <blockquote> <p>【操作系统】进程的切换与控制·到底有啥关系?<br>[项目] Linux高并发服务器<br>答应我,这次搞懂 I/O 多路复用!<br>Linux高并发服务器开发</p> </blockquote> 

讯享网
小讯
上一篇 2025-04-30 20:08
下一篇 2025-06-10 10:04

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171699.html