原文地址: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线程池的更多相关文章

  1. 详解线程池的作用及Java中如何使用线程池

    服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...

  2. 聊聊面试中的 Java 线程池

    ​背景 关于 Java 的线程池我想大家肯定不会陌生,在工作中或者自己平时的学习中多多少少都会用到,那你真的有了解过底层的实现原理吗?还是说只停留在用的阶段呢?而且关于 Java 线程池也是在面试中的 ...

  3. Python中如何使用线程池和进程池?

    进程池的使用 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务. 那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程 ...

  4. Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务

    通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化 ...

  5. 从源代码分析Universal-Image-Loader中的线程池

    一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...

  6. android中对线程池的理解与使用

    前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...

  7. Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池

    一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...

  8. 探究ElasticSearch中的线程池实现

    探究ElasticSearch中的线程池实现 ElasticSearch里面各种操作都是基于线程池+回调实现的,所以这篇文章记录一下java.util.concurrent涉及线程池实现和Elasti ...

  9. Java中线程池的实现原理

    知识点总结 ---------------------------------------------------------------------------------------------- ...

随机推荐

  1. DIV+CSS制作二级横向弹出菜单,略简单

    没有使用JavaScript控制二级菜单的显示,结果如上图所示. 代码如下: <!DOCTYPE html> <html> <head> <meta char ...

  2. 在windows环境下,为什么要用Notepad++编辑?

    摘自廖雪峰的git教程之创建版本库 首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外.版本控制系统可以告诉你每次的改动,比如 ...

  3. sge学习 (转)

    转自http://biancheng.dnbcw.info/linux/417992.html 命令: qsub   -  submit a batch job to Grid Engine. qsh ...

  4. Android——配置文件的保存SharedPreferences进行数据存储

    很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果 ...

  5. Centos 安装vsftpd 服务器

    一:检查有没有安装vsftpd 二:安装vsftpd 三:安装之后重启 四:修改vsftpd配置文件 配置文件路径在/etc/vsftpd目录下 默认是注释掉的,把#号去掉 然后重启vsftpd 五: ...

  6. MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码

    MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查 ...

  7. putty连接ubuntu虚拟机缓慢问题的解决

    vmware安装系统使用了ubuntu,安装后每次用PUTTY登录发现都到等很久,经过上网搜索,发现是Ubuntu安全机制导致的连接缓慢问题,   解决方法如下;   1. sudo vim /etc ...

  8. zookeeper安装及部署

    安装及部署 一. 单机安装.配置 1.下载zookeeper二进制安装包 下载 curl -L -O http://apache.fayea.com/zookeeper/stable/zookeepe ...

  9. myeclipse的debug模式中breakpoint窗口怎么调出来

    myeclipse的debug模式中breakpoint窗口怎么调出来? 解决办法: window-->show view-->breakpoints.   如下:

  10. 【总结】我所整理的float, inline-block还有position:absolute

    这篇主要写了一下几个知识点: 浮动和inline-block的概念和选择 浮动和position:absolute对于脱离文档流的区别 这篇文章参考了一下几个链接: https://www.zhihu ...