1. 程式人生 > >作業系統之程序—併發程序(一)

作業系統之程序—併發程序(一)

1.順序程式設計

傳統的程式設計方法是順序程式設計,即把一個程式設計成一個順序執行的程式模組,不同程式也是按序執行的。順序分成內部順序和外部順序

  • 內部的順序性 : 程式在處理器上執行時嚴格有序的,即只有當一個操作結束後,才能開始後繼操作,這稱為程式內部的順序性
  • 外部的順序性 : 如果完成一個任務需要若干個不同的程式,這些不同程式在時間上按呼叫次序嚴格有序執行,這稱為程式外部的順序性

2.併發程式設計

併發含義

  • 一個程式分成若干個可同時執行的程式模組的方法稱為併發程式設計,程序的併發性是指一組程序的執行在時間上是重疊的,重疊是指一個程序執行的第一條指令是在另一個程序執行的最後一條指令完成之前開始的

併發例子

有兩個程序A和B,程序A執行操作a1、a2、a3,程序B執行操作b1、b2、b3

  • 程序A和B順序(序列)執行的情況:在單處理器上,程序A執行完,程序B才開始執行,它們的操作次序為:a1、a2、a3、b1、b2、b3
  • 程序A和B併發執行的一種情況:在單處理器上,程序A和B交替(交叉)執行,它們交替(交叉)執行的操作次序可能為:a1、b1、b2、a2、a3、b3

併發實質

  • 併發的實質是一個處理器在幾個程序之間的多路複用 (多路複用比較出名的有時分複用,根據時間片呼叫不用的程序)
  • 併發是對有限的物理資源強制行使多使用者共享,消除計算機部件之間的互等現象,以提高系統資源利用率
  • 巨集觀
    :
    併發性反映一個時間段中幾個程序都在同一處理器上處於執行還未執行結束的狀態
  • 微觀:任一時刻僅有一個程序在處理器上執行

併發差異

  • 併發多執行緒程式設計:模組都屬於一個程序,在程序內部執行
  • 併發多程序程式設計:模組屬於不同程序

3.併發程序的特性

併發程序之間的關係分為兩類:無關的互動的

  • 無關的併發程序:一個併發程序不會改變另一個併發程序的變數值
  • 互動的併發程序:一組併發程序共享某些變數,程序的執行可能影響其他併發程序的執行結果

Bernstein條件

併發程序的無關性是程序的執行與時間無關的一個充分條件,又稱為Bernstein條件

4.程序的互動:協作和競爭

競爭關係(間接制約關係)

系統中的多個程序之間彼此無關,相互並不知道其它程序的存在,相互之間並不交換資訊。但是由於這些程序共用了一套計算機系統資源,因而必然產生競爭資源的問題,一個程序的執行可能影響到同其競爭資源的其它程序。作業系統必須協調好諸程序對資源的爭用。一旦一個程序要使用已分配給另一個程序的資源,則該程序必須等待

資源競爭產生兩個問題

  • 一個是死鎖(Deadlock)問題,就是一組程序如果都獲得了部分資源,還想要得到其他程序所佔用的資源,最終所有程序都將陷入死鎖
  • 一個是飢餓(Starvation) 問題,是指一個程序由於其它程序總是優先於它而被無限期拖延 既要解決飢餓問題,又要解決死鎖問題。解決飢餓問題的最簡單策略是FCFS資源分配策略(先來先服務)

競爭解決

程序互斥是解決程序間競爭關係(間接制約關係)的手段

程序互斥

  • 指若干程序要使用同一共享資源時,任何時刻最多允許一個程序使用,其他要使用該資源的程序必須等待,直到佔有資源的程序釋放該資源
  • 程序互斥關係是一種特殊的程序同步關係,即逐次使用互斥共享資源,是對程序使用資源次序上的一種協調  
  • 臨界區管理可以解決程序互斥問題

協作關係(直接制約關係)

某些程序為完成同一任務需要分工協作,由於合作的每一個程序都是獨立地以不可預知的速度推進,這就需要相互協作的程序在某些協調點上協調各自的工作。當協作程序中的一個到達協調點後,在尚未得到其夥伴程序發來的訊息或訊號之前應阻塞自己,直到其他合作程序發來協調訊號或訊息後才被喚醒並繼續執行。這種協作程序之間相互等待對方訊息或訊號的協調關係稱為程序同步

程序同步:

指兩個以上程序基於某個條件來協調它們的活動。一個程序的執行依賴於協作程序的訊息或訊號,當一個程序沒有得到來自於協作程序的訊息或訊號時需等待,直到訊息或訊號到達才被喚醒

相關推薦

Javascript高級程序設計--讀書筆記面向對象

friend 自定義 包括 類型 有一個 問題 相同 elb 模式 哈哈哈萬物皆對象,終於到了js的面向對象篇。 一、屬性類型 (1)數據屬性 數據屬性包含一個數據值的位置,在這個位置可以寫入和讀取數值,數據屬性有四個描述器行為的特性 [[Configurable]]:表

JavaScript高級程序設計筆記

循環語句 基本 能力 至少 oat som 最大數 earch define 1. ECMA規定了這門語言的下列組成部分: 語法、 類型、語句、 關鍵字、保留字、操作符、 對象 2. 什麽是 ECMAScript 兼容支持 ECMA描述的所有“類型、值、對象、屬性、函數以及

Python進階---面向對象的程序設計思想

anim 它的 代碼冗余 tell 汽水 處理流程 關系 apach 精準 thon的面向對象 一、面向過程與面向對象的對比 面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麽時候處理什麽東西。 優點

程序包管理rpm

yum rpm 程序包管理 一、編程語言與操作系統: 應用程序 ____________________ |lib call | | |-------------------| |system call | |————————

程序入坑---如何引入iconfont 字體圖標

tex 兩種 pid 不用 tencent 16進制 點心 想是 方便 最近一直忙於日常任務,其實是懶癌又犯了。。。。。。。。。。不過因為自己的“懶癌”,“不思進取”給自己挖了不少坑。 一,小程序工具的安裝 打開簡易小程序的官網https://mp.weixin.qq.c

微信小程序的開發

ram tle ati java ndt 喜歡 top lex navig 我現在在學習,微信小程序開發,剛剛看看一篇對我特別有用的博客文章,我就把摘抄過來了,好好的學習一下。 序言 開始開發應用號之前,先看看官方公布的「小程序」教程吧!(以下內容來自微信官方公布的「小程序

各開發語言的程序加密方法

加密從各個開發語言出發,對每個開發語言的角度對加密方法做一些闡述。這篇主要講述lua、erlang、perl、ruby語言的加密方法。加密所需:Virbox LM SDK最新版Virbox Protector加殼工具,DS Protector 文檔下載:http://dl.video.virbox.com/v

程序犯錯:“ReferenceError: 模擬服務器傳來的數據 is not defined”

reference nload 學習 犯錯 AD 出現 錯誤 define info 學習數據綁定,在onLoad中模擬服務器傳數據時,報錯:模擬服務器傳來的數據 is not defined 我這裏粗心的忘記註釋說明了,如下: 把該行無關的錯誤數據註釋或刪除即可。這裏提

一個開發小程序的嘗試

bubuko image 發現 pid 圖標 bsp order 。。 平臺 -----------------大佬勿噴 —— 這是個分割線---------------- 小程序都火了那麽久了,忽然有想法自己也嘗試做一個。 (ps: 繼開發公眾號未果、學習java未果、學

微信小程序學習記錄

地址 n) taf forest 對象復制 strong display exp 價格 如何定義一個全局變量: 1,在根目錄下app.js中添加 App({ globalData: { g_isPlayingMusic : false, g_curre

Linux多程序併發伺服器TCP

Linux多程序併發伺服器(TCP) 前言:在Linux環境下多程序的應用很多,其中最主要的就是網路/客戶伺服器。多程序伺服器是當客戶有請求時 ,伺服器用一個子程序來處理客戶請求。父程序繼續等待其它客戶的請求。這種方法的優點是當客戶有請求時 ,伺服器能及時處理客戶 ,特別是在客戶伺服

Android IPC程序間通訊檔案共享

IPC程序間通訊簡介 1.在AndroidManifest.xml中宣告元件android:process屬性。 不指定process屬性,則預設執行在主程序中,主程序名字為包名。 android:process = package:remote,將執行在package:remote程序

使用PrefView監測.NET程序性能:Event Trace for Windows

studio project logs sys 圖片 參考資料 統計 app 參考 前言: 在日常項目開發中,我們時不時會遇到程序占用了很高CPU的情況,可能是程序裏某些未經優化的代碼或者Bug,或者是程序運行壓力太大。無論是什麽原因,我們總希望能看到到底是哪個方法占用了

SpringBoot實現Java高併發秒殺系統DAO層開發

秒殺系統在如今電商專案中是很常見的,最近在學習電商專案時講到了秒殺系統的實現,於是打算使用SpringBoot框架學習一下秒殺系統(本專案基於慕課網的一套免費視訊教程:Java高併發秒殺API,視訊教程中講解的很詳細,非常感謝這位講師)。也是因為最近學習了Spr

一個跨平臺的多程序合作框架基本原理

在上一篇文章中,我們探討了一種通過程序交換的合作框架。經過同學們半年多的討論、實驗,目前實現了這個想法。本篇首先介紹基本原理,後續將詳細講解開發過程。 本文的GitHub連結為 這裡 1. 什麼是Taskbus Taskbus 是一種面向非專業開發者的跨平臺多

Linux環境程序間通訊 管道及有名管道(轉)

管道是Linux支援的最初Unix IPC形式之一,具有以下特點:管道是半雙工的,資料只能向一個方向流動;需要雙方通訊時,需要建立起兩個管道;只能用於父子程序或者兄弟程序之間(具有親緣關係的程序);單獨構成一種獨立的檔案系統:管道對於管道兩端的程序而言,就是一個檔案,但它不是普通的檔案,它不屬於某種檔案系統,

Android 8.0系統原始碼分析--Binder程序間通訊

 開始我們的沉澱之路,老羅的書中第二章講的是Android HAL層的知識,而且直接自己實現了一個虛擬的freg驅動程式,後面的幾節是分別從native、java層如何訪問這個虛擬的驅動程式介面,我這裡沒有這樣的環境,所以就不分析這節了,第三章的智慧指標我對比8.0系統原

Java併發包原始碼學習執行緒池ThreadPoolExecutor原始碼分析

Java中使用執行緒池技術一般都是使用Executors這個工廠類,它提供了非常簡單方法來建立各種型別的執行緒池: public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService

linux/unix多執行緒/多程序程式設計總結

linux/unix多執行緒,多程序程式設計是在實際工作中經常使用到的技能,在C語言或者C++語言面試的時候也經常會被問到此部分內容。 本文對linux/unix系統中的pthread相關的多程序和多執行緒程式設計的各個方面進行了總結,包括執行緒、程序、程

我的小程序入門筆記目錄結構

項目目錄 utils borde tex chrome 交互 tools bind js-sdk 一、微信web開發者工具 歡迎使用微信Web開發者工具,通過該工具,你可以更加便捷的調試微信上的網頁: