iocp

[apue] epoll 的一些不为人所注意的特性

被刻印的时光 ゝ 提交于 2020-08-13 02:32:41
之前曾经使用 epoll 构建过一个轻量级的 tcp 服务框架: 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 在调试的过程中,发现一些 epoll 之前没怎么注意到的特性。 a) iocp 是完全线程安全的,即同时可以有多个线程等待在 iocp 的完成队列上;   而 epoll 不行,同时只能有一个线程执行 epoll_wait 操作,因此这里需要做一点处理,   网上有人使用 condition_variable + mutex 实现 leader-follower 线程模型,但我只用了一个 mutex 就实现了,   当有事件发生了,leader 线程在执行事件处理器之前 unlock 这个 mutex,   就可以允许等待在这个 mutex 上的其它线程中的一个进入 epoll_wait 从而担任新的 leader。   (不知道多加一个 cv 有什么用,有明白原理的提示一下哈) b) epoll 在加入、删除句柄时是可以跨线程的,而且这一操作是线程安全的。   之前一直以为 epoll 会像 select 一像,添加或删除一个句柄需要先通知 leader 从 epoll_wait 中醒来,   在重新 wait 之前通过 epoll_ctl 添加或删除对应的句柄。但是现在看完全可以在另一个线程中执行 epoll_ctl 操作   而不用担心多线程问题

.NET 异步详解(更新)

萝らか妹 提交于 2020-08-10 05:05:13
前言 博客园(cnblogs.com)中有很多关于 .NET async / await 的介绍,但是很遗憾,很少有正确的,甚至说大多都是“从现象编原理”都不过分。 最典型的比如通过前后线程 ID 来推断其工作方式、在 async 方法中用 Thread.Sleep 来解释 Task 机制而导出多线程模型的结论、在 Task.Run 中包含 IO bound 任务来推出这是开了一个多线程在执行任务的结论等等。 看上去似乎可以解释的通,可是很遗憾,无论是从原理还是结论上看都是错误的。 要了解 .NET 中的 async / await 机制,首先需要有操作系统原理的基础,否则的话是很难理解清楚的,如果没有这些基础而试图向他人解释,大多也只是基于现象得到的错误猜想。 初看异步 说到异步大家应该都很熟悉了,2012 年 C# 5 引入了新的异步机制: Task ,并且还有两个新的关键字 await 和 async ,这已经不是什么新鲜事了,而且如今这个异步机制已经被各大语言借鉴,如 JavaScript、TypeScript、Rust、C++ 等等。 下面给出一个简单的对照: 语言 调度单位 关键字/方法 C# Task<> 、 ValueTask<> async 、 await C++ std::future<> co_await Rust std::future::Future<>

.NET 异步详解

时间秒杀一切 提交于 2020-08-09 12:36:20
前言 博客园中有很多关于 .NET async / await 的介绍,但是很遗憾,很少有正确的,甚至说大多都是“从现象编原理”都不过分。 最典型的比如通过前后线程 ID 来推断其工作方式、在 async 方法中用 Thread.Sleep 来解释 Task 机制而导出多线程模型的结论、在 Task.Run 中包含 IO bound 任务来推出这是开了一个多线程在执行任务的结论等等。 看上去似乎可以解释的通,可是很遗憾,无论是从原理还是结论上看都是错误的。 要了解 .NET 中的 async / await 机制,首先需要有操作系统原理的基础,否则的话是很难理解清楚的,如果没有这些基础而试图向他人解释,大多也只是基于现象得到的错误猜想。 初看异步 说到异步大家应该都很熟悉了,2012 年 C# 5 引入了新的异步机制: Task ,并且还有两个新的关键字 await 和 async ,这已经不是什么新鲜事了,而且如今这个异步机制已经被各大语言借鉴,如 JavaScript、TypeScript、Rust、C++ 等等。 下面给出一个简单的对照: 语言 调度单位 关键字/方法 C# Task<> 、 ValueTask<> async 、 await C++ std::future<> co_await Rust std::future::Future<> .await

select函数参数及其使用

人走茶凉 提交于 2020-08-09 01:42:49
Select在Socket编程中还是比较重要的,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。   Select的函数格式(Unix系统下的伯克利socket编程,和windows下的略有区别,体现两个方面:一是select函数的第一个参数,在windows下可以忽略,但在linux下必须设为最大文件描述符加1;二是结构fd_set在两个系统里定义不一样): int select( int maxfdp,fd_set * readfds,fd_set * writefds,fd_set * errorfds, struct timeval * timeout); /* 参数列表 int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。    fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。  

.NET 异步详解

安稳与你 提交于 2020-08-08 11:35:16
前言 博客园中有很多关于 .NET async / await 的介绍,但是很遗憾,很少有正确的,甚至说大多都是“从现象编原理”都不过分。 最典型的比如通过前后线程 ID 来推断其工作方式、在 async 方法中用 Thread.Sleep 来解释 Task 机制而导出多线程模型的结论、在 Task.Run 中包含 IO bound 任务来推出这是开了一个多线程在执行任务的结论等等。 看上去似乎可以解释的通,可是很遗憾,无论是从原理还是结论上看都是错误的。 要了解 .NET 中的 async / await 机制,首先需要有操作系统原理的基础,否则的话是很难理解清楚的,如果没有这些基础而试图向他人解释,大多也只是基于现象得到的错误猜想。 初看异步 说到异步大家应该都很熟悉了,2012 年 C# 5 引入了新的异步机制: Task ,并且还有两个新的关键字 await 和 async ,这已经不是什么新鲜事了,而且如今这个异步机制已经被各大语言借鉴,如 JavaScript、TypeScript、Rust、C++ 等等。 下面给出一个简单的对照: 语言 调度单位 关键字/方法 C# Task<> 、 ValueTask<> async 、 await C++ std::future<> co_await Rust std::future::Future<> .await

一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent

时光毁灭记忆、已成空白 提交于 2020-07-29 04:58:54
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力。 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在客户机器上的,Win32 上作为开机自启动的 windows 服务运行; Linux 上作为 daemon 在后台运行。总的说来就是用于接收几个产品进程的连接,因此轻量化是其最重要的要求,在这个基础上要能兼顾跨平台就可以了。 其实主要就是 windows,再兼顾一点儿 linux。 考察了几个现有的开源网络框架,从 ACE 、boost::asio 到 libevent,都有不尽于人意的地方: a) ACE:太重,只是想要一个网络框架,结果它扒拉扒拉一堆全提供了,不用还不行; b) boost::asio:太复杂,牵扯到 boost 库,并且引入了一堆 c++ 模板,需要高版本 c++ 编译器支持; c) libevent:这个看着不错,当时确实用这个做底层封装了一版,结果发版后发现一个比较致命的问题,导致在防火墙设置比较严格的机器上初始化失败,这个后面我会详细提到。 其它的就更不用说了,之前也粗略看过陈硕的 muddo,总的感觉吧,它是基于其它开源框架不足地方改进的一个库,有相当可取的地方,但是这个改进的方向也主要是解决更大并发、更多连接,不是我的痛点,所以没有继续深入研究。 好了

[apue] epoll 的一些不为人所注意的特性

拜拜、爱过 提交于 2020-07-28 07:36:40
之前曾经使用 epoll 构建过一个轻量级的 tcp 服务框架: 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 在调试的过程中,发现一些 epoll 之前没怎么注意到的特性。 a) iocp 是完全线程安全的,即同时可以有多个线程等待在 iocp 的完成队列上;   而 epoll 不行,同时只能有一个线程执行 epoll_wait 操作,因此这里需要做一点处理,   网上有人使用 condition_variable + mutex 实现 leader-follower 线程模型,但我只用了一个 mutex 就实现了,   当有事件发生了,leader 线程在执行事件处理器之前 unlock 这个 mutex,   就可以允许等待在这个 mutex 上的其它线程中的一个进入 epoll_wait 从而担任新的 leader。   (不知道多加一个 cv 有什么用,有明白原理的提示一下哈) b) epoll 在加入、删除句柄时是可以跨线程的,而且这一操作是线程安全的。   之前一直以为 epoll 会像 select 一像,添加或删除一个句柄需要先通知 leader 从 epoll_wait 中醒来,   在重新 wait 之前通过 epoll_ctl 添加或删除对应的句柄。但是现在看完全可以在另一个线程中执行 epoll_ctl 操作   而不用担心多线程问题

DELPHI高性能大容量SOCKET并发(八):断点续传(上传也可以续传)

一个人想着一个人 提交于 2020-05-07 10:59:56
断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1;下载开始的时候,由客户端上报本地已经下载大小,服务器根据位置信息下发数据,因此上传下载协议都需要带Size大小,例如我们协议格式。 上传开始: 客户端->服务器 { [Request] Command=Upload Dir=Dir #目录,全路径名 FileName=FileName #文件名(不包括路径) } 服务器->客户端 { [Response] Command=Upload Code= Error Code #错误码 Message=Message #如果出错,返回错误描述信息 FileSize=FileSize #已上传文件的大小,用于续传 } 下载开始: 客户端->服务器 { [Request] Command=Download Dir=Dir #目录,全路径名 FileName=FileName #文件名(不包括路径) FileSize=FileSize #客户端本地文件大小,用于断点续传 PacketSize=PacketSize #下发数据包大小,单位为KB,用于速度测试 } 服务器->客户端 { [Response] Command= Download Code= Error Code #错误码 Message=Message

Delphi IOCP UDP完成端口服务端——网络高速传输数据文件系统架构

試著忘記壹切 提交于 2020-05-03 22:00:31
嗯,是的,标题有些那个,不过浏览器搜索出来的几乎全部是C++的,Delphi这块完全是空缺的。 不知道各位Delphi的爱好者们有没有关注腾讯这段时间的各种信息推广。涉及到各方面的行业。 不过我最佩服的是他们的实时各种网络行为,不得不说,他们的服务器确实牛逼,各种实时网络视频各种交互都是相当流畅的。 除了 TCPIOCP 完成端口成型之外,在这个基础上,继续调试出了 UDPIOCP 完成端口系统,弄这个玩意就是想做一个能够在目前这种复杂无比的网络中,能够完成游戏资源实时更新的一个高并发服务系统。 现在的网络简直复杂得像一堆牛屎那样,你看看你桌面上的任何一个程序,有几个是不联网的?几乎没有吧!现在的玩家有几个电脑上面是不同时打开几个程序的,QQ,各种音乐播放器,各种视频播放器等等,这些都是抢夺带宽最厉害的玩意。所以传统的TCP协议的网络传输系统已经很难符合目前这种复杂的环境了。 UDPIOCP完成端口 这个玩意,构建起来不容易,网上能用的代码,一句话:没有!不相信,自己搜索搜索。 这个玩意比TCP完成端口还复杂。 两个控件,一个UDP服务端,一个UDP客户端,至于客户端是自己新写的,内含两种设置,一种是采用常规TCP那样的链接模式,一种是非链接模式,可以设置阻塞或者异步传输。 上面客户端采用定时器,值设置为10,这种速度发送消息比较快了,上面是两者的CPU占用情况。在完全没有优化之下

Delphi IOCP UDP完成端口服务端——网络高速传输数据文件系统架构

柔情痞子 提交于 2020-05-02 21:51:49
嗯,是的,标题有些那个,不过浏览器搜索出来的几乎全部是C++的,Delphi这块完全是空缺的。 不知道各位Delphi的爱好者们有没有关注腾讯这段时间的各种信息推广。涉及到各方面的行业。 不过我最佩服的是他们的实时各种网络行为,不得不说,他们的服务器确实牛逼,各种实时网络视频各种交互都是相当流畅的。 除了 TCPIOCP 完成端口成型之外,在这个基础上,继续调试出了 UDPIOCP 完成端口系统,弄这个玩意就是想做一个能够在目前这种复杂无比的网络中,能够完成游戏资源实时更新的一个高并发服务系统。 现在的网络简直复杂得像一堆牛屎那样,你看看你桌面上的任何一个程序,有几个是不联网的?几乎没有吧!现在的玩家有几个电脑上面是不同时打开几个程序的,QQ,各种音乐播放器,各种视频播放器等等,这些都是抢夺带宽最厉害的玩意。所以传统的TCP协议的网络传输系统已经很难符合目前这种复杂的环境了。 UDPIOCP完成端口 这个玩意,构建起来不容易,网上能用的代码,一句话:没有!不相信,自己搜索搜索。 这个玩意比TCP完成端口还复杂。 两个控件,一个UDP服务端,一个UDP客户端,至于客户端是自己新写的,内含两种设置,一种是采用常规TCP那样的链接模式,一种是非链接模式,可以设置阻塞或者异步传输。 上面客户端采用定时器,值设置为10,这种速度发送消息比较快了,上面是两者的CPU占用情况。在完全没有优化之下