当前位置: 首页 > news >正文

网站设计步骤和方法做dj网站用什么建站系统比较好

网站设计步骤和方法,做dj网站用什么建站系统比较好,做dj音叉网站平台,我做的网站在手机里滑动怎么这里卡WINDOWS完成端口编程 1、基本概念 2、WINDOWS完成端口的特点 3、完成端口#xff08;Completion Ports #xff09;相关数据结构和创建 4、完成端口线程的工作原理 总结 WINDOWS完成端口编程 摘要#xff1a;开发网络程序从来都不是一件容易的事情#xff0c;…WINDOWS完成端口编程 1、基本概念 2、WINDOWS完成端口的特点 3、完成端口Completion Ports 相关数据结构和创建 4、完成端口线程的工作原理 总结 WINDOWS完成端口编程         摘要开发网络程序从来都不是一件容易的事情尽管只需要遵守很少的一些规则;创建socket,发起连接接受连接发送和接受数据。真正的困难 在于 让你的程序可以适应从单单一个连接到几千个连接乃至于上万个连接。利用Windows平台完成端口进行重叠I/O的技术和Linux在2.6版本的内核中 引入的EPOll技术可以很方便在在在Windows和Linux平台上开发出支持大量连接的网络服务程序。本文介绍在Windows和Linux平台 上使用的完成端口和EPoll模型开发的基本原理同时给出实际的例子。本文主要关注C/S结构的服务器端程序因为一般来说开发一个大容量具可扩展 性的winsock程序一般就是指服务程序。 1、基本概念     设备---windows操作系统上允许通信的任何东西比如文件、目录、串行口、并行口、邮件槽、命名管道、无名管道、套接字、控制台、逻辑磁盘、物理 磁盘等。绝大多数与设备打交道的函数都是CreateFile/ReadFile/WriteFile等。所以我们不能看到**File函数就只想到文件 设备。与设备通信有两种方式同步方式和异步方式。同步方式下当调用ReadFile函数时函数会等待系统执行完所要求的工作然后才返回异步方式 下ReadFile这类函数会直接返回系统自己去完成对设备的操作然后以某种方式通知完成操作。 重叠I/O----顾名思义当你调用了某个函数比如ReadFile就立刻返回做自己的其他动作的时候同时系统也在对I/0设备进行你要求的操 作在这段时间内你的程序和系统的内部动作是重叠的因此有更好的性能。所以重叠I/O是用于异步方式下使用I/O设备的。 重叠I/O需要使用的一个非常重要的数据结构OVERLAPPED。 2、WINDOWS完成端口的特点    Win32重叠I/O(Overlapped I/O)机制允许发起一个操作然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说重叠IO机制尤其有用因为发起重叠操作的线程 在重叠请求发出后就可以自由的做别的事情了。在WinNT和Win2000上提供的真正的可扩展的I/O模型就是使用完成端口Completion Port的重叠I/O.完成端口---是一种WINDOWS内核对象。完成端口用于异步方式的重叠I/0情况下当然重叠I/O不一定非使用完成端口不 可还有设备内核对象、事件对象、告警I/0等。但是完成端口内部提供了线程池的管理可以避免反复创建线程的开销同时可以根据CPU的个数灵活的决定 线程个数而且可以让减少线程调度的次数从而提高性能其实类似于WSAAsyncSelect和select函数的机制更容易兼容Unix但是难以实现 我们想要的“扩展性”。而且windows的完成端口机制在操作系统内部已经作了优化提供了更高的效率。所以我们选择完成端口开始我们的服务器程序的 开发。 1、发起操作不一定完成系统会在完成的时候通知你通过用户在完成端口上的等待处理操作的结果。所以要有检查完成端口取操作结果的线程。在完成端口 上守候的线程系统有优化除非在执行的线程阻塞不会有新的线程被激活以此来减少线程切换造成的性能代价。所以如果程序中没有太多的阻塞操作没有必要 启动太多的线程CPU数量的两倍一般这样来启动线程。 2、操作与相关数据的绑定方式在提交数据的时候用户对数据打相应的标记记录操作的类型在用户处理操作结果的时候通过检查自己打的标记和系统的操作结果进行相应的处理。  3、操作返回的方式:一般操作完成后要通知程序进行后续处理。但写操作可以不通知用户此时如果用户写操作不能马上完成写操作的相关数据会被暂存到到非 交换缓冲区中在操作完成的时候系统会自动释放缓冲区。此时发起完写操作使用的内存就可以释放了。此时如果占用非交换缓冲太多会使系统停止响应。 3、完成端口Completion Ports 相关数据结构和创建     其实可以把完成端口看成系统维护的一个队列操作系统把重叠IO操作完成的事件通知放到该队列里由于是暴露 “操作完成”的事件通知所以命名为“完成端口”COmpletion Ports。一个socket被创建后可以在任何时刻和一个完成端口联系起来。 完成端口相关最重要的是OVERLAPPED数据结构 typedef struct _OVERLAPPED {      ULONG_PTR Internal;//被系统内部赋值用来表示系统状态      ULONG_PTR InternalHigh;// 被系统内部赋值传输的字节数      union {          struct {              DWORD Offset;//和OffsetHigh合成一个64位的整数用来表示从文件头部的多少字节开始              DWORD OffsetHigh;//操作如果不是对文件I/O来操作则必须设定为0          };          PVOID Pointer;      };      HANDLE hEvent;//如果不使用就务必设为0,否则请赋一个有效的Event句柄  } OVERLAPPED, *LPOVERLAPPED;  下面是异步方式使用ReadFile的一个例子  OVERLAPPED Overlapped;  Overlapped.Offset345;  Overlapped.OffsetHigh0;  Overlapped.hEvent0;  //假定其他参数都已经被初始化  ReadFile(hFile,buffer,sizeof(buffer),dwNumBytesRead,Overlapped);  这样就完成了异步方式读文件的操作然后ReadFile函数返回由操作系统做自己的事情下面介绍几个与OVERLAPPED结构相关的函数  等待重叠I/0操作完成的函数  BOOL GetOverlappedResult ( HANDLE hFile, LPOVERLAPPED lpOverlapped,//接受返回的重叠I/0结构 LPDWORD lpcbTransfer,//成功传输了多少字节数 BOOL fWait //TRUE只有当操作完成才返回FALSE直接返回如果操作没有完成通过调//用GetLastError ( )函数会返回ERROR_IO_INCOMPLETE  ); 宏HasOverlappedIoCompleted可以帮助我们测试重叠I/0操作是否完成该宏对OVERLAPPED结构的Internal成员进行了测试查看是否等于STATUS_PENDING值。         一般来说一个应用程序可以创建多个工作线程来处理完成端口上的通知事件。工作线程的数量依赖于程序的具体需要。但是在理想的情况下应该对应一个 CPU 创建一个线程。因为在完成端口理想模型中每个线程都可以从系统获得一个“原子”性的时间片轮番运行并检查完成端口线程的切换是额外的开销。在实际开 发的时候还要考虑这些线程是否牵涉到其他堵塞操作的情况。如果某线程进行堵塞操作系统则将其挂起让别的线程获得运行时间。因此如果有这样的情况 可以多创建几个线程来尽量利用时间。 应用完成端口     创建完成端口完成端口是一个内核对象使用时他总是要和至少一个有效的设备句柄进行关联完成端口是一个复杂的内核对象创建它的函数是 HANDLE CreateIoCompletionPort(      IN HANDLE FileHandle,      IN HANDLE ExistingCompletionPort,      IN ULONG_PTR CompletionKey,      IN DWORD NumberOfConcurrentThreads      );  通常创建工作分两步 第一步创建一个新的完成端口内核对象可以使用下面的函数        HANDLE CreateNewCompletionPort(DWORD dwNumberOfThreads)  {            return CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,dwNumberOfThreads);  };         第二步将刚创建的完成端口和一个有效的设备句柄关联起来可以使用下面的函数        bool AssicoateDeviceWithCompletionPort(HANDLE hCompPort,HANDLE hDevice,DWORD dwCompKey)  {            HANDLE hCreateIoCompletionPort(hDevice,hCompPort,dwCompKey,0);            return hhCompPort;  };  说明  1 CreateIoCompletionPort函数也可以一次性的既创建完成端口对象又关联到一个有效的设备句柄  2 CompletionKey是一个可以自己定义的参数我们可以把一个结构的地址赋给它然后在合适的时候取出来使用最好要保证结构里面的内存不是分配在栈上除非你有十分的把握内存会保留到你要使用的那一刻。 3 NumberOfConcurrentThreads通常用来指定要允许同时运行的的线程的最大个数。通常我们指定为0这样系统会根据CPU的个数来自 动确定。创建和关联的动作完成后系统会将完成端口关联的设备句柄、完成键作为一条纪录加入到这个完成端口的设备列表中。如果你有多个完成端口就会有多 个对应的设备列表。如果设备句柄被关闭则表中自动删除该纪录。 4、完成端口线程的工作原理 完成端口可以帮助我们管理线程池但是线程池中的线程需要我们使用_beginthreadex来创建凭什么通知完成端口管理我们的新线程呢答案在函数GetQueuedCompletionStatus。该函数原型  BOOL GetQueuedCompletionStatus(      IN HANDLE CompletionPort,      OUT LPDWORD lpNumberOfBytesTransferred,      OUT PULONG_PTR lpCompletionKey,      OUT LPOVERLAPPED *lpOverlapped,      IN DWORD dwMilliseconds  );  这个函数试图从指定的完成端口的I/0完成队列中抽取纪录。只有当重叠I/O动作完成的时候完成队列中才有纪录。凡是调用这个函数的线程将被放入到完成 端口的等待线程队列中因此完成端口就可以在自己的线程池中帮助我们维护这个线程。完成端口的I/0完成队列中存放了当重叠I/0完成的结果---- 一条纪录该纪录拥有四个字段前三项就对应GetQueuedCompletionStatus函数的2、3、4参数最后一个字段是错误信息 dwError。我们也可以通过调用PostQueudCompletionStatus模拟完成了一个重叠I/0操作。  当I/0完成队列中出现了纪录完成端口将会检查等待线程队列该队列中的线程都是通过调用GetQueuedCompletionStatus函数使自 己加入队列的。等待线程队列很简单只是保存了这些线程的ID。完成端口会按照后进先出的原则将一个线程队列的ID放入到释放线程列表中同时该线程将从 等待GetQueuedCompletionStatus函数返回的睡眠状态中变为可调度状态等待CPU的调度。所以我们的线程要想成为完成端口管理的线 程就必须要调用GetQueuedCompletionStatus函数。出于性能的优化实际上完成端口还维护了一个暂停线程列表具体细节可以参考 《Windows高级编程指南》我们现在知道的知识已经足够了。 完成端口线程间数据传递线程间传递数据最常用的办法是在_beginthreadex函数中将参数传递给线程函数或者使用全局变量。但是完成端口还有自 己的传递数据的方法答案就在于CompletionKey和OVERLAPPED参数。 CompletionKey被保存在完成端口的设备表中是和设备句柄一一对应的我们可以将与设备句柄相关的数据保存到CompletionKey中 或者将CompletionKey表示为结构指针这样就可以传递更加丰富的内容。这些内容只能在一开始关联完成端口和设备句柄的时候做因此不能在以后 动态改变。 OVERLAPPED参数是在每次调用ReadFile这样的支持重叠I/0的函数时传递给完成端口的。我们可以看到如果我们不是对文件设备做操作该 结构的成员变量就对我们几乎毫无作用。我们需要附加信息可以创建自己的结构然后将OVERLAPPED结构变量作为我们结构变量的第一个成员然后传 递第一个成员变量的地址给ReadFile函数。因为类型匹配当然可以通过编译。当GetQueuedCompletionStatus函数返回时我 们可以获取到第一个成员变量的地址然后一个简单的强制转换我们就可以把它当作完整的自定义结构的指针使用这样就可以传递很多附加的数据了。太好了 只有一点要注意如果跨线程传递请注意将数据分配到堆上并且接收端应该将数据用完后释放。我们通常需要将ReadFile这样的异步函数的所需要的缓 冲区放到我们自定义的结构中这样当GetQueuedCompletionStatus被返回时我们的自定义结构的缓冲区变量中就存放了I/0操作的 数据。CompletionKey和OVERLAPPED参数都可以通过GetQueuedCompletionStatus函数获得。 线程的安全退出        很多线程为了不止一次的执行异步数据处理需要使用如下语句 while (true) {        ......        GetQueuedCompletionStatus(...);          ...... } 那么如何退出呢答案就在于上面曾提到的PostQueudCompletionStatus函数我们可以用它发送一个自定义的包含了OVERLAPPED成员变量的结构地址里面包含一个状态变量当状态变量为退出标志时线程就执行清除动作然后退出。
http://www.w-s-a.com/news/808707/

相关文章:

  • 专业做商铺的网站个人网页html模板完整代码
  • 什么网站做美食最好最专业关键词推广是什么意思
  • 自助建设网站软件网站导航网站可以做吗
  • 网站模板放哪长沙网站优化分析
  • 泉州网站建设价钱网站模板素材
  • 南通网站托管js建设网站外网
  • 成都企业网站公司wordpress内页模板
  • 58同城建网站怎么做wordpress评论显示数字ip
  • 免费制作论坛网站模板免费下载北京网站制作长沙
  • 旅游网网站建设网站如何自己做seo
  • 如何验证网站所有权做二手家具回收哪个网站好
  • 做哪种网站赚钱项目开发流程
  • 网站建设和网站网络推广网站建设软件定制
  • 站长工具网址查询全球云邮登陆网站
  • 宁波 住房和建设局网站网上发帖推广
  • 平面设计在线网站工业设计公司有哪些
  • 福州网站设计外包公司网站做的比较好
  • 如何设计网站首页网站开发综合技能实训心得体会
  • 用织梦做的网站好用吗w网站链接如何做脚注
  • 东莞做网站公司在哪哪里有网站培训的
  • 做宣传 为什么要做网站那重庆网站建设公司在线联系
  • 网站设计制作售价多少钱制作图片的软件是
  • 网站验证码目录简单带数据库的网站模版
  • 制作网站用c#做前台网站建设专题的意义
  • 广西建设职业技术学院教育网站牡丹区建设局网站
  • 网站后台怎么用ftp打开上海外贸进出口有限公司
  • 淘宝建设网站的意义大学生做那个视频网站
  • 如何提高你的网站的粘性建设银行流水网站
  • 微信h5在哪个网站做泰州专业网站制作公司
  • 现在.net做网站的多吗建设工程造价网