36 併發程式設計理論

2022-08-31 16:54:14 字數 3602 閱讀 6116

多道技術是基於單核背景下產生的

cpu 執行過程(單核):

​ cpu 同一時間只能執行乙個任務,這個任務不結束,不能執行其他任務

​ cpu 在執行a任務時,a任務發生了 io 操作或者是執行時間過長時,此時 cpu 可以將 a(儲存狀態)然後再切換去執行b任務。等到執行遇到'io操作或者執行時間過長時',再將 cpu 執行許可權交給 a,直到兩個任務都完成。

​ 空間上的復用:

​ 將記憶體劃分為多個片,可以執行多個程式

​ 時間上的復用:

​ 切換 + 儲存狀態

​ 例子:洗衣服30s,做飯50s,燒水30s

​ 單道需要110s,多道只需要任務做長的那乙個 切換節省時間

​ 例子:邊吃飯邊玩遊戲 儲存狀態

​ 1) 當執行程式遇到io時,作業系統會將cpu的執行許可權剝奪。

​ 2) 當執行程式執行時間過長時,作業系統會將cpu的執行許可權剝奪。

1、併發:

​ 在單核(乙個 cpu)情況下,當執行a,b 程式時,a 先執行,當 a 遇到 io 時,作業系統會將 a 程式狀態儲存並切換執行 b 程式,他們看起來像同時執行

​ 併發是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)

​ ps:在單核情況下,不能實現並行,只能實現併發(偽並行)

​ 2、並行:

​ 在多核(多個 cpu)的情況下,當執行a,b 程式時,a 與 b 同時執行,他們是真正意義上的同時執行

單核下,可以利用多道技術,多個核,每個核也都可以利用多道技術(多道技術是針對單核而言的)

有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,一旦任務1遇到i/o就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術。而一旦任務1的i/o結束了,作業系統會重新呼叫它(需知程序的排程、分配給哪個cpu執行,由作業系統說了算),可能被分配給四個cpu中的任意乙個去執行

​ 如圖所示:

程式與程序的區別

"""

程式就是一堆躺在硬碟上的**,是「死」的

程序則表示程式正在執行的過程,是「活」的

上述概念的組合:最高效的一種組合就是非同步非阻塞

定心丸:**開啟程序和執行緒的方式,**書寫基本是一樣的,你學會了如何開啟程序就學會了如何開啟執行緒

from multiprocessing import process

import time

def task(name):

print('%s is running'%name)

time.sleep(3)

print('%s is over'%name)

if __name__ == '__main__':

# 1 建立乙個物件

p = process(target=task, args=('jason',))

# 容器型別哪怕裡面只有1個元素 建議要用逗號隔開

# 2 開啟程序

p.start() # 告訴作業系統幫你建立乙個程序 非同步

print('主')

# 第二種方式 類的繼承

from multiprocessing import process

import time

class myprocess(process):

def run(self):

print('hello bf girl')

time.sleep(1)

print('get out!')

if __name__ == '__main__':

p = myprocess()

p.start()

print('主')

總結

"""

建立程序就是在記憶體中申請一塊記憶體空間將需要執行的**丟進去

乙個程序對應在記憶體中就是一塊獨立的記憶體空間

多個程序對應在記憶體中就是多塊獨立的記憶體空間

程序與程序之間資料預設情況下是無法直接互動,如果想互動可以借助於第三方工具、模組

"""

join是讓主程序等待子程序**執行結束之後,再繼續執行。不影響其他子程序的執行

from multiprocessing import process

import time

def task(name, n):

print('%s is running'%name)

time.sleep(n)

print('%s is over'%name)

if __name__ == '__main__':

# p1 = process(target=task, args=('jason', 1))

# p2 = process(target=task, args=('egon', 2))

# p3 = process(target=task, args=('tank', 3))

# start_time = time.time()

# p1.start()

# p2.start()

# p3.start() # 僅僅是告訴作業系統要建立程序

# # time.sleep(50000000000000000000)

# # p.join() # 主程序等待子程序p執行結束之後再繼續往後執行

# p1.join()

# p2.join()

# p3.join()

start_time = time.time()

p_list =

for i in range(1, 4):

p = process(target=task, args=('子程序%s'%i, i))

p.start()

for p in p_list:

p.join()

print('主', time.time() - start_time)

from multiprocessing import process

money = 100

def task():

global money # 區域性修改全域性

money = 666

print('子',money)

if __name__ == '__main__':

p = process(target=task)

p.start()

p.join()

print(money)

併發程式設計理論

併發 在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。簡言之,是指系統具有處理多個任務的能力。當系統有乙個以上cpu時,則執行緒的操作有可能非併發。當乙個cpu執行乙個執行緒時,另乙個cpu可以...

網路程式設計02 併發理論

import socket s socket.socket 建立網路傳輸,預設tcp協議 s.bind ip port 繫結ip 埠 s.listen 5 半連線池 sock,addr s.accept 監聽,三次握手的lisent態 sock.recv 1024 接收內容 sock.send 傳送...

python 併發程式設計理論部分

一,什麼是程序?程序 正在進行的乙個過程或者說乙個任務。而負責執行任務的則是cpu 舉例 單核 多道,實現多個程序的併發執行 egon在乙個時間段內有很多任務要做 python備課的任務,寫書的任務,交女朋友的任務,王者榮耀上分的任務,但egon同一時刻只能做乙個任務 cpu同一時間只能幹乙個活 如...