幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Redis6。0多线程无锁(lockfree)设计和多线程R

  干货:单线程模式并非CPU瓶颈多线程网络模型多线程Reactor模式多线程IOlockfree无锁模式
  因为我们的主题是多线程,所以不会过多涉及单线程。1。单线程模式并非CPU瓶颈
  咱们都知道单线程的程序是没法利用服务器的多核CPU的,那么早期的Redis为何还要使用单线程呢?咱们不妨先看一下Redis官方给出的回答:
  核心意思是:CPU并非制约Redis性能表现的瓶颈所在,更多状况下是受到内存大小和网络IO的限制,因此Redis核心网络模型使用单线程并无什么问题,若是你想要使用服务的多核CPU,能够在一台服务器上启动多个实例或者采用分片集群的方式。
  咱们知道Redis的IO线程除了在等待事件,其它的事件都是非阻塞的,没有浪费任何的CPU时间,这也是Redis可以提供高性能服务的缘由。2。多线程网络模型多线程Reactor模式
  Redis在6。0版本以后正式在核心网络模型中引入了多线程,它的工做模式是这样的:
  区别于单Reactor模式,这种模式再也不是单线程的事件循环,而是有多个线程(SubReactors)各自维护一个独立的事件循环,由MainReactor负责接收新链接并分发给SubReactors去独立处理,最后SubReactors回写响应给客户端。
  MultipleReactors模式一般也能够等同于MasterWorkers模式,好比Nginx(前期文章有分享哈,可以回头去看)等就是采用这种多线程模型,虽然不一样的项目实现细节略有区别,但整体来讲模式是一致的。2。1多线程工作流程
  Redis服务器启动,开启主线程事件循环(EventLoop),注册acceptTcpHandler链接应答处理器到用户配置的监听端口对应的文件描述符,等待新链接到来;客户端和服务端创建网络链接;acceptTcpHandler被调用,主线程使用AE的API将readQueryFromClient命令读取处理器绑定到新链接对应的文件描述符上,并初始化一个client绑定这个客户端链接;客户端发送请求命令,触发读就绪事件,服务端主线程不会经过socket去读取客户端的请求命令,而是先将client放入一个LIFO队列clientspendingread;在事件循环(EventLoop)中,主线程执行beforeSleephandleClientsWithPendingReadsUsingThreads,利用RoundRobin轮询负载均衡策略,把clientspendingread队列中的链接均匀地分配给IO线程各自的本地FIFO任务队列iothreadslist〔id〕和主线程本身,并且用iothreadspending〔id〕来记录每个线程的分配任务数量,因为线程需要读取这个iothreadspending〔id〕这个数量来消费任务,消费完成会初始化为0。IO线程经过socket读取客户端的请求命令(是通过iothreadsop这个变量来判断是读(IOTHREADSOPREAD)还是写(IOTHREADSOPWRITE),这里是iothreadsopIOTHREADSOPREAD),存入clientquerybuf并解析第一个命令,但不执行命令,主线程忙轮询,等待全部IO线程完成读取任务;主线程和全部IO线程都完成了读取任务(通过遍历iothreadspending〔id〕,把每个线程的分配任务数量累加起来如果和等于0代表多线程已经消费完了任务),主线程结束忙轮询,遍历clientspendingread队列,执行全部客户端链接的请求命令,先调用processCommandAndResetClient执行第一条已经解析好的命令,而后调用processInputBuffer解析并执行客户端链接的全部命令,在其中使用processInlineBuffer或者processMultibulkBuffer根据Redis协议解析命令,最后调用processCommand执行命令;根据请求命令的类型(SET,GET,DEL,EXEC等),分配相应的命令执行器去执行,最后调用addReply函数族的一系列函数将响应数据写入到对应client的写出缓冲区:clientbuf或者clientreply,clientbuf是首选的写出缓冲区,固定大小16KB,通常来讲能够缓冲足够多的响应数据,可是若是客户端在时间窗口内须要响应的数据很是大,那么则会自动切换到clientreply链表上去,使用链表理论上可以保存无限大的数据(受限于机器的物理内存),最后把client添加进一个LIFO队列clientspendingwrite;在事件循环(EventLoop)中,主线程执行beforeSleephandleClientsWithPendingWritesUsingThreads,利用RoundRobin轮询负载均衡策略,把clientspendingwrite队列中的链接均匀地分配给IO线程各自的本地FIFO任务队列iothreadslist〔id〕和主线程本身,并且用iothreadspending〔id〕来记录每个线程的分配任务数量,因为线程需要读取这个iothreadspending〔id〕这个数量来消费任务,消费完成会置为0。IO线程经过调用writeToClient(iothreadsopIOTHREADSOPWRITE)把client的写出缓冲区里的数据回写到客户端,主线程忙轮询,等待全部IO线程完成写出任务;主线程和全部IO线程都完成了写出任务(通过遍历iothreadspending〔id〕,把每个线程的分配任务数量累加起来如果和等于0代表多线程已经消费完了任务),主线程结束忙轮询,遍历clientspendingwrite队列,若是client的写出缓冲区还有数据遗留,则注册sendReplyToClient到该链接的写就绪事件,等待客户端可写时在事件循环中再继续回写残余的响应数据。
  这里大部分逻辑和以前的单线程模型是一致的,变更的地方仅仅是把读取客户端请求命令和回写响应数据的逻辑异步化了,交给IO线程去完成,这里须要特别注意的一点是:IO线程仅仅是读取和解析客户端命令而不会真正去执行命令,客户端命令的执行最终仍是要回到主线程上完成。
  相关视频推荐
  手把手带你调试阅读redis源码
  6种epoll的做法,从redis,memcached到nginx的网络模型实现
  c后端绕不开的7个开源项目,每一个源码值得深入研究
  需要CCLinux服务器架构师学习资料加qun812855908获取(资料包括CC,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,ffmpeg等),免费分享
  2。2图解详细流程
  3。IO多线程lockfree(无锁设计)
  主线程和IO线程之间共享的变量有三个:iothreadspending计数器、iothreadsopIO标识符和iothreadslist线程本地任务队列。iothreadspending统计每个线程分配任务的数量,主线程在分配的时候,子线程是被换新的,它一直在执行100w次的CPU空转即自旋操作;当主线程把任务分配好之后,子线程会判断iothreadspending〔id〕不为0就去消费任务,消费完成会置为0。iothreadsopIOTHREADSOPWRITEsocket可写IOTHREADSOPREADsocket可读iothreadslist线程本地任务队列(链表)
  lockfree无锁设计核心:
  1。原子变量,不需要加锁保护iothreadspending变量在声明的时候加上了Atomic限定符:Atomicunsignedlong;Atomic是C11标准中引入的原子操作:被Atomic修饰的变量被认为是原子变量,对原子变量的操作是不可分割的(Atomicity),且操作结果对其他线程可见,执行的顺序也不能被重排。所以iothreadspending是属于线程安全的变量。
  2。交错访问来规避共享数据竞争iothreadsop和iothreadslist这两个变量则是经过控制主线程和IO线程交错访问来规避共享数据竞争问题。IO线程启动以后会经过忙轮询和锁休眠等待主线程的信号,在这以前它不会去访问本身的本地任务队列iothreadslist〔id〕,而主线程会在分配完全部任务到各个IO线程的本地队列以后才去唤醒IO线程开始工做,而且主线程以后在IO线程运行期间只会访问本身的本地任务队列iothreadslist〔0〕而不会再去访问IO线程的本地队列,这也就保证了主线程永远会在IO线程以前访问iothreadslist而且以后再也不访问,保证了交错访问。iothreadsop同理,主线程会在唤醒IO线程以前先设置好iothreadsop的值,而且在IO线程运行期间不会再去访问这个变量,这也就变相保证了原子性。在源码srcserver。h中:externintiothreadsop;4。源码
  源码真的太多了,拷贝到这里实在影响阅读,因此为了大家能迅速定位,我这里贴出地址哈。子线程入口Main函数处理read,write和解析操作IOThreadMain:源码文件3665行https:github。comredisredisblob64f6159646337b4a3b56a400522ad4d028d55dacsrcnetworking。c主线程执行回复入口函数handleClientsWithPendingWritesUsingThreads:3810行地址同上主线程执行读取数据入口函数handleClientsWithPendingReadsUsingThreads:3935行地址同上主线程初始化多线程入口函数initThreadedIO:3712行地址同上其他源码readQueryFromClient:2266行postponeClientRead:3908行地址同上

CBA前8轮排名!辽篮仅第4,广东反超北京,浙江预定九连胜目前CBA常规赛第一阶段只剩下最后一轮的比赛,截止10月28日晚间前面8轮全部结束,最新一起的排名出炉,大家可以从中发现格局的变化。排名第一的依然是浙江,也是唯一保持8连胜的球……历史上的今天10月12日1773年10月12日法国天文学家梅西叶首次发现具有螺旋结构的星系梅西叶(Messier。Charles,1730。6。261817。4。12)法国天文学家,率先编制了系……库里谈KD此前交易申请期望强队保留原阵容得到他不切实际近日,勇士球员斯蒂芬库里接受采访,谈到了凯文杜兰特此前的交易申请。库里表示,篮网的要价很高,杜兰特对他的新球队会保留原有阵容并得到他的期望显然是不切实际的。他觉得他……农民参缴公积金,到底好在哪儿?全文1482字,阅读约需1。5分钟农民参缴公积金上热搜了!原来,自9月1日起,浙江省龙港市农民可以正式申缴住房公积金了。将农民纳入公积金建缴对象……楼市断粮了,房价出现调整,能跌多少?孙宏斌透露底线从2022年开始,国内越来越多的城市加入到楼市调整的队伍中来。数据显示,今年16月份全国70个大中城市中,新房价格同比下跌的城市数量分别达到20个、24个、29个、34个以及4……中国建企海外亏损两大经典案例,以史为鉴,启人深思中国央企、国企近年来海外投资累计亏损情况如何?你纵然搜遍官网、百度千万回,也找不到官方有力的大数据支撑,为何?有政治因素,有商业原因,有舆论的负面影响。但从10年前公开的……我们鸡大的娃,正在成为二十年后的躺平主力军01hr鸡娃这个词已经流行了很多年了,来自网络的解释,这个词语的意思是这样的:鸡娃是网络流行词,指的是父母给孩子打鸡血,为了孩子能读好书、考出好成绩,不断给孩子安排学习和活动,……ElieSaab刺绣的薄纱蕾丝裙,处处都散发着白色栀子花的香ElieSaab2023春夏系列以夏日微风为主题,本系列的轮廓和精致的细节设计,以及时装秀背景墙,散发着永恒的时尚感和一丝花园的清新气息。该季时装秀以白色开场,也以白色收尾。纯……五连败只是在为错误选择买单!勇士高价续约普尔亏大了普尔上位,带领勇士以105:114不敌鹈鹕遭遇五连败,之前四连败的勇士是得有多相信普尔,居然把五大主力都给轮休了。勇士队输球最主要的就是防守不佳导致的,而这一切的根源都要……雷军小米13对iPhone14的4大超越,米粉幸福来得太突然小米13系列延期发布,目前时间还未确定,不过我们都能够理解,如果产品足够震撼,还是值得我们等一等的。虽然小米13尚未发布,不过雷军已经公开了它很多亮点,并且还与iPhon……在澳门,千万别乱住酒店现在是去澳门最好的时候。只要在社交网络搜索澳门,你99会看到这句话。毕竟现在去澳门是什么一个情况呢?四个字,人少、便宜,谁看了都心动。而且太久没出国了啊,急需……为什么中医常说小儿三不足两有余,针对不足小儿推拿有奇效守护银龄世界嗨,大家好啊,又到了杏林张医生科普时间,躬耕中医临床,捍卫人民健康。什么是小儿三不足两有余三不足两有余小儿五脏生理特点的高度总结,最早可追溯到明代……
NothingPhone(1)渲染图曝光边框控制优秀,居中打昨日,有媒体曝光了Nothingphone(1)的渲染图,但是由于图片过于模糊,无法看清设计细节。BenGeskin根据曝光的图片绘制了一份渲染图,并且对目前的已知信息进行了汇……军训优秀作文欣赏军训记事第二天的军训已经结束了,一天下来,就只有一个感觉累!今天我们军训的内容是跑步走和起步走,看起来似乎很简单,但做起来却很困难,光是这两个内容我们就练了整整一天了。不知道怎么……十字韧带撕裂!才20岁啊!这一次重伤,要毁掉他的NBA生涯北京时间8月13日,公牛记者KCJohnson报道,贾斯汀刘易斯(JustinLewis)遭遇膝盖重伤,膝盖前十字韧带撕裂,归期未定。刘易斯是今年选秀大会的落选秀,7月8日公牛……最贵的9599元,5款高端电动自行车来了,雅迪绿源在列阅读本文前,请您先点击上面的关注,可以免费订阅我们的最新内容,感谢支持两轮电动车分为电动摩托车、电动自行车两大类,其中电动摩托车的价格上万的都有很多,价格贵一点也不稀奇。……从科索沃战争到乌克兰危机,欧洲从来不是冤大头,而是刽子手俄乌开战以来,西方国家无视体育无国界的理念,对俄罗斯各个项目的运动员实施禁赛,甚至连普京的柔道、跆拳道荣誉称号都剥夺了。西方体坛也没能幸免,被迫沦为政客操纵的舆论战主战场之一。……王者新英雄海月娱乐聚焦王者荣耀新英雄,这个即将上线的英雄,还是非常期待的,这位英雄是云中蝶的主人,一个很厉害的角色!新英雄海月小姐姐的爆料时间被动:新月状态:释放技能……通信行程卡从14天调整7天,对经济有什么重大意义今天凌晨,工信部发布公告,根据《新型冠状病毒肺炎防控方案(第九版)》,从今天起通信行程卡查询结果覆盖的时间范围从14天调整为7天,这就是说你从短信、网页和小程序上看到的变化是过……粉丝经济是索尼最不合时宜的珍贵财富2022年6月28日,索尼中国宣布现任索尼集团中国副总裁代表高桥洋已正式退休。在长达六年的索尼中国董事长与总裁任期中,这位曾在中国留学多年的日企高管为索尼中国作出了不少贡献,也……米饭二次加热会致癌?今天提醒这5种食物,最好别二次加热很多家庭还养成了吃剩菜剩饭的习惯,会提前一天晚上蒸出米饭来,第2天加热做成蛋炒饭或者是倒点水熬粥喝,节省时间,方便快捷,但是这样的饮食习惯真的健康吗?有人表示经常吃生菜剩饭会致……2014年,那个曾扬言非5000万富二代不嫁的周兰君,至今仍2014年,浙江卫视推出了一档相亲节目《相亲才会赢》。在一期节目中,一个女嘉宾所表现的择偶观在网上引起了热议。不少网友表示:她是哪来的自信?提出这样的择偶条件!这女的怕是……从双方主力阵容分析,中国女排总决赛对阵意大利,胜负四六开7月14日,中国女排将在世界女排联赛总决赛中对阵强敌意大利。虽然世联赛分站赛中国队曾经31击败对手,但那场比赛因为对方领军人埃格努缺阵,并不能代表双方真正的实力。如今总决赛再度……封神文案慢慢理解世界,慢慢更新自己1。过得不好的人才会频频回头。2。请成为永远疯狂,永远浪漫,永远清澈的存在。3。普通啊,当然普通,谁不普通。4。生活本来就是一场浪漫革命。5。慢慢理解世……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网