工作经历
2013-09-01 -2023-02-13武汉镜明瑞吉软件工程师
嵌入式开发. 各类项目.嵌入式开发. 各类项目.嵌入式开发. 各类项目.嵌入式开发. 各类项目.嵌入式开发. 各类项目.嵌入式开发. 各类项目.嵌入式开发. 各类项目.
教育经历
2013-09-01 - 2017-01-01湖北文理学院湖北文理学院本科
技能
屏幕共享软件 C++ TCP UDP 一、屏幕共享概念: 屏幕共享,英文叫做DesktopSharing,维基百科里是这样定义的: Desktop sharing is a common name for technologies and products that allow remote access and remote collaboration on a person’s computer desktop through a graphical terminal emulator.(桌面共享是允许通过图形终端仿真器在个人计算机桌面上进行远程访问和远程协作的技术和产品的通用名称。桌面共享最常见的两种情况是:远程登录和实时协作) 通俗点解释,屏幕共享就是在自己的设备上远程观看或控制其他电脑桌面(desktop)的技术。屏幕分享又名屏幕共享、屏幕同步或同屏分享。 二、屏幕共享应用场景: 屏幕共享使用的场景一般是多台电脑(或平板、*)协同办公。比如会议室内做培训时,讲师(或演讲人)把自己的电脑画面分享给与会的其他人,这样参会者只需要观看自己的屏幕即可;比如教室里老师授课,学生电脑实时显示老师电脑课件内容;比如召开无纸化会议时,与会人员手拿PAD,画面和发言者电脑屏幕同步等等。 一般而言屏幕共享可以是:把电脑屏幕共享给多台电脑、把电脑屏幕共享给平板或*、把*屏幕共享给电脑、把*屏幕共享给平板或其他*。
高性能服务器 完成端口服务器,Socket 网络编程 Qt VS Windows 一. 完成端口的优点 1. 我想只要是写过或者想要写C/S模式网络服务器端的朋友,都应该或多或少的听过完成端口的大名吧,完成端口会充分利用Windows内核来进行I/O的调度,是用于C/S通信模式中性能最好的网络通信模型,没有之一;甚至连和它性能接近的通信模型都没有。 2. 完成端口和其他网络通信方式最大的区别在哪里呢? (1) 首先,如果使用“同步”的方式来通信的话,这里说的同步的方式就是说所有的操作都在一个线程内顺序执行完成,这么做缺点是很明显的:因为同步的通信操作会阻塞住来自同一个线程的任何其他操作,只有这个操作完成了之后,后续的操作才可以完成;一个最明显的例子就是咱们在MFC的界面代码中,直接使用阻塞Socket调用的代码,整个界面都会因此而阻塞住没有响应!所以我们不得不为每一个通信的Socket都要建立一个线程,多麻烦?这不坑爹呢么?所以要写高性能的服务器程序,要求通信一定要是异步的。 (2) 各位读者肯定知道,可以使用使用“同步通信(阻塞通信)+多线程”的方式来改善(1)的情况,那么好,想一下,我们好不容易实现了让服务器端在每一个客户端连入之后,都要启动一个新的Thread和客户端进行通信,有多少个客户端,就需要启动多少个线程,对吧;但是由于这些线程都是处于运行状态,所以系统不得不在所有可运行的线程之间进行上下文的切换,我们自己是没啥感觉,但是CPU却痛苦不堪了,因为线程切换是相当浪费CPU时间的,如果客户端的连入线程过多,这就会弄得CPU都忙着去切换线程了,根本没有多少时间去执行线程体了,所以效率是非常低下的,承认坑爹了不? (3) 而微软提出完成端口模型的初衷,就是为了解决这种"one-thread-per-client"的缺点的,它充分利用内核对象的调度,只使用少量的几个线程来处理和客户端的所有通信,消除了无谓的线程上下文切换,最大限度的提高了网络通信的性能,这种神奇的效果具体是如何实现的请看下文。 3. 完成端口被广泛的应用于各个高性能服务器程序上,例如著名的Apache….如果你想要编写的服务器端需要同时处理的并发客户端连接数量有数百上千个的话,那不用纠结了,就是它了。 二. 完成端口程序的运行演示 首先,我们先来看一下完成端口在笔者的PC机上的运行表现,笔者的PC配置如下: 大体就是i7 2600 + 16GB内存,我以这台PC作为服务器,简单的进行了如下的测试,通过Client生成3万个并发线程同时连接至Server,然后每个线程每隔3秒钟发送一次数据,一共发送3次,然后观察服务器端的CPU和内存的占用情况。 如图2所示,是客户端3万个并发线程发送共发送9万条数据的log截图 图3是服务器端接收完毕3万个并发线程和每个线程的3份数据后的log截图 最关键是图4,图4是服务器端在接收到28000个并发线程的时候,CPU占用率的截图,使用的软件是大名鼎鼎的Process Explorer,因为相对来讲这个比自带的任务管理器要准确和精确一些。 我们可以发现一个令人惊讶的结果,采用了完成端口的Server程序(蓝色横线所示)所占用的CPU才为 3.82%,整个运行过程中的峰值也没有超过4%,是相当气定神闲的……哦,对了,这还是在Debug环境下运行的情况,如果采用Release方式执行,性能肯定还会更高一些,除此以外,在UI上显示信息也很大成都上影响了性能。 相反采用了多个并发线程的Client程序(紫色横线所示)居然占用的CPU高达11.53%,甚至超过了Server程序的数倍…… 其实无论是哪种网络操模型,对于内存占用都是差不多的,真正的差别就在于CPU的占用,其他的网络模型都需要更多的CPU动力来支撑同样的连接数据。 虽然这远远算不上服务器极限压力测试,但是从中也可以看出来完成端口的实力,而且这种方式比纯粹靠多线程的方式实现并发资源占用率要低得多。
王炸 大王 + 小王,最大的牌 炸弹 四张同数值牌(如四个 9) 单牌 单张的牌(如红桃 3 ) 对牌 数值相同的两张牌(如梅花 4+ 方块 4 ) 三张牌 数值相同的三张牌(如三个 Q ) 三带一 数值相同的三张牌 + 1 张单牌,例如: 333+6 三带二 数值相同的三张牌 + 1 对牌,例如: 666+33 顺子 五张或更多的连续单牌,不包括 2 和双王 连对 三对或更多的连续对牌,不包括 2 和双王 飞机 二个或更多的连续三张牌,不包括 2 和双王 飞机带翅膀 飞机+同数量的单牌(或同数量的对牌) 四带二 四张点数相同的牌 + 两手牌 (两单或两双) 王炸带二 王炸 + 两手牌 (两单或两双)