1. 程式人生 > >第四模塊練習

第四模塊練習

以及 占用 控制線 recv 異步io 信號 方式 == 長度

1、簡述計算機操作系統中的“中斷”作用?

中斷裝置由一些特定的寄存器和控制線路組成,中央處理器和外圍設備等識別到的事件保存在特定的寄存器中。

中央處理器每執行完一條指令,均由中斷裝置判別是否有事件發生。

若無事件發生,CPU繼續執行;

若有事件發生,則中斷裝置中斷原占有CPU的程序的執行,讓操作系統的處理事件服務程序占用CPU,對出現的事件進行處理,事件處理完後,再讓原來的程序繼續占用CPU執行

2、簡述計算機內存中的“內核態”和“用戶態”

操作系統的核心是內核,獨立於普通的應用程序,內核可以訪問受保護的內存空間,也可以訪問底層硬件設備的所有權限。為了保證用戶進程不能直接操作內核,保證內核的安全,操作系統將虛擬空間劃分為兩部分,一部分是內核空間,一部分是用戶空間。

3、進程間通信方式有哪些?

1、管道
2、有名管道(FIFO)
3、消息隊列
4、信號量
5、共享內存
6、套接字(socket)

4、簡述你對管道、隊列的理解;

管道通常指無名管道
1、它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端
2、它只能用於具有親緣關系的進程中通信(也就是父與子進程或者兄弟進程之間)
3、數據不可反復讀取了,即讀了之後歡喜紅區中就沒有了

消息隊列
1、消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級

2、消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容不會被刪除。
3、消息隊列可以實現消息隨機查詢。

5、什麽是同步I/O,什麽是異步I/O?

同步和異步關註的消息通信機制

同步io

用戶態向內核態發出一個調用,在沒有得到結果之前,該調用返回,一旦返回就有返回值。
換句話說,就是調用者主動等待這個調用的結果

異步io

用戶態向內核態發出調用,這個調用立即返回,所以沒有返回結果。
換句話說,調用者發出調用後,不會立即得到結果,被調用者通過狀態、通知或者回調函數處理這個調用。

6、寫一個程序,包含十個線程,同時只能有五個子線程並行執行;
import threading
from threading import Semaphore
import time


def task(sm, i):
    sm.acquire()
    time.sleep(1)
    print(i)
    sm.release()


if __name__ == ‘__main__‘:
    sm = Semaphore(5)
    for i in range(9):
        t = threading.Thread(target=task, args=(sm, i ))
        t.start()
    
7、寫一個程序,要求用戶輸入用戶名和密碼,要求密碼長度不少於6個字符,且必須以字母開頭,如果密碼合法,則將該密碼使用md5算法加密後的十六進制概要值存入名為password.txt的文件,超過三次不合法則退出程序;
import hashlib
import re
import json
count = 0
hash = hashlib.md5()
while count < 3:
    user = input("user>>").strip()
    pwd = input("pwd>>").strip()
    print()
    if len(pwd) >= 6 and re.search(‘\A[a-zA-Z]‘, pwd):
        pwd_md5 = hash.hexdigest()
        with open(‘password.txt‘, ‘w‘) as f:
            data = {user: pwd_md5}
            f.write(json.dumps(data))
            print("保存成功")
            break
    else:
        count += 1
        print("密碼不合法")
8、寫一個程序,使用socketserver模塊,實現一個支持同時處理多個客戶端請求的服務器,要求每次啟動一個新線程處理客戶端請求;
import socketserver
import threading


class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            self.data = self.request.recv(1024).decode()
            print(self.data)
            self.request.send(self.data.upper().encode())
        
        
if __name__ == ‘__main__‘:
    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 9999), MyServer)
    t = threading.Thread(target=server.serve_forever)
    t.start()

第四模塊練習