天天看點

程序同步與異步

   說起程序的同步和異步,應該從程序的阻塞和挂起

 1.阻塞和挂起差別

  1)挂起是一種主動行為,是以恢複也應該主動完成,而阻塞是一種杯中行為,是在等待時間或者資源任務時的表現,我們也不知道什麼時候阻塞什麼時候恢複阻塞,是透明的。

  2)阻塞任務釋放Cpu,其他任務可以獲得cpu運作,而挂起不釋放cpu,如果任務優先級高就永遠輪不到其他任務,一般挂起用于程式調試中的條件中斷。

  3)任務排程是作業系統實作的,任務排程時,直接忽略挂起狀态的任務,但會顧及處于阻塞狀态下的任務,阻塞任務隻要獲得資源就會轉為就緒狀态,而挂起不行

  4)挂起是主動的,一般用挂起函數操作,若不去激活,則一直處于挂起狀态,而阻塞是因為資源被其他任務搶占而處于休眠狀态,兩者的表現方式都是從就緒狀态裡清掉,隻不過實作方式不同。

2.同步和異步的差別

   雖然整天聽别人說同步異步,但是還是搞不清楚,什麼是同步什麼是異步。現在我們用通俗易懂的例子來說明同步和異步的差别。

  1)在資料傳輸上,同步傳輸和異步傳輸:

  同步傳輸:是以資料塊為基本機關進行傳輸,發出資料後,等待接收方響應以後才發下一個資料包。

  異步傳輸:是以字元為基本機關進行傳輸,不等待接收方響應,接着發下一個資料包的通訊方式。

  2)在B/S架構中:

    http協定:由于http本身是基于tcp連接配接的,而tcp連結要通過三次握手協定,每次請求,必須等待接受方回複,是以Http本身是同步的,沒有異步的Http協定。通俗來将當我們通過一個連接配接通路網站的時候,浏覽器什麼也不幹,就隻是等着接受傳回來的http響應,如果一直沒有響應,那麼就一直等待,知道傳回渲染的頁面或者請求失敗資訊。

   Ajax:上述的同步方式,顯然不利于使用者的體驗,是以出現了Ajax技術,ajax技術本身是一種異步通信,當浏覽器送出請求信号後,無需一直等待接受整個http傳回的資訊,可以去做其他的事情。

      但是從實質來說,異步是基于同步來實作的,像ajax技術,雖然浏覽器不需要等待http傳回的資訊,可以去幹其他事情,但是為什麼當ajax傳回的資訊,浏覽器能否接收到呢,這說明浏覽器還是一直在等待傳回的資訊,實際上是浏覽器設定了一個監聽線程在不斷的等待http響應,也就是說把原本有浏覽器程序所做的事情交給了浏覽器的某個線程去完成。

3.同步基本概念

   當兩個程序并發執行時,由于資源共享或者程序合作,使同處于一個系統中的程序之間可能存在以下兩種形式的同步關系:

   1)間接同步關系(間接制約):資源共享導緻了這種同步關系的形成,比如A、B兩個列印程序,同時共享列印裝置,當A程序占用列印機列印的時候,B得不到列印機資源,則B處于阻塞狀态,必須等A釋放列印機資源,B才能将阻塞狀态變為就緒狀态。

程式同步與異步

   2)直接同步關系(直接制約):程序合作導緻這種同步關系的形成。比如A、B兩個程序,B需要從緩沖區拿A程序的輸出結果。A程序通過把輸出結果輸出到一個緩沖區,當緩沖區為空時,B進入阻塞狀态,當A程序輸出結果到緩沖區後,喚醒B程序,當緩沖區滿時,A程序進入組則狀态.

程式同步與異步

4.解決同步問題

利用互斥和信号量來解決同步問題。

互斥,當一個資源(臨界資源)被一個程序通路時,其他程序如果想通路該資源,就必須等待。(比如一個單人衛生間,如果一個人進去使用了,門鎖住,那麼其他人想使用必須等待)。

信号量,其實就是一個變量,來描述共享資源的空間,來控制同步問題。(比如一個廁所有5間衛生間,當來一個人就singal-1,這是P操作申請空間,當廁所出去一個人singal+1,這是V操作釋放空間,而且不可以同時操作信号量,而且singal最大值是5)當一個人來廁所,首先先申請空間,singal-1,如果singal>=0,則可以進去,如果singal<0那麼必須等待,如果一個人要出去,singal=0,表示沒有人,不可能出去。是以這樣就保證了同步。