午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java實(shí)現(xiàn)多線(xiàn)程的上下文切換

瀏覽:4日期:2022-08-23 14:17:50

對(duì)于上下文切換不同的操作系統(tǒng)模式也不盡相同,這里我們只討論Unix系統(tǒng),在我之前的文章中提到過(guò)windows的搶占式,這里就不在贅述。

無(wú)論是單核還是多核CPU都是支持多線(xiàn)程代碼的,CPU通過(guò)給每個(gè)線(xiàn)程分配CPU時(shí)間片來(lái)實(shí)這個(gè)機(jī)制。

時(shí)間片是CPU分配給各個(gè)線(xiàn)程的時(shí)間,因?yàn)闀r(shí)間片非常短,所以CPU通過(guò)不停地切換線(xiàn)程執(zhí)行,讓我們感覺(jué)多個(gè)線(xiàn)程是同時(shí)執(zhí)行的,時(shí)間片一般是幾十毫秒(ms)

CPU通過(guò)時(shí)間片分配算法來(lái)循環(huán)執(zhí)行任務(wù),當(dāng)前任務(wù)執(zhí)行一個(gè)時(shí)間片后會(huì)切換到下一個(gè)任務(wù)。但是,在切換前會(huì)保存上一個(gè)任務(wù)的狀態(tài),以便下次切換回這個(gè)任務(wù)時(shí),可以再加載這個(gè)任務(wù)的狀態(tài)。

所以任務(wù)從保存到再加載的過(guò)程就是一次上下文切換。 很明顯上下文切換會(huì)影響多線(xiàn)程的執(zhí)行速度。

如何減少上下文切換

減少上下文切換的方法有

1、無(wú)鎖并發(fā)編程。

多線(xiàn)程競(jìng)爭(zhēng)鎖時(shí),會(huì)引起上下文切換,所以多線(xiàn)程處理數(shù)據(jù)時(shí),可以用一

些辦法來(lái)避免使用鎖,如將數(shù)據(jù)的ID按照Hash算法取模分段,不同的線(xiàn)程處理不同段的數(shù)據(jù)。

2、CAS算法。

Java的Atomic包使用CAS(compare and swap)算法來(lái)更新數(shù)據(jù),而不需要加鎖。

3、使用最少線(xiàn)程。避免創(chuàng)建不需要的線(xiàn)程,比如任務(wù)很少,但是創(chuàng)建了很多線(xiàn)程來(lái)處理,這

樣會(huì)造成大量線(xiàn)程都處于等待狀態(tài)。

4、協(xié)程:在單線(xiàn)程里實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單線(xiàn)程里維持多個(gè)任務(wù)間的切換。

減少上下文切換的例子

下面我們看一個(gè)通過(guò)減少線(xiàn)上大量WAITING的線(xiàn)程,來(lái)減少上下文切換次數(shù)的例子:

使用jstack命令dump線(xiàn)程信息,看看pid為3117的進(jìn)程里的線(xiàn)程都在做什么

sudo -u admin /opt/java/bin/jstack 31177 > /home/java/dump17

統(tǒng)計(jì)所有線(xiàn)程分別處于什么狀態(tài),發(fā)現(xiàn)300多個(gè)線(xiàn)程處于WAITING(onobjectmonitor)狀態(tài)

grep java.lang.Thread.State dump17 | awk ’{print $2$3$4$5}’| sort | uniq -c39 RUNNABLE21 TIMED_WAITING(onobjectmonitor)6 TIMED_WAITING(parking)51 TIMED_WAITING(sleeping)305 WAITING(onobjectmonitor)3 WAITING(parking)

打開(kāi)dump文件查看處于WAITING(onobjectmonitor)的線(xiàn)程在做什么。發(fā)現(xiàn)這些線(xiàn)程基本全是JBOSS的工作線(xiàn)程,在await。說(shuō)明JBOSS線(xiàn)程池里線(xiàn)程接收到的任務(wù)太少,大量線(xiàn)程都閑著。

'http-0.0.0.0-7001-97' daemon prio=10 tid=0x000000004f6a8000 nid=0x555e inObject.wait() [0x0000000052423000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker)at java.lang.Object.wait(Object.java:485)at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1464)- locked <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker)at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1489)at java.lang.Thread.run(Thread.java:662)

減少JBOSS的工作線(xiàn)程數(shù),找到JBOSS的線(xiàn)程池配置信息,將maxThreads降到100

<maxThreads='250' maxHttpHeaderSize='8192'emptySessionPath='false' minSpareThreads='40' maxSpareThreads='75'maxPostSize='512000' protocol='HTTP/1.1'enableLookups='false' redirectPort='8443' acceptCount='200' bufferSize='16384'connectionTimeout='15000' disableUploadTimeout='false' useBodyEncodingForURI= 'true'>

重啟JBOSS,再dump線(xiàn)程信息,然后統(tǒng)計(jì)WAITING(onobjectmonitor)的線(xiàn)程,發(fā)現(xiàn)減少了175個(gè)。

WAITING的線(xiàn)程少了,系統(tǒng)上下文切換的次數(shù)就會(huì)少,因?yàn)槊恳淮螐腤AITTING到RUNNABLE都會(huì)進(jìn)行一次上下文的切換。

讀者也可以使用vmstat命令測(cè)試一下。

grep java.lang.Thread.State dump17 | awk ’{print $2$3$4$5}’| sort | uniq -c44 RUNNABLE22 TIMED_WAITING(onobjectmonitor)9 TIMED_WAITING(parking)36 TIMED_WAITING(sleeping)130 WAITING(onobjectmonitor)1 WAITING(parking)

為什么要減少上下文切換

當(dāng)CPU從執(zhí)行一個(gè)線(xiàn)程切換到執(zhí)行另外一個(gè)線(xiàn)程的時(shí)候,它需要先存儲(chǔ)當(dāng)前線(xiàn)程的本地的數(shù)據(jù),程序指針等,然后載入另一個(gè)線(xiàn)程的本地?cái)?shù)據(jù),程序指針等,最后才開(kāi)始執(zhí)行。

這種切換稱(chēng)為“上下文切換”(“context switch”)。

CPU會(huì)在一個(gè)上下文中執(zhí)行一個(gè)線(xiàn)程,然后切換到另外一個(gè)上下文中執(zhí)行另外一個(gè)線(xiàn)程。上下文切換并不廉價(jià),是比較耗時(shí)的

以上這篇Java實(shí)現(xiàn)多線(xiàn)程的上下文切換就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产最新精品视频 | 青青草在线视频免费观看 | 亚洲色诱| 国产成人精品视频免费 | 麻豆视频免费看 | 毛片1000部免费看 | 亚洲网在线观看 | 二区在线视频 | 伊人激情综合网 | 亚洲精品第一 | 亚洲va韩国va欧美va | 五月婷婷免费视频 | 亚洲精品一区二区三区在线观看 | 九九热国产视频 | 日韩成人一级片 | 中文字幕在线免费视频 | 午夜超碰 | 999精品视频| 国产福利精品视频 | 日本黄色一级视频 | 国产免费一区二区三区四区 | 国产suv精品一区二区883 | 精品亚洲精品 | 中国av免费 | 天堂a在线| 99久久99久久精品免费看蜜桃 | 日韩av免费一区 | www.爱爱| 欧美一级激情 | 亚洲色图欧美日韩 | 欧美 日韩 中文字幕 | 成人高清网站 | 男人的天堂官网 | 国产深夜视频 | 国产一级黄色大片 | 影音先锋在线视频观看 | 国产成人精品亚洲男人的天堂 | 九九热精品 | 日韩看片 | 日日日夜夜操 | 日韩欧美亚洲视频 |