1. 程式人生 > 其它 >網路程式設計併發程式設計

網路程式設計併發程式設計

內容概要

  • UDP協議
  • 基於UDP實現簡易聊天
  • 作業系統發展史
  • 多道技術
  • 程序簡介
  • 程序重要概念

UDP協議

# 服務端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)  # 自己指定UDP協議(預設是TCP協議)
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello baby', addr)
# 服務端接收到的訊息
'''
msg>>>: hello server baby
addr>>>: ('127.0.0.1', 61629)
'''

# 客戶端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)  # 查詢通訊錄
client.sendto(b'hello server baby', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
# 客戶端接收到的訊息
'''
msg>>>: hello baby
addr>>>: ('127.0.0.1', 8080)
'''

基於UDP實現簡易聊天

服務端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
    msg, addr = server.recvfrom(1024)
    print(addr)
    print(msg.decode('utf8'))
    back_msg = input('請回復訊息>>>:').strip()
    server.sendto(back_msg.encode('utf8'), addr)

客戶端1

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)

while True:
    msg = input('請輸入想要聊天的內容>>>:').strip()
    msg = '來自客戶端1的訊息:%s' % msg
    client.sendto(msg.encode('utf8'), server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg.decode('utf8'), addr)

客戶端2

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)

while True:
    msg = input('請輸入想要聊天的內容>>>:').strip()
    msg = '來自客戶端2的訊息:%s' % msg
    client.sendto(msg.encode('utf8'), server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg.decode('utf8'), addr)

作業系統的發展史

  1. 穿孔卡片

    優勢:一個人獨佔電腦

    劣勢:CPU利用率極低

  2. 聯機批處理系統

    一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率

  1. 離線批處理系統

    是現代計算機核心部件的雛形、提高CPU的利用率

# 總結:作業系統的發展史其實就是提升CPU利用率的過程
'''為改善CPU的利用率,又引入了多道程式系統'''

多道技術

# 目的:提升CPU利用率 降低程式等待時間
'''強調:目前我們研究併發都是以計算機是單核的情況下:只有一個CPU'''
序列>>>:
	多個任務排隊執行 總耗時就是多個任務完整時間總合
多道>>>:
	利用空閒提前準備 縮短總的執行時間並且還能提高CPU利用率

"""
多道技術
	1.空間上的複用
		多個任務共用一套計算機硬體
	2.時間上的複用
		切換+儲存狀態
			CPU在兩種情況下會被拿走
				1.程式遇到IO操作 CPU自動切走執行其他程式
				2.程式長時間佔用CPU 系統發現之後也會強行切走CPU 保證其他程式也可以使用
"""
  做飯需要30min
  洗衣需要50min
  燒水需要20min
序列總共需要耗時:30min + 50min + 20min
多道總共需要耗時:50min

程序簡介

# 什麼是程式、什麼是程序
    程式:一堆沒有被執行的程式碼(死的)
    程序:正在執行的程式(活的)
        
# 為什麼有程序的概念
	就是為了更加精確的描述出一些實際狀態
    
# 程序排程演算法發展史
1.先來先服務
	對短作業任務不太友好
2.短作業優先
  	多長作業任務不太友好
3.時間片輪轉法與多級反饋佇列
  	時間片輪轉法:先公平的將CPU分給每個人執行
    多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
  '''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''

重要概念*

# 併發與並行
併發
  看上去像同時在執行就可以稱之為是併發
    """看起來同時執行:在短時間內幾個任務來回切換執行並儲存狀態"""
    '單核肯定能夠實現併發 但是不能實現並行!!!'
並行
  必須同一時間同時執行才可以稱之為並行
  """單核計算機肯定不能實現並行!!! 必須要有多個CPU"""

# 高併發與高並行
高併發:我們寫的軟體可以支援1個億的併發量
  一個億的使用者來了之後都可以感覺到自己被服務著
高並行:我們寫的軟體可以支援1個億的並行量
  上述話語的言外之意是計算機有一億個CPU
# 同步與非同步
  同步
  	提交完任務之後原地等待任務的返回結果 期間不做任何事情
  非同步
  	提交完任務之後不願地等待任務的結果 直接去做其他事情 有結果自動提醒
    
# 阻塞與非阻塞
	程序三狀態圖
  	就緒態:程式之進入執行態之前肯定要處於就緒態
    執行態:程式被CPU執行著
    阻塞態:程式執行過程中有IO操作
    '''
    如果想要儘可能的提升程式執行效率 
    就要想辦法讓我們的程式一直處於就緒態和執行態(不要有IO操作)
    '''
  阻塞:阻塞態
  非阻塞:就緒態、執行態

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

"""
同步非同步:用來描述任務的提交方式
阻塞非阻塞:用來描述任務的執行狀態
"""
    
# 上述兩組屬於兩個不同概念 但是可以結合
  同步阻塞:
        銀行排隊辦理業務 期間不做任何事
  同步非阻塞:
    	銀行排隊辦理業務 期間喝水吃東西 但是人還在佇列中
  非同步阻塞:
    	在椅子上坐著 但是不做任何事
  非同步非阻塞:  "(程式執行的極致)"
    	在椅子上坐著 期間喝水吃東西辦公