1. 程式人生 > 其它 >作業系統基礎知識 多道技術 程序理論

作業系統基礎知識 多道技術 程序理論

概要

  • 題目講解

  • UDP協議

  • UDP協議實戰

  • 作業系統的發展史

  • 多道技術

  • 程序理論

內容

1、題目講解

# 能夠實現功能即可 暫時無需整合到一起
   以上傳下載電影為例: 其實寫了一個另外一個反過來就可以
# 以上傳電影為例
參考檔案程式碼
優化: 利用字典來做功能整合
思路:
    1.上傳的電影如何判斷是否重複
    小白思想:校驗電影名稱是否存在
    正確思想:校驗電影名稱的md5值(核心是內容不是名稱)
    2.上傳的電影如何判斷是否一致
    提前對電影內容加密 之後再次加密對比是否一致
    

程式碼:

服務端
import socket
import json
import struct

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)

sock, addr = server.accept()
# 1.接收固定長度的報頭
header = sock.recv(4)
# 2.解析出字典的長度
dict_len = struct.unpack('i', header)[0]
# 3.接收字典資料
dict_bytes = sock.recv(dict_len)
dict_data = json.loads(dict_bytes)
# 4.接收真實資料
recv_size = 0
total_size = dict_data.get('file_size')
file_name = dict_data.get('file_name')
# 5.檔案操作
with open(file_name, 'wb') as f:
    while recv_size < total_size:
        data = sock.recv(1024)
        f.write(data)
        recv_size += len(data)
        
使用者端
import socket
import os
import json
import struct

client = socket.socket()
client.connect(('127.0.0.1', 8080))

movie_dir_path = r'/Users/jiboyuan/Desktop/直播課/python基礎day33/視訊'
while True:
    # 1.迴圈展示出需要上傳的電影列表
    movie_name_list = os.listdir(movie_dir_path)
    for i, movie_name in enumerate(movie_name_list, start=1):
        print(i, movie_name)
    choice = input('請選擇您想要上傳的電影編號>>>:').strip()
    if not choice.isdigit():
        continue
    choice = int(choice)
    if choice not in range(1, len(movie_name_list) + 1):
        print('請輸入正確的編號')
        continue

    # 2.獲取電影名字
    target_movie_name = movie_name_list[choice - 1]
    # 3.拼接電影路徑
    movie_path = os.path.join(movie_dir_path, target_movie_name)
    # 4.製作字典資料
    movie_dict = {
        'file_name': target_movie_name,
        'file_desc': '請及時補充營養',
        'file_size': os.path.getsize(movie_path)
    }
    movie_dict_json = json.dumps(movie_dict)
    movie_dict_len = len(movie_dict_json.encode('utf8'))
    # 5.製作字典報頭
    dict_header = struct.pack('i', movie_dict_len)
    # 6.傳送字典報頭
    client.send(dict_header)
    # 7.傳送字典資料
    client.send(movie_dict_json.encode('utf8'))
    # 8.傳送真實資料
    with open(movie_path,'rb') as f:
        for line in f:
            client.send(line)

2、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)


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)

3、作業系統的發展史:學習併發程式設計其實就是在學習作業系統 理論較多 實踐較少 因為都是封裝好的程式碼

1.穿孔卡片
優勢:一個人使用電腦
劣勢:CPU利用率極低
    
2.聯機批處理系統
一次性可以錄入多個使用者指令 縮短了CPU等待的時間 提高了CPU的利用率

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

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

4、多道技術

# 學習的目的:提升CPU利用率 降低程式等待時間
前提:目前研究都是以計算機是單核的情況下 意思就是隻有一個CPU的情況下
 序列:多個任務排隊執行 總耗時就是多個任務完整時間  疊加 # eg:20+30+50
 多道:利用空閒時間提前準備 縮短總的執行時間並且還能提高CPU的利用率
    
"""
多道技術
1.空間上的複用 多個任務共用一套計算機硬體
2.時間上的複用 切換+儲存狀態
  CPU在兩種情況下會被拿走:
  第一種 程式遇到IO操作時 CPU自動切走執行其他程式
  第二種 程式長時間佔用CPU 系統發現之後也會強行切走CPU 保證其他程式也可以使用"""
  做飯需要30min
  洗衣需要50min
  燒水需要20min
序列總共需要耗時:30min + 50min + 20min
多道總共需要耗時:50min
  

5、程序理論

# 什麼是程式 什麼是程序
程式:一堆沒有被執行的程式碼(死的)
程序:正在執行的程式(活的)

# 為什麼有程序的概念
就是為了更加精確的描述出一些實際狀態

# 程序排程演算法發展史
1.先來先服務
對短作業任務不太友好
2.短作業優先
對於長時間任務不太友好
3.時間片輪轉法與多級反饋佇列
時間片輪轉法:先公平的將CPU分給每個人執行
多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
    目的就是為了能夠讓單核的計算機也能做到執行多個程式

6、重要概念(併發與並行)

#  併發與並行
看上去像同時在執行就可以稱之為是併發

例如:
    飯店裡面有多桌客人(任務) 
    但是隻有一個服務員(CPU) 
    如何讓所有客人都感覺被服務員服務著(CPU執行)
      讓服務員在多桌客人之間快速的來回切換並儲存狀態即可
      讓CPU在多個程式之間利用多道技術來回切換+儲存狀態
	
		單核肯定能夠實現併發 但是不能實現並行!!!
        
並行
  	必須同一時間同時執行才可以稱之為並行
		"""單核計算機肯定不能實現並行!!! 必須要有多個CPU"""
    
# 高併發與高並行
	高併發:我們寫的軟體可以支援1個億的併發量
    	一個億的使用者來了之後都可以感覺到自己被服務著
  高並行:我們寫的軟體可以支援1個億的並行量
    	上述話語的言外之意是計算機有一億個CPU
    

7、重要概念2(同步與非同步)

# 同步與非同步
	同步
  	提交完任務之後原地等待任務的返回結果 期間不做任何事情
  非同步
  	提交完任務之後不願地等待任務的結果 直接去做其他事情 有結果自動提醒
 
# 阻塞與非阻塞
	程序三狀態圖
  	就緒態:程式之進入執行態之前肯定要處於就緒態
    執行態:程式被CPU執行著
    阻塞態:程式執行過程中有IO操作
    '''
    如果想要儘可能的提升程式執行效率 
    就要想辦法讓我們的程式一直處於就緒態和執行態(不要有IO操作)
    '''
  阻塞:阻塞態
  非阻塞:就緒態、執行態
  ps:以後不需要考慮是哪個狀態 知識今天深入學習一下

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

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