1. 程式人生 > 其它 >UDP協議與併發預備理論

UDP協議與併發預備理論

UDP協議

# 服務端

      import socket
      server = socket.socket(type=socket.SOCK_DGRAM)  # 指定協議為UDP協議
      server.bind(('127.0.0.1', 9000))
      while True:
          msg, addr = server.recvfrom(1024)
          print('資訊>>>>:', msg.decode('utf8'))
          print('資訊來自>>>>:', addr)
          message = input('回覆的資訊>>>>:').strip()
          server.sendto(message.encode('utf8'), addr)

# 客戶端
      import socket
      client = socket.socket(type=socket.SOCK_DGRAM)  # 指定協議為UDP協議
      while True:
          message = input('請輸入要傳送的資訊>>>>:').strip()
          client.sendto(message.encode('utf8'), ('127.0.0.1', 9000))
          msg, addr = client.recvfrom(1024)
          print('資訊>>>>:', msg.decode('utf8'))
          print('資訊來自>>>>:', addr)

UDP協議沒有建立連結通道的操作,從而也沒有斷開連結通道的需求。可以直接對某個地址傳送資訊,只需要在傳送資料的時候進行地址的指定就可以傳送。並且在傳送資訊的時候不需要對方確認接收。而且使用的接收和傳送指令都是不同於TCP協議的。

併發預備理論

作業系統的發展史

  1. 穿孔卡片
      優點:一個人佔據電腦
      缺點:CPU利用率低(由於穿孔卡片製作上傳的過程,CPU都不工作)
  1. 聯機批處理系統
      一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率

  2. 離線批處理系統
      是現代計算機核心部件的雛形、提高CPU的利用率

總結:作業系統的發展史其實就是提升CPU利用率的過程

多道技術

這裡需要注意的是,目前階段,我們研究併發是基於單核CPU情況
 1. 序列:是指多個任務執行的順序是類似於串起來的環節,總是在每一個任務做完以後才會執行下一個任務
 2. 多道:是指利用不同環節是否佔用對不同的任務進行執行不同的階段(從硬碟)

  • 空間上的複用:多工共用一套計算機系統
  • 時間上的複用:切換 + 儲存狀態(是指在兩種情況下CPU會被切換走)
     (1) 程式遇到IO操作時,CPU會自動切走
     (2) 程式長時間佔用CPU,被系統發現後,也會強行切走CPU,保證其他程式的執行

程序理論

程式與程序

  • 程式:沒有被執行的程式碼
  • 程序:正在被執行的程式碼
    程序概念的出現,就是為了精確描述一些程式碼的實際狀態

程序排程演算法發展史

  1. 先來的先服務(先來後到):存在對短程序不友好的問題
  2. 短作業優先(按程序需要時間由短到長進行排序,然後依次執行):存在對長程序不友好的問題
  3. 時間片輪轉法與多級反饋佇列
      時間片輪轉法:先公平的將CPU分別給每個人執行(將固定的CPU執行時間,按照程序數分片,然後分給每一個程序)
      多級反饋佇列:根據作業的長短的不同再合理分配CPU執行時間

程序排程演算法的發展本質上也是為了讓單核計算能夠做到執行多個程式

重要概念

併發與並行

併發:看著像是多個程序在同時進行

類似於只有一個服務員的餐廳同時來了多位客人,並且還要服務好每位客人的問題。只有合理安排服務顧客A的空閒時間去服務其他客人才能保證服務各位客人,看似在服務多位客人,其實同一時間只服務了一位客人

並行:必須是多個程序在同時執行

以上面舉得例子為例,如果想同一時間服務好每一位客人,那麼就要求必須有與客人數相等的服務員數量
單核計算機只能實現併發,不能實現並行

高併發與高並行

  • 高併發:我們寫的軟體可以支援1個億的併發量。一個億的使用者來了之後都可以感覺到自己被服務著
  • 高並行:我們寫的軟體可以支援1個億的並行量。上述話語的言外之意是計算機有一億個CPU

同步與非同步

  • 同步:提交任務後,等待任務的結果,並不做其他事情
  • 非同步:提交任務後,去做其他事情,等到執行完有結果以後自動提醒、

阻塞與非阻塞

 這裡需要介紹程序的三種狀態:就緒態、執行態、阻塞態

  • 就緒態:程式才被執行前要處於就緒態

  • 執行態:程式被CPU執行過程中

  • 阻塞態:程式執行過程中有IO操作

  • 阻塞:程序處於阻塞態

  • 非阻塞:程序處於就緒態或者執行態
    想要提升程式的執行效率,就是要提升程式處於就緒態和執行態的時間比例(極致狀態就是一直處於該狀態)

同步非同步與阻塞非阻塞的結合

同步非同步:用來描述任務的提交方式
阻塞非阻塞:用來描述任務的執行狀態

  • 同步阻塞:排隊的時候不做任何事
  • 同步非阻塞:排隊的時候做其他事
  • 非同步阻塞:在銀行的椅子上坐著,等著排隊且不做其他事
  • 非同步非阻塞:在椅子上坐著,等排隊的時候做其他事