上下文切换

线程上下文切换的性能损耗测试

这一生的挚爱 提交于 2020-03-28 05:39:45
线程上下文切换的性能损耗到底有多少,一直没有直观的理解,今天写个程序测试一下。先看看下面的程序( 点击下载 ): ThreadTester是所有Tester的基类。所有的Tester都干的是同样一件事情,把counter增加到100000000,每次只能加1。 1: public abstract class ThreadTester 2: { 3: public const long MAX_COUNTER_NUMBER = 100000000; 4: 5: private long _counter = 0; 6: 7: //获得计数 8: public virtual long GetCounter() 9: { 10: return this._counter; 11: } 12: 13: //增加计数器 14: protected virtual void IncreaseCounter() 15: { 16: this._counter += 1; 17: } 18: 19: //启动测试 20: public abstract void Start(); 21: 22: //获得Counter从开始增加到现在的数字所耗的时间 23: public abstract long GetElapsedMillisecondsOfIncreaseCounter(); 24:

轻量级协程库-C语言实现

混江龙づ霸主 提交于 2020-03-02 03:23:41
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法 “子例程是协程的特例” ,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权, 对称(symmetric)、平级 地调用对方,而不是像例程那样上下级调用关系。当然 Knuth 的“特例”指的是协程也可以模拟例程那样实现上下级调用关系,这就叫 非对称协程 (asymmetric coroutines)。 基于事件驱动模型 我们举一个例子来看看一种 对称协程 调用场景,大家最熟悉的“生产者-消费者”事件驱动模型,一个协程负责生产产品并将它们加入队列,另一个负责从队列中取出产品并使用它。为了提高效率,你想一次增加或删除多个产品。伪代码可以是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 # producer coroutine loop while queue

基于任务的异步编程

我是研究僧i 提交于 2020-02-29 04:41:08
博客迁移 记录《Effective C#》学习过程。 任务运行的几种方法 //1.new方式实例化一个Task,需要通过Start方法启动 Task task = new Task(() => { Console.WriteLine($"task1的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); task.Start(); //2.Task.Factory.StartNew(Action action)创建和启动一个Task Task task2 = Task.Factory.StartNew(() => { Console.WriteLine($"task2的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); //3.Task.Run(Action action)将任务放在线程池队列,返回并启动一个Task Task task3 = Task.Run(() => { Console.WriteLine($"task3的线程ID为{ Thread.CurrentThread.ManagedThreadId}"); }); View Code 使用异步方法执行异步工作 对于调用异步方法的主调方法来说,只要异步方法已经返回,这里返回的是Task对象,它就可以继续往下执行。

Windbg实用手册

本秂侑毒 提交于 2020-02-24 08:58:01
Windbg工作中用的不多,所以命令老是记不住,每次使用都要重新查命令,挺烦。 趁这次培训的机会好好测试和总结了一下,下次再用就方便多了。 在这里一起共享一下,如果有错误,请指正。 基本知识和常用命令 (1) Windbg下载地址 http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 安装完后执行windbg –I将Windbg设置成默认调试器 (2) Windbg的命令分为标准命令,原命令和扩展命令,输入问号(?)可以显示所有的标准命令的帮助信息; 元命令以一个点(.)开始,输入.help可以显示所有的原命令的帮助信息;扩展命令以叹号(!)开始。 所有命令的具体用法可以通过F1查看Windbg的帮助文件。 (3) 通过设置符号文件路径,让Windbg自动从微软网站更新系统Dll的符号文件 SRV*d:\symbols* http://msdl.microsoft.com/download/symbols (4) 用分号(;)作为分隔符,可以在一行输入多条命令 (5) 按上下箭头可以浏览和选择以前输入过的命令 (6) Ctrl+Break终止一个很长时间没有完成的命令, Ctrl+Break也可以让正在运行的程序暂停 (7) Windbg默认的数值进制一般是16, 可以通过n命令查看和设置当前进制

python3通过gevent.pool限制协程并发数量

﹥>﹥吖頭↗ 提交于 2019-12-06 02:32:23
协程--gevent模块(单线程高并发) 先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”(“context switch”)       CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程,上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生 进程: 一个程序需要运行所需的资源的集合每个进程数据是独立的每个进程里至少有一个线程每个进程里有可以多有个线程线程数据是共享的进程间共享数据的代价是高昂的,所以要尽量避免进程间的数据共享线程间的数据本来就是共享的线程要修改同一份数据,必须加锁,互斥锁mutex生产者消费者:1.解耦2.提高程序的运行效率,把中间等待的时间省去多线程场景: IO密集型,因为IO操作基本不占用CPU,所以多用在web,爬虫,socket交互多进程场景:CPU密集型,大数据分析,金融分析,这样用的IO就很少,因为这个进程会进行大量的运算, 但是如果切换了进程,就会变慢 协程 协程:微线程, 协程是一种用户态的轻量级线程,CPU不知道它的存在, 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候

【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

好久不见. 提交于 2019-12-05 13:36:37
摘自: https://www.cnblogs.com/javaguide/p/11913530.html 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结! 本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创: 终极推荐!可能是最适合你的Java学习路线+方法+网站+书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行)。 1.2. 何为线程? 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的 堆 和 方法区 资源,但每个线程有自己的 程序计数器 、 虚拟机栈

Redis性能解析--Redis为什么那么快?

久未见 提交于 2019-12-04 12:18:08
Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!! Redis的实际被应用都是因为它的性能,在众多缓存中Redis也是一个比较快的中间件,而且它是单线程操作,没有过的内存开销,给程序带来了更多的扩展空间。 Redis的性能展示 在保证网络通畅的情况下,相同的CPU和相同的Redis版本,处理不同大小的数据,Redis的吞吐量如下图所示,该图来自Redis的官方网站。我们可以在网站中看到。Redis在处理1000字节的数据的时候,都是稳定位置吞吐量在10w,当处理的数据不断增大的时候,吞吐量才慢慢开始下降。 图片来自redis官网 下图是提供的QPS测试图,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。 图片来自redis官网 Redis为什么那么快? 纯内存KV操作 内部是单程实现的(不需要创建/销毁线程,避免上下文切换,无并发资源竞争的问题) 异步非阻塞的I/O(多路复用) 存内存KV操作快在哪里? 我们从上面的介绍里面我们看到了Redis是一个纯kv的操作

Docker-DockerFile的使用

China☆狼群 提交于 2019-12-04 07:42:55
在使用 DockerFile 定制镜像之前,我们先来了解一下镜像的构成:镜像是容器的基础,每次执行 docker run 命令的时候都会指定哪个镜像作为容器运行的基础。在之前的栗子中,我们使用的镜像都是来着Docker Hub的镜像。直接使用这些镜像为基础运行容器可以一定程度上满足我们的需求,可是当这些镜像都无法直接满足需求时,我们就需要定制镜像! docker commit构建 现在我们以定制一个Web服务器为例: root @ubuntu :~ # docker run --name webserver -d -p 80:80 nginx f0a2ad681b692642be0b825631d8716ae3d8c1fb5ad48148362331df3fae9775 此时,我们在浏览器中访问本机地址,例如以本机为例 192.168.0.89 ,如图: 这条命令会以Nginx为镜像创建并启动一个容器,映射了80端口,这样我们可以在浏览器中访问这个Nginx服务器!假设,我们现在不喜欢这个欢迎页面的样式,想把它改为“Hello Docker!”,我们可以使用 docker exec 命令,进入容器,修改器内容: root @ubuntu :~ # docker exec -it webserver bash root @f0a2ad681b69 :/ # echo '<h1

Netty版本升级及线程模型详解

最后都变了- 提交于 2019-12-03 07:08:20
作者 李林锋 发布于 2015年2月7日 | 注意: GTLC全球技术领导力峰会 ,500+CTO技聚重新定义技术领导力! 18 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 1. 背景 1.1. Netty 3.X系列版本现状 根据对Netty社区部分用户的调查,结合Netty在其它开源项目中的使用情况,我们可以看出目前Netty商用的主流版本集中在3.X和4.X上,其中以Netty 3.X系列版本使用最为广泛。 Netty社区非常活跃,3.X系列版本从2011年2月7日发布的netty-3.2.4 Final版本到2014年12月17日发布的netty-3.10.0 Final版本,版本跨度达3年多,期间共推出了61个Final版本。 1.2. 升级还是坚守老版本 相比于其它开源项目,Netty用户的版本升级之路更加艰辛,最根本的原因就是Netty 4对Netty 3没有做到很好的前向兼容。 相关厂商内容 通过探针技术,实现Java应用程序自我防护 新Java,新未来 你离成为一位合格的技术领导者还有多远? 你了解技术领导与技术管理的差别吗? 相关赞助商 QCon全球软件开发大会上海站,2016年10月20日-22日,上海宝华万豪酒店, 精彩内容抢先看 ! 由于版本不兼容,大多数老版本使用者的想法就是既然升级这么麻烦

Strategy factory

匿名 (未验证) 提交于 2019-12-03 00:34:01
Strategy: 问题:针对特定任务存在不同的算法,但客户端可以根据动态上下文在运行时切换算法。 解决方案:为算法创建一个接口,并为算法的每个变体实现一个类 优点: - 易于扩展新算法实现 - 将算法与客户端上下文分离 factory Strategy factory 原文:https://www.cnblogs.com/xgl122/p/9218881.html