1. 程式人生 > >第四模組:網路程式設計進階&資料庫開發 口述

第四模組:網路程式設計進階&資料庫開發 口述

子程序死了之後 ,父程序關閉的時候要清理掉子程序的殭屍程序(收屍),孤兒程序是指父程序先死掉了的,交給init管理。

join() 等待子程序結束後才執行主程序下面的程式碼

即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支援(偽)併發的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術:時間多路複用和空間多路複用+硬體上支援隔離),沒有程序的抽象,現代計算機將不復存在。

一 作業系統的作用:
    1:隱藏醜陋複雜的硬體介面,提供良好的抽象介面
    2:管理、排程程序,並且將多個程序對硬體的競爭變得有序

二 多道技術:
    1.產生背景:針對單核,實現併發
    ps:
    現在的主機一般是多核,那麼每個核都會利用多道技術
    有4個cpu,運行於cpu1的某個程式遇到io阻塞,會等到io結束再重新排程,會被排程到4個
    cpu中的任意一個,具體由作業系統排程演算法決定。

    2.空間上的複用:如記憶體中同時有多道程式
    3.時間上的複用:複用一個cpu的時間片
       強調:遇到io切,佔用cpu時間過長也切,核心在於切之前將程序的狀態儲存下來,這樣
            才能保證下次切換回來時,能基於上次切走的位置繼續執行

什麼是作業系統

精簡的說的話,作業系統就是一個協調、管理和控制計算機硬體資源和軟體資源的控制程式。作業系統所處的位置如圖

ps:作業系統位於計算機硬體與應用軟體之間,本質也是一個軟體。作業系統由作業系統的核心(運行於核心態,管理硬體資源)以及系統呼叫(運行於使用者態,為應用程式設計師寫的應用程式提供系統呼叫介面)兩部分組成,所以,單純的說作業系統是運行於核心態的,是不準確的。

作業系統與普通軟體的區別

1、主要區別是:你不想用暴風影音了你可以選擇用迅雷播放器或者乾脆自己寫一個,但是你無法寫一個屬於作業系統一部分的程式(時鐘中斷處理程式),作業系統由硬體保護,不能被使用者修改。

2、作業系統與使用者程式的差異並不在於二者所處的地位。特別地,作業系統是一個大型、複雜、長壽的軟體,

一 什麼是程序

程序:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。

二 程序與程式的區別

程式僅僅只是一堆程式碼而已,而程序指的是程式的執行過程。


需要強調的是:同一個程式執行兩次,那也是兩個程序,比如開啟暴風影音,雖然都是同一個軟體,但是一個可以播放蒼井空,一個可以播放飯島愛。

併發與並行

無論是並行還是併發,在使用者看來都是'同時'執行的,不管是程序還是執行緒,都只是一個任務而已,真是幹活的是cpu,cpu來做這些任務,而一個cpu同一時刻只能執行一個任務

一 併發:是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發

二 並行:同時執行,只有具備多個cpu才能實現並行

程序的三種狀態:執行 ,阻塞,就緒

Process類的介紹

建立程序的類:

Process([group [, target [, name [, args [, kwargs]]]]]),由該類例項化得到的物件,可用來開啟一個子程序

強調:
1. 需要使用關鍵字的方式來指定引數
2. args指定的為傳給target函式的位置引數,是一個元組形式,必須有逗號
引數介紹:
group引數未使用,值始終為None

target表示呼叫物件,即子程序要執行的任務

args表示呼叫物件的位置引數元組,args=(1,2,'egon',)

kwargs表示呼叫物件的字典,kwargs={'name':'egon','age':18}

name為子程序的名稱

方法介紹:
p.start():啟動程序,並呼叫該子程序中的p.run() 
p.run():程序啟動時執行的方法,正是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法  

p.terminate():強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,
使用該方法需要特別小心這種情況。如果p還儲存了一個鎖那麼也將不會被釋放,進而導致死鎖 p.is_alive():如果p仍然執行,返回True p.join([timeout]):主執行緒等待p終止(強調:是主執行緒處於等的狀態,而p是處於執行的狀態)。timeout是可選的超時時間。

屬性介紹:
p.daemon:預設值為False,如果設為True,代表p為後臺執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為True後,p不能建立自己的新程序,必須在p.start()之前設定

p.name:程序的名稱

p.pid:程序的pid

Process物件的join方法

在主程序執行過程中如果想併發地執行其他的任務,我們可以開啟子程序,此時主程序的任務與子程序的任務分兩種情況

情況一:在主程序的任務與子程序的任務彼此獨立的情況下,主程序的任務先執行完畢後,主程序還需要等待子程序執行完畢,然後統一回收資源。

情況二:如果主程序的任務在執行到某一個階段時,需要等待子程序執行完畢後才能繼續執行,就需要有一種機制能夠讓主程序檢測子程序是否執行完畢,在子程序執行完畢後才繼續執行,否則一直在原地阻塞,這就是join方法的作用

 

程序物件的其他方法一:terminate與is_alive

程序物件的其他屬性:name與pid

關於守護程序需要強調兩點:

其一:守護程序會在主程序程式碼執行結束後就終止

其二:守護程序內無法再開啟子程序,否則丟擲異常:AssertionError: daemonic processes are not allowed to have children

如果我們有兩個任務需要併發執行,那麼開一個主程序和一個子程序分別去執行就ok了,如果子程序的任務在主程序任務結束後就沒有存在的必要了,那麼該子程序應該在開啟前就被設定成守護程序。主程序程式碼執行結束,守護程序隨即終止