并发

linux下使用select I/O复用和多线程编程实现简单的TCP服务器

馋奶兔 提交于 2019-12-04 04:48:31
I/O 复用之Select模型 I/O 复用使得程序能够同时监听多个文件描述符,但是,他本身也是阻塞的,并且当一个或多个文件描述符准备就绪时,如果不采用其他措施,程序只能按顺序处理其中的每个文件描述符。如果要使程序能够并行运行,只能使用多进程或多线程的方式。 Linux 下实现I/O复用的系统调用主要有select、poll和epoll,下面将详细介绍select的系统调用。 Select 系统调用的用途:在一段时间内,监听用户感兴趣的文件描述符上面的可读、可写和异常等事件。 相关 API 的介绍: #include <sys/select.h> int select(int nfds, fd_set * readfds, fd_set * writefdds, fd_set * exceptfds, struct timeval * timeout); ① 、 nfds参数:所有监听的文件描述符的最大值 + 1 ② 、 readfds、writefds和exceptfds参数分别为可读、可写和异常等事件对应的文件描述符集合;程序只需要传入自己感兴趣的文件描述符,内核将修改他们来通知程序那些文件描述符已经准备就绪;fd_set结构体仅包含一个整形数组,该数组的每一个元素的每一位标志一个文件描述符,下面的一组宏用来操作fd_set的每一位: FD_ZERO(fd_set *

线程数究竟设多少合理

半城伤御伤魂 提交于 2019-12-04 04:30:44
一、需求缘起 Web-Server 通常有个配置, 最大工作线程数 ,后端服务一般也有个配置,工作线程池的 线程数量 ,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为 CPU 核数的 2 倍,有些业务设置为 CPU 核数的 8 倍,有些业务设置为 CPU 核数的 32 倍。 “工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能 ,是本文要讨论的问题。 二、一些共性认知 在进行进一步深入讨论之前,先以提问的方式就一些共性认知达成一致。 提问:工作线程数是不是设置的越大越好? 回答: 肯定不是的 1 )一来服务器 CPU 核数有限,同时并发的线程数是有限的, 1 核 CPU 设置 10000 个工作线程没有意义 2 )线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低 提问:调用 sleep() 函数的时候,线程是否一直占用 CPU ? 回答: 不占用 ,等待时会把 CPU 让出来,给其他需要 CPU 资源的线程使用 不止调用 sleep() 函数,在进行一些阻塞调用,例如网络编程中的 阻塞 accept() 【等待客户端连接】和 阻塞 recv() 【等待下游回包】也不占用CPU资源 提问:如果 CPU 是单核,设置多线程有意义么,能提高并发性能么? 回答: 即使是单核,使用多线程也是有意义的 1 )多线程编码可以让我们的服务 / 代码更加清晰

【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现

爱⌒轻易说出口 提交于 2019-12-04 04:17:46
在对线程池的介绍中,提到了一个非常特殊的等待队列SynchronousQueue。SynchronousQueue的容量为0,任何一个对SynchronousQueue的写需要等待一个对SynchronousQueue的读,反之亦然。因此, SynchronousQueue与其说是一个队列,不如说是一个数据交换通道。 那SynchronousQueue的其妙功能是如何实现的呢? 既然我打算在这一节中介绍它,那么SynchronousQueue比如和无锁的操作脱离不了关系。实际上SynchronousQueue内部也正是大量使用了无锁工具。 对SynchronousQueue来说,它将put()和take()两个功能截然不同的操作抽象为一个共通的方法Transferer.transfer()。从字面上看,这就是数据传递的意思。它的完整签名如下: Object transfer(Object e, boolean timed, long nanos) 当参数e为非空时,表示当前操作传递给一个消费者,如果为空,则表示当前操作需要请求一个数据。timed参数决定是否存在timeout时间,nanos决定了timeout的时长。如果返回值非空,则表示数据以及接受或者正常提供,如果为空,则表示失败(超时或者中断)。 SynchronousQueue内部会维护一个线程等待队列

你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序

僤鯓⒐⒋嵵緔 提交于 2019-12-04 01:46:57
IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数” 这边客户请求的连接内容包括: 1、网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2、如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3、如果网页弹出窗口(窗口内部嵌套网页请求),那么一个窗口一个连接 虚拟主机供应商在IIS(6.2版本,以下所有截图均此版本)中 “点击网站”->“右击切换到功能视图”->“点击界面右侧的‘限制’链接”->“编辑网站限制” 限制连接数即为虚拟主机供应公开的IIS连接数标准,如果购买的IIS连接数为50,那么我们不得不考虑网站的内容框架和访问量 如果网站图片够多,弹窗窗口随意(可能连时间选择框、简单条件筛选框也用弹出新窗口),加上不得已的打开新页面浏览内容,那么仅仅能容忍10个人同时操作也很正常,我不会把这个操作描述为很多网站说的“10同时在线”,这很容易让人误解,在用户的一次请求(表面上可能是刷新一次网页,实际上内部请求不止一次,事实上很少只有一次)都完成得到服务器响应完毕之后,连接全部会被释放,当然在你看到展示的页面之前

转载-高并发时服务器报错分析

久未见 提交于 2019-12-04 00:54:49
我这边做jmeter测试时,使用高并发1s,数百条线程访问一个接口时遇到类似的问题。看到这篇文章有点启发。 可以直接跳过前面2段代码部分,推荐从 NoHttpResponseException 。此异常是 由于服务器端过载而拒绝接受请求(不再响应)所致 。 开始看。 异常信息: Java代码 org.apache.http.conn.HttpHostConnectException: Connection to http: //xxx.xxxx.com refused at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java: 190 ) 高峰期时通常报这样的错: Java代码 2013 - 03 - 01 16 : 34 : 50 [ INFO] org.apache.http.impl.client.DefaultHttpClient -->I/O exception (java.net.SocketException) caught when processing request: Connection reset 2013 - 03 - 01 16 : 34 : 50 [ INFO] org.apache

从Java看多核并发编程的2.0趋势

隐身守侯 提交于 2019-12-03 22:22:42
2.0时代的软件空前地活跃在人类生活的方方面面,从而带来了更多的计算量。因此2.0不可避免地对计算提出了新的需求、引发了新的思考,在这其中,多核带来的并行计算和并发编程无疑是最为深刻的一点。 我们都能依稀记得,在2005年Sun发布了代号为Tiger的Java 5。在其众多的特性之中, JVM的改进和java.util.concurrent包的出现无疑非常引人注目。改进后的JVM可以使用低层机器指令取代锁,精化了互斥访问的粒度,提高了系统的可伸缩性和活性。而concurrent包提供了大量线程和锁之上的并发抽象,比如线程池、闭锁、信号量、关卡等。这些可以帮助开发者快速地构建出高效、可伸缩的系统来。就在同一年,还发生了另一件影响深远的事件:AMD首次发布了其双核CPU,从而打响了AMD与Intel两大芯片厂商的多核之争。 当Java遇到多核 早在十多年前,IBM、Sun与HP就已经设计出了双核处理器,比如IBM于2001年推出的基于双核的POWER4处理器和Sun的UltraSPARC芯片,但这些双核处理器都是用于高端的RISC领域,价格高昂,被大众使用的X86并没有享受到它带来的性能优势。直到Intel和AMD相继推出自己的双核处理器后,X86领域才算是有了自己的多核架构。 所谓双核处理器,简单地说就是在一块CPU基板上集成两个处理器核心,并通过并行总线将各处理器核心连接起来

JAVA多线程-基础Synchronized

纵饮孤独 提交于 2019-12-03 15:58:03
后篇: JAVA多线程-基础Lock Condition 并发集合 JAVA多线程-交互计算 Future Callable Promise 读懂代码,首先要懂得thre ad的几个状态,以及它们之间的转换. Java thread的状态有 new , runnable, sleep, blocked,wait, interrupt, dead. t = new Thread() -> new t.start() -> runnable Synchronized(this) or lock.lock() -> blocked wait() -> waiting notify() ->runnable sleep() -> sleep t.interrupt() -> interrupt wait()和notify()必须在一个lock片段或者synchronized片段才可以使用. Interrupt exception只有当thread在sleep或者waiting的时候才会抛出. 了解以上概念,请看下面代码. 这段代码虽为多线程,但没有使用并发集合,也没有使用Lock和Condition.全部使用Synchronized来完成的. 这段代码可以看出,如果不使用并发集合,也不使用lock和condition,code书写起来要麻烦很多.所以,尽量使用并发集合. 代码的逻辑: 1

并发 并行 同步 异步 多线程的区别

浪子不回头ぞ 提交于 2019-12-03 14:19:47
1. 并发:在 操作系统 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行。其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。 3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。 其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。 4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。 5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。 6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式

Python控制多进程与多线程并发数

蹲街弑〆低调 提交于 2019-12-03 14:19:36
Python控制多进程与多线程并发数 0x01 前言 本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照。 先说进程和线程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是. (4)二者均可并发执行. 不能理解的话简单打比方就是一个进程就像一个程序一样,并发互不干扰。一个进程靠一个或多个线程执行处理,并发的线程是cpu在不停的来回切换执行,当然是快到你感觉不出的。 拿上面我遇到的困难来说吧,大量的数据需要执行相同的处理,一个操作中间可能会有一些等待时间,一个一个执行浪费大量时间,那么就同时执行吧,我们可以用两种并行办法: 进程 并行或者 线程 并行 各有优缺点,要看情况,不是绝对的,在此不讨论这个,这引出下面两种Python并行处理方法

非阻塞同步算法与CAS(Compare and Swap)无锁算法

风流意气都作罢 提交于 2019-12-03 04:53:38
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。用户态的锁虽然避免了这些问题,但是其实它们只是在没有真实的竞争时才有效。 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能做任何事。如果一个线程在持有锁的情况下被延迟执行,那么所有需要这个锁的线程都无法执行下去。如果被阻塞的线程优先级高,而持有锁的线程优先级低,将会导致优先级反转(Priority Inversion)。 乐观锁与悲观锁 独占锁是一种悲观锁,synchronized就是一种独占锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁