C# 中的IOCP线程池
原文地址:http://www.theukwebdesigncompany.com/articles/iocp-thread-pooling.php
PartOne : Introduction
当使用C#构建服务器端应用时,创建线程池是一个十分重要的能力。线程池允许服务器端程序通过队列最大程度的处理任务。除了构建线程池之外,还有两个方案:
1. 使用单线程处理所有的任务。
2. 当任务需要时就产生子线程来处理任务。
本文定义任务为需要处理的事件,这些工作也许是也许不是分布式的数据。目标是以最高的效率和最短的时间处理这些任务。
首先是一个通用的原则,如果可以用单线程处理所有任务,那么使用单线程。如果同时使用多线程处理任务是不必要的,意味着应用程序有更多的事情要做,或者单线程处理更快。比如当多个线程请求同一资源时,会产生阻塞,必须等待前面的线程处理完之后才可以获取资源,完成任务处理。在发生阻塞时,等待的线程会进入休眠状态,不做任何工作。但是实际上这些线程会对操作系统产生很大的负担。操作系统必须监控任务处理情况,当资源释放时,决定唤醒哪个线程进行处理。如果需要处理任务的线程因为等待资源而处于休眠状态,这样我们就需要处理这个任务。在这种情况下可以将这些线程放入队列,并用单个线程处理这个队列。
最先等待资源的线程不一定先得到资源,如图-1所示。
图-1 线程示例图
如果任务之间是相互独立的,这儿的相互独立是指不会发生资源冲突,在处理多任务时可以产生多个线程来处理不同的任务。此时的问题是操作系统,比如windows操作系统,运行多个线程时,需要等待CPU。Windosw操作系统需要管理所有的线程,而UNIX操作系统则不需要。如果有大量线程同时运行,系统性能将会大大降低。
在.net框架,“system.Threading”命名空间内有一个ThreadPool类。不幸的是这个类是一个静态类,只能有一个线程池。这个线程池不允许设定线程的并发级别。不同的并发级别允许并发的线程不同。如果我们设置合适的并发级别,我们会得到最高的效率。
假设我们有一个可以允许4个线程并发级别为1的线程池。然后有三个任务发送给线程池处理。只能有一个线程处理任务,其他的线程都处在等待状态。如图-2。
图-2 线程池
那么当并发级别设置为1时,如果运行多个线程?如果图-2 中的线程1 进行休眠,线程池将会启动另外一个线程。如图-3。
图-3
突然的线程1 被唤醒,线程4很有可能还没有结束。这样我们就有了两个线程同时运行,虽然并发级别仍然为1.如图-4。
图-4
其他的线程只有等这两个线程都进入休眠状态才能运行。即使并发级别限制活动线程池中在任意给定时间的数量,我们可以有更多的活动线程然后并发级别允许。这一切都取决于池中的线程的状态,以及如何快速的线程可以完成,他们正在处理的工作。
一个好的设置并发级别的策略是按照系统的CPU的数量进行设置。如果CPU处在空闲状态,此时有任务需要处理,则启动一个新的线程来处理任务。如果CPU忙,则不会新建线程。同时我们需要注意,不要让一个线程长时间的处于休眠状态,这会导致所有的线程池都处在激活状态,影响线程池的效率和服务器的效率。
下面会介绍如何添加 IOCP线程池到应用中。
Part2: Defining the Solution
略。
C# 中的IOCP线程池的更多相关文章
- 详解线程池的作用及Java中如何使用线程池
服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...
- 聊聊面试中的 Java 线程池
背景 关于 Java 的线程池我想大家肯定不会陌生,在工作中或者自己平时的学习中多多少少都会用到,那你真的有了解过底层的实现原理吗?还是说只停留在用的阶段呢?而且关于 Java 线程池也是在面试中的 ...
- Python中如何使用线程池和进程池?
进程池的使用 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务. 那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程 ...
- Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务
通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化 ...
- 从源代码分析Universal-Image-Loader中的线程池
一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...
- android中对线程池的理解与使用
前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...
- 探究ElasticSearch中的线程池实现
探究ElasticSearch中的线程池实现 ElasticSearch里面各种操作都是基于线程池+回调实现的,所以这篇文章记录一下java.util.concurrent涉及线程池实现和Elasti ...
- Java中线程池的实现原理
知识点总结 ---------------------------------------------------------------------------------------------- ...
随机推荐
- Egit Patch
Git为我们提供了Patch功能,Patch中包含了源码更改的描述,能够应用于其他Eclipse工作空间或者Git仓库.也就是说,可以将当前提交导出至其他分支或者项目中. 举个例子,项目A.B中使用了 ...
- spring mvc 请求转发和重定向
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- struts2 ajax的一种实现方式
/** * ajax请求,通过省份id获取学习中心 */ public void getSitesByPid() { HttpServletResponse response = ServletAct ...
- 公钥与私钥,HTTPS详解
1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后用鲍勃的公钥加密,就可以达到 ...
- graphql 新API 开发方式
我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范 定义了支持 Schema 查询的 DSQL (Domain Specific Query Langua ...
- js中逻辑为false的8种情况
如果对象无初始值或者其值为 0.-0.null."".false.undefined 或者 NaN,那么对象的逻辑值为 false. typeof 返回的是字符串,有六种可能:&q ...
- LINUX软件./configure 配置出现:configure: error: newly created file is older than distributed files!
当在安装tar源码包的时候出现以下报错如何解决? [root@jieniruyan gst-fluendo-mp3-]# ./configurechecking for a BSD-compatibl ...
- C++中没有finally,那么应该在如何关闭资源
这是一篇有趣的帖子 原文链接: http://bbs.csdn.net/topics/90070457 楼主: C++中没有finally,那么应该在哪里关闭资源? C++的try{}catch(){ ...
- 【uTenux实验】中断处理
中断处理是一个比较有意思的东西.uTenux的中断处理包括了处理外部中断.CPU异常等.他是OS中任务无关部分.因此,当中断到来的时候OS会停止任务调度,不会发生任务切换.直到程序从中断中返回. uT ...
- JVM垃圾回收参数说明整理
java -Xms4g -Xmx4g -Xmn3g -Xss256k -server -XX:PermSize=64M -XX:MaxPermSize=64M -XX:+UseConcMarkSwee ...