精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何通過多線程并發設計來提高應用程序的性能

西西 ? 作者:道以致遠 ? 2019-09-28 02:13 ? 次閱讀

前言

前面我們用了幾篇文章系統的說了一下有關Java并發編程模型中的一些基礎的知識。比如同步,鎖,原子性操作,信號量等以及它們的一些延展實現閂鎖,柵鎖等等。

今天我們回過頭來簡單說一下并發編程模型的設計和選擇。

主要涉及到我們如何利用多線程設計來在多處理器或者多內核時代如何提高我們應該程序的性能。

說說線程和應用程序之間的關系,以及我們在編程過程中如何去設計多線程模型。是不是我們編程時設計的線程越多對應用程序的性能提升越大,什么情況下設計什么樣的線程模型。

并發與并行

在具體說多線程并發模型設計之前,我們先來簡單澄清兩個概念,并發(Concurrency)和并行(Parallel),

它們是兩個容易混淆的概念,它們的基礎都是多線程,而并行是指多個進程或線程之間在運行時同一時間里并行的執行。

而并發則是多個線程一起共同去完成某一項任務。可以在單核處理器上分時運行實現,也可以在多核處理器上并行運行實現。

所以說并發偏重于是編程級別的概念,而并行則多指運行方式的概念。并行可以是進程級別上,多個進程同時運行,也可以是線程級別的多個獨立線程的并行運行。強調的是同一時間上的同時發生。

我們通常所說的并發編程,實質就是通過多個線程來分解要執行的任務,使其成為多個可獨立執行的小任務,做到可以在單核上分時執行,也可以在多核上并行執行。從而縮短總任務的處理時間,從而提高應用程序的性能。

多線程并發編程模型

在編程領域里,并發編程設計其實是跟順序同步編程或者串行化編程設計相對的。

串行化編程是將任務排隊,針對的運行它的目標處理器只有一個,而且數單線程處理的。要提高這類應用程序的性能,我們只能通過提高該該處理器的執行效率來完成,但是它的提升是有限的,畢竟單核的處理能力是有上限的。

當我們的計算機進入多內核時代后,串行化編程所使用的單線程模型是無法使用多內核的,為此我們將應用程序的執行任務分解成可獨立執行的小任務,交給多個線程,讓它們在多個內核上并行執行。

多個處理器或者內核并行的執行多個線程,能夠很好發揮并發編程模型的威力,縮短應用代碼的執行時間。

這就是為什么我們進入多處理器或者多內核計算機時代后,多線程編程成為提高應用程序的性能的一個重要的選項。

因為這種設計能夠給我們帶來極大的應用程序性能提高,同時還能增強我們應用程序的響應性。

當然,在單核時代并發編程模型也能夠在一定程度上提高應用程序效率,因為并發編程模型會將一個大的任務分解成由多個線程負責的眾多小任務,在一個單核處理器上借助處理器的分時處理機制來執行,從而有效的利用了任務執行過程中出現的等待時間。

多線程應用程序分類

正是由于進入多核時代后,每個可用CPU內核都可以獨立處理自己的任務,真正在運行時做到了并行,所以在并發編程模型中,我們將一個大任務分解為一系列獨立運行的小任務,交給多個CPU內核來并行執行,從而真正的大大提高了整個應用程序的總運行效率。

一般情況下,我們在設計多線程并發編程模型時會首先考慮將我們的應用程序進行一個簡單的分類,就是去識別是計算密集型程序還是I/O密集型的應用程序。

因為這兩種類型的程序在CPU上執行時有很大的不同,如果是計算密集型程序其處理主要集中在從寄存器讀取數據進行運算然后寫入寄存器這樣的過程,由于寄存器緩存的讀寫速度更靠近于CPU內部緩存,所以CPU的計算時間可以很好的被利用,不需要進行等待和上下文的切換。

而對于IO密集型應用程序來說,由于涉及到大量的輸入/輸出操作而這些大多是由專門的輸入輸出設備來負責處理的,由于它們的處理速度跟CPU有太大的差距,造成了CPU過多的等待時間的浪費。

為了能夠充分利用現在多處理器或多內核的計算機算力,我們采用多線程并發設計編程來提高應用程序的性能是必由之路。下面我們舉例說明上面兩種類型應用的設計:

計算密集型應用程序多線程設計

首先看計算密集型應用,這種類型的處理,最常見的例子比如我們想處理硬盤上某個文件夾里的圖片大小的應用,由于我們可以一次性將相關數據讀入處理的內存,接下來重要的就是對數據進行運算處理了,屬于計算密集型處理。

如果是單線程方法來實現的話,單線程方法需要遍歷所有文件并依次縮放每個圖片。

這種單線程模型下,即使我們有一個具有多個核心的CPU,調整大小的過程將只使用一個可用的CPU內核。

而如果采用多線程方法可以定義一個主線程負責掃描文件系統并將所有找到的文件添加到一個隊列中,該隊列由一組工作線程來負責處理。

那么這時候就要注意了,這種情況下我們如何設計我們的多線程處理模型呢?

我們簡單想一下就知道,計算過程最好是每個CPU綁定特定的線程,不斷的讀取數據處理即可。

所以如果我們剛好有與可用CPU內核數一樣多的工作線程,那么我們就能確保每個可用的CPU內核在處理圖片時都有事情可做。

充分利用計算機的算力,也不存在線程上下文切換問題,也不存在等待輸入輸出問題,從而縮短圖片的處理時間,提供整個應用程序的性能。

也就是說在我們并發模型設計時,如果主要涉及到數據的運算問題,我們可以設計跟可以使用的CPU內核數相同的線程數,以綁定執行線程的CPU內核,來充分的利用空閑的CPU內核處理能力。

這種情況下,如果從可擴展性考慮,我們可能想通過添加更多資源來提高性能,那么只能通過提高單個CPU算力的角度來實現。

假如在這個例子中,我們遇到了更大量的圖片需要處理,我們是否能夠為我們的應用程序添加更多的線程來處理呢?

其實這種計算密集型應用,由于我們當前機器的CPU內核數量有限,添加更多的線程并不能提高性能。

反而由于負責調度的線程必須管理更多的工作線程,并且線程的創建和關閉也會消耗CPU,而會出現增加越多線程性能反而可能下降的現象。

I/O密集型的應用程序多線程設計

對于輸入/輸出密集型應用程序來說,也就是說就是具有大量I/O等待時間的應用程序,利用多線程提高應用程序整體性能,如何設計呢?

我們來假想一個例子,假設我們想要編寫一個應用程序,將一個完整的網站內容以HTML文件的形式鏡像到硬盤上。因為涉及到網絡訪問,需要大量的網絡I/O操作。

所以,它是典型的輸入/輸出密集型應用。

具體實現過程怎么做呢?我們需要從這個站點的每一個頁面開始,去搜索其每一個站內的鏈接,讓后根據這些鏈接向其web服務器發送訪問請求,由于涉及到網絡請求,所以請求的響應時間就不確定了,某個請求可能需要很長時間才能收到回復。

同樣,如果我們采用單線程的處理方式,那么這其中的等待回復時間可能是一個讓人無法忍受的過程。而且在這等待期間,我們的應用程序可能啥都做不了。

如果我們可以將這份工作分配到多個線程,讓一個或多個線程負責解析請求接收到的HTML頁面,并將找到的鏈接放入隊列,而其他線程則向web服務器發出請求,然后等待回復。如此我們的應用程序能夠在新請求頁面的等待時間里來解析已經接收的頁面。

而我們知道涉及到網絡傳輸的輸入輸出過程都是由我們的操作系統網卡負責的,也就是說我們的應用程序的線程只需要負責將請求發送出去,然后等待遠程的網絡回復即可,這等待期間線程可以做別的事情,而不必被阻塞等待。

同時由于我們的CPU要做的基本上就是響應一下輸入輸出操作開始和結束指令,做一些訪問和存儲線程處理工作,大部分時間應該都是響應事件處理。

此時我們的CPU可用內核處理過程是不需要線程綁定的,所以這類IO操作密集類型應用多線程時,我們可以在應用程序中添加多于可用CPU內核數的線程來充分利用其算力,那么這個應用程序甚至可能獲得更好的性能。

簡單來說,應用程序的性能意味著能在更短的時間內完成更多的任務。

我們再來看另外一種情況,在我們的圖形用戶界面(GUI)應用中,我們常常會遇見需要用戶輸入一些內容,然后單機處理按鈕來提交數據給服務器進行處理這樣的操作過程,在這個過程中,當我們單機按鈕后,如果是單線程處理的情況下,應用程序會被阻塞,等待服務器處理的結果返回。

這時我們一般為了防止用戶重復提交而將按鈕變成不可用狀態,服務器在后臺處理數據期間用戶就什么也做不了,只能等待服務器回復結果。這樣的用戶體驗會很糟糕,如果處理時間稍長一些,鼠標都無法移動,就有可能給用戶造成出問題卡死的錯覺。

這個時候,我們完全可以采用多線程來處理,那就是設計一個額外的線程運行等待遠程服務器處理結果,而當前的處理線程繼續相應用戶的其它操作請求。

當遠程回復到達時,該線程負責響應。多線程在這類程序中的使用,會給用戶帶來良好的操作體驗,大大提高應用程序的相應能力。

總結

這里我們簡單總結了一下,在現代多處理器或多內核環境下,如何通過多線程并發設計來提高我們應用程序的性能和響應性。

需要注意的是在設計時首先要確定我們應用程序的類型,是計算密集型還是I/O密集型,如果是計算密集型應用,那么我們設計線程的數量應該等同于我們所能使用的CPU內核數,反之,如果是I/O密集型應用,我們可以設置遠大于可以CPU內核數的線程數來提高性能。

當然,所有的多線程并發編程模型都離不開對競爭資源的處理,這就需要我們充分的理解同步,鎖,原子性操作,信號量,以及各種衍生的閂鎖,柵鎖等概念,熟練的在設計過程中對競態資源進行保護處理了。

作者:道以致遠 來源:今日頭條

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2943

    瀏覽量

    104101
  • 多線程
    +關注

    關注

    0

    文章

    275

    瀏覽量

    19850
  • 應用程序
    +關注

    關注

    37

    文章

    3198

    瀏覽量

    57360
收藏 人收藏

    評論

    相關推薦

    Java多線程的用法

    本文將介紹一下Java多線程的用法。 基礎介紹 什么是多線程 指的是在一個進程中同時運行多個線程,每個線程都可以獨立執行不同的任務或操作。 與單線程
    的頭像 發表于 09-30 17:07 ?843次閱讀

    基于MIPS多線程處理器的SOC設計

    多線程是一種基于硬件或軟件的處理技術,它的主要目標是利用計算工作負載的并發提高性能多線程也可以用來區別各種任務,以便將優先權分配給如語
    發表于 07-18 06:24

    Java操作系統支持多線程

    Windows等操作系統均支持多線程進程的并發處理機制。操作系統支持多線程,使多個程序能夠并發執行,以改善資源使用率和
    發表于 08-05 06:06

    如何解決并發 C 應用程序中的多線程問題

    ("The result is: %d", result);return 0;}這個看起來簡單、沒有問題的多線程程序看起來不怎么樣,但是它足以導致嚴重的并發訪問問題。首先,注意全局
    發表于 06-20 09:58

    如何解決并發 C 應用程序中的多線程問題

    、沒有問題的多線程程序看起來不怎么樣,但是它足以導致嚴重的并發訪問問題。首先,注意全局 result 變量,并回想一下這個程序中的所有線程
    發表于 07-07 11:33

    如何使用多線程和異步操作等并發設計方法最大化程序性能

    (超線程、雙核)的普及,多線程和異步操作等并發程序設計方法也受到了更多的關注和討論。本文主要是想探討一下如何使用并發來最大化
    發表于 08-23 16:31

    多線程同步機制在應用程序與驅動程序通信中的應用

    本文對Windows NT 操作系統的多線程同步機制和同步對象進行了分析,以其在檢測儀和經緯儀同步通信程序開發中的應用為例,論述了如何通過共享事件實現
    發表于 08-24 10:02 ?16次下載

    改進的多線程應用程序調試(Altium Designer版本10)

    Altium Designer 版本10的發布為POSIX多線程庫的支持帶來了一系列改進 允許多線程應用程序以一種直觀流暢的方式調試。 線程 命名 在一個
    發表于 05-15 12:49 ?1329次閱讀
    改進的<b class='flag-5'>多線程</b><b class='flag-5'>應用程序</b>調試(Altium Designer版本10)

    多線程與聊天室程序的創建

    多線程程序的編寫,多線程應用中容易出現的問題。互斥對象的講解,如何采用互斥對象實現多線程的同步。如何利用命名互斥對象保證
    發表于 05-16 15:22 ?0次下載

    Altium Designer多線程應用程序調試分析

    Altium Designer版本10的發布為POSIX多線程庫的支持帶來了一系列改進-允許多線程應用程序以一種直觀流暢的方式調試。 線程命名在一個
    發表于 12-04 10:59 ?0次下載
    Altium Designer<b class='flag-5'>多線程</b><b class='flag-5'>應用程序</b>調試分析

    C#多線程技術

    C#和.NET類庫為開發多線程應用程序提供了很方便的支持,本章首先簡要介紹.NET類庫中的Thread類及各種線程支持,再通過示例說明線程使
    發表于 04-23 11:32 ?14次下載

    Java多線程應用程序的數據存儲庫使用改進

    當執行的查詢數量很大時,數據存儲庫通常是高要求系統的瓶頸。延遲批處理執行器(DelayedBatchExecutor)是一個組件,可通過在Java多線程應用程序中對所需查詢進行批處理
    的頭像 發表于 05-05 20:46 ?1824次閱讀
    Java<b class='flag-5'>多線程</b><b class='flag-5'>應用程序</b>的數據存儲庫使用改進

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于
    的頭像 發表于 11-17 14:22 ?891次閱讀

    多線程并發查詢oracle數據庫

    多線程并發查詢Oracle數據庫是指在同一時間內有多個線程同時執行數據庫查詢操作。這種并發查詢的方式可以提高系統的吞吐量和響應速度,
    的頭像 發表于 11-17 14:22 ?3097次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發中非常重要,它可以實現程序并發執行
    的頭像 發表于 12-01 14:29 ?1143次閱讀