并發編程模型

并發編程模型

一.分類

按照線程通信機制可以分為共享內存模型消息傳遞模型

1.共享內存模型:線程之間共享程序的公共狀態,編程之間通過讀寫內存中的公共狀態來隱式進行通信。相互通信的進程共享某些數據結構或共享存儲區,進程通過這些空間進行通信,因此又可以分為兩種類型:

1).基于共享數據結構的通信方式。在這種通信方式中要求各進程公用某些數據結構來實現進程間的信息交換。比如用有界緩沖區這種數據結構實現生產者-消費者問題。在這里公用數據結構的設置和進程間同步的處理,會增加負擔,所以這種通信方式是低微的,只適用于傳遞相對少量的數據。

2).基于共享存儲區的通信方式。為了大量傳輸數據,在存儲器中劃分出了一塊共享存儲區;各個進程可以通過對數據的讀或寫來實現通信。這種方式下,進程在通信前,先向系統申請獲得共享存儲區的一個分區并指定該分區的關鍵字;若系統已經給其他進程分配了這樣的分區,則返回該分區的描述符,申請者將獲得的共享存儲分區連接到本進程上,然后就可以像讀寫普通存儲器一樣地讀寫公共存儲分區。

2.消息傳遞模型:線程之間沒有公共狀態,線程之間必須通過明確的發送消息來顯示進行通信,當任務在不同的計算機上運行時通常使用。 當任務需要與另一個進行通信時,它會發送遵循預定義協議的消息。 如果發送方在發送消息后繼續執行,發送方被阻塞等待響應或異步,則該通信可以是同步的。消息系統的功能是允許進程與其它的進程進行通信。我們已經看到了消息傳遞在微內核中的應用。在這種方案下,服務作為普通的用戶進程提供,服務在內核之外。用戶進程之間的通信通過傳遞消息完成。IPC 至少提供了兩種操作:send和receive。 進程發送的消息可以是定長的也可以是變長的。如果只可以發送定長的消息,那么系統層的實現就很簡單。然而,這種限制增加了 程序設計的難度。另一方面,變長的消息需要更復雜的系統層實現,但是 程序設計工作更簡單

如果進程P 和Q要進行通信,那么它們必須能夠互相發送和接收消息;二者之間必須要建立一條通信鏈路。有多種方法可以實現這條鏈路。在這兒,我們并不關心鏈路的物理實現,而是要考慮它的邏輯實現。有如下幾種用于邏輯實現send/receive 操作的方法:

  1. 直接或間接通信

  2. 對稱或不對稱通信

  3. 自動或手動緩沖

  4. 發送拷貝或引用

  5. 定長消息或變長消息

同步是指程序用于控制不同線程之間操作發生相對順序的機制。在共享內存并發模 型里,同步是顯式進行的。程序員必須顯式指定某個方法或某段代碼需要在線程之 間互斥執行。在消息傳遞的并發模型里,由于消息的發送必須在消息的接收之前, 因此同步是隱式進行的。

實現同步的機制主要有臨界區、互斥、信號量和事件

臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資 源,那么在有一個線程進入后,其他試圖訪問公共資源的線程將被掛起,并一直等到進入臨界區的線程離開,臨界區在被釋放后,其他線程才可以搶占。

互斥量:采用互斥對象機制。 只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享 .互斥量比臨界區復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。

信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目 。信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中的PV操作相同。它指出了同時訪問共享資源的線程最大數目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。

事件:通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先級比較的操作 。

:Java 的并發采用的是共享內存模型,Java 線程之間的通信總是隱式進行,整個通 信過程對程序員完全透明。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

換工作,讓我里外不是人,到底錯在哪兒

看看時間,現在是凌晨4點多,窗外時不時一道閃電,雨也一陣一陣的,雷聲像逐漸遠離的喧囂的火車一樣。我不是睡眠困難者,但是,昨晚吃完晚飯之后,在衣服都未脫的情況下,暈暈乎乎的睡到現在…

Flink Kafka consumer的消費策略配置

val helloStream: FlinkKafkaConsumer011[String] new FlinkKafkaConsumer011[String]("hello", valueDeserializer, kafkaProps) // 指定消費策略 helloStream.setStartFromEarliest() // - 從最早的記錄開始; helloStream.setStartFromLatest() //…

spdk/dpdk 編譯相關問題匯總

下載 到官網上下載最新的spdk 代碼。 解決編譯依賴 yum install libaio.x86_64 libaio-devel.x86_64 編譯dpdk 特別注意的是dpdk:依賴 /lib/modules/uname -a/build 下執行的內核已經存在,并且編譯過,為此需要: 下載內核;安裝依賴…

深入淺出 消息隊列 ActiveMQ

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、 概述與介紹 ActiveMQ 是Apache出品,最流行的、功能強大的即時通訊和集成模式的開源服務器。ActiveMQ 是一個完全支持JM…

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28

賽后補了幾道 賽中我就寫了兩個... A - Altruistic AmphibiansGym - 101933A 看了眼榜沒幾個人做。就沒看。 最后發現就是一個DP(但是我覺得復雜度有點迷) 題意:$n$只青蛙有參數$l,w,h$分別表示彈跳力,體重,身高&#…

消息隊列技術介紹 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ

一、 消息隊列概述 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合、異步消息、流量削鋒等問題。實現高性能、高可…

程序員的惡性循環 !

窮人的惡性循環: 窮 -> 需要努力工作 -> 沒有時間去交際 -> 人脈越來越狹窄 -> 工作越來越難做 -> 越需要努力去工作 -> 越沒有時間去發展人脈 -> 越窮 富人的良性循環: 有錢 -> 工作很輕松 -> 很多時間都在交際上 -> 人…

刷臉考勤,重新定位校園管理

近幾年,人臉識別技術在安防領域得到了廣泛應用,隨著技術的不斷發展,它離我們的日常生活越來越近,手機、商場、公園、校園等都可以看到它的身影。刷臉考勤,重新定義校園管理。人臉識別,也叫面部識別&#xf…

python爬蟲學習之頁面登陸

爬蟲學習的一點心得 登陸主要有3種方法:使用selenium,cookies,模擬表單登陸 個人對于一般情況使用cookies登陸 可以實現一次手動,長期自動,可以繞過登陸(登陸的相關信息密碼,賬號等會存于cookie…

消息隊列 應用場景 解析

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 另外騰訊云-云社區還有一文不允許轉載,但內容挺好的:https://cloud.tencent.com/developer/article/1006035 分布…

求職面試的時候如何談薪酬待遇

在社會大學里混了那么多年,我最慘痛的經歷就是,在應聘一家企業的時候,總是羞于談薪酬待遇。大概這是很多職場新人都會遇到過的尷尬吧——覺得自己經驗不夠,或者想應聘的企業比較好,就覺得對方提多少就是多少吧&#xf…

利用memcached實現CAS單點登錄集群部署

前言:利用memcached實現CAS單點登錄集群部署 負載均衡:將接口請求的有狀態性變成無狀態性。是我們在實現負載均衡時必要要解決的問題。以應用接口的session狀態為例,一般解決方法都是將session數據和應用進行剝離,session數據統一…

注冊

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>注冊</title> {# 導入jQuery基礎類庫&#xff0c;才可以使用 $ #} <script src"../static/js/jquery-1.12.4.min.js"&…

Linux中10個有用的命令行補齊命令

本文由 極客范 - 踏雁尋花 翻譯自 Balakrishnan Mariyappan。歡迎加入極客翻譯小組&#xff0c;同我們一道翻譯與分享。轉載請參見文章末尾處的要求。在Linux系統中&#xff0c;輸入一個命令&#xff0c;再按兩次TAB鍵&#xff0c;就會列出所有以輸入字符開頭的可用命令。這并…

分布式開放消息系統 ( RocketMQ ) 的原理與實踐

分布式消息系統作為實現分布式系統可擴展、可伸縮性的關鍵組件&#xff0c;需要具有高吞吐量、高可用等特點。而談到消息系統的設計&#xff0c;就回避不了兩個問題&#xff1a; 消息的順序問題消息的重復問題RocketMQ作為阿里開源的一款高性能、高吞吐量的消息中間件&#xff…

數據結構02-鏈表

說明&#xff1a;由于該數據結構是由java并且是原生實現&#xff0c;所以與C有一些出入&#xff0c;不過原理是相同的 1.鏈表的定義 為了表示線性表元素a與a1的邏輯關系&#xff0c;存儲數據時&#xff0c;除了存儲元素本身的信息之外&#xff0c;還存儲了直接后繼元素的位置信…

第四章 面向對象

第四章 面向對象 1. 基本格式 定義&#xff1a;當函數(業務功能)比較多&#xff0c;可以使用面向對象來進行歸類&#xff0c;如果有一個凡事使用的公共值&#xff0c;也可以放到對象中 #格式&關鍵字 class 類名:def __inti__(self,x)self.x xdef 方法名(self,name):print(…

洛谷P2347 砝碼稱重 某一年noip提高組原題

可以轉化為01背包求方案數的問題&#xff0c;dp數組f[][]表示第幾個砝碼能稱出的重量,可壓縮至一維 轉移方程為f(i,j)f(i-1,j-w[i]) 當前我們可以稱出的重量必定是由之前的砝碼重量轉移過來的 #include<bits/stdc.h> using namespace std; const int N550; const int max…

解決:-bash: unzip: command not found (Linux 中 unZip/Zip 的安裝及使用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux系統沒有自帶的壓縮解壓工具&#xff1b;需要我們自己安裝&#xff1b; 當用到zip或者unzip如果沒有安裝就會出現 unzip: Command…

云計算時代IT專業人員需具備的10項技能

摘要&#xff1a;IT專業人員需要不斷的學習&#xff0c;才能確保自己的工作能力跟上時代的步伐。云時代IT專業人員不僅需要具備一定的專業技能&#xff0c;比如快速運用自身知識快速在互聯網上構建應用程序&#xff0c;還必須具備商業、金融、業務需求分析等等。 【編者按】談…