背景知識
顧名思義,程序即乙個軟體正在進行的過程。程序是對正在執行程式的乙個抽象。
程序的概念起源於作業系統,是作業系統最核心的概念,也是作業系統提供的最古老的也是最重要的抽象概念之一。作業系統的其他所有內容都是圍繞程序的概念展開的。所以想要真正了解程序,必須先了解作業系統
#一.什麼是程序顧名思義,程序就是指正在進行或者執行的任務。負責執行該任務的是cpu一 作業系統的作用:
1:隱藏醜陋複雜的硬體介面,提供良好的抽象介面
2:管理、排程程序,並且將多個程序對硬體的競爭變得有序
#二 多道技術:
1.產生背景:針對單核,實現併發
ps:現在的主機一般是多核,那麼每個核都會利用多道技術,但是核與核之間沒有使用多道技術切換這麼一說;
有4個cpu,執行於cpu1的某個程式遇到io阻塞,會等到io結束再重新排程,會被排程到4個cpu中的任意乙個,具體由作業系統排程演算法決定。
2.時間上的復用(復用乙個cpu的時間片)+空間上的復用(如記憶體中同時有多道程式)
舉例:(單核+多道,實現多個程序的併發):
比如說你就是乙個cpu,你下午有幾個活要幹,吃飯,洗衣服,上廁所等。但是就在那一下午要把所有的事幹完(而cpu同一時間只能幹一件事),那麼如何才能讓多個任務實現併發執行的效果呢?那麼,你應該這樣做,你可以先做飯,在等待飯熟的過程中你可以去洗個衣服,洗的差不多飯也就熟了,那麼你在去上個廁所也可以嘛。
二.程序與程式的區別
程式僅僅只是一堆**而已,而程序指的是程式的執行過程
三.併發和並行
併發:單cpu,多程序併發
無論是並行還是併發,在使用者看來都是'同時'執行的,不管是程序還是執行緒,都只是乙個任務而已,真實幹活的是cpu,cpu來做這些任務,而乙個cpu同一時刻只能執行乙個任務
一 併發:是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)
二.並行:多cpu(同時執行,只有具有多個cpu才能實現並行)
單核下,可以利用多道技術,多個核,每個核也都可以利用多道技術(多道技術是針對單核而言的)
有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,
一旦任務1遇到i/o就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術
而一旦任務1的i/o結束了,作業系統會重新呼叫它(需知程序的排程、分配給哪個cpu執行,由作業系統說了算),可能被分配給四個cpu中的任意乙個去執行
所有現代計算機經常會在同一時間做很多件事,乙個使用者的pc(無論是單cpu還是多cpu),都可以同時執行多個任務(乙個任務可以理解為乙個程序)。
四.同步和非同步
同步執行:乙個程序在執行某個任務時,另外乙個程序必須等待其執行完畢,才能繼續執行
非同步執行:乙個程序在執行某個任務時,另外乙個程序無需等待其執行完畢,就可以繼續執行,當有訊息返回時,系統會通知後者進行處理,這樣可以提高執行效率
舉個例子,打**時就是同步通訊,發短息時就是非同步通訊。
五.程序的建立
但凡是硬體,都需要有作業系統去管理,只要有作業系統,就有程序的概念,就需要有建立程序的方式,一些作業系統只為乙個應用程式設計,比如微波爐中的控制器,一旦啟動微波爐,所有的程序都已經存在。
而對於通用系統(跑很多應用程式),需要有系統執行過程中建立或撤銷程序的能力,主要分為4中形式建立新的程序
1. 系統初始化(檢視程序linux中用ps命令,windows中用任務管理器,前台程序負責與使用者互動,後台執行的程序與使用者無關,執行在後台並且只在需要時才喚醒的程序,稱為守護程序,如電子郵件、web頁面、新聞、列印)
2. 乙個程序在執行過程中開啟了子程序(如nginx開啟多程序,os.fork,subprocess.popen等)
3. 使用者的互動式請求,而建立乙個新程序(如使用者雙擊暴風影音)
4. 乙個批處理作業的初始化(只在大型機的批處理系統中應用)
無論哪一種,新程序的建立都是由乙個已經存在的程序執行了乙個用於建立程序的系統呼叫而建立的:
1. 在unix中該系統呼叫是:fork,fork會建立乙個與父程序一模一樣的副本,二者有相同的儲存映像、同樣的環境字串和同樣的開啟檔案(在shell直譯器程序中,執行乙個命令就會建立乙個子程序)
2. 在windows中該系統呼叫是:createprocess,createprocess既處理程序的建立,也負責把正確的程式裝入新程序。
關於建立的子程序,unix和windows
1.相同的是:程序建立後,父程序和子程序有各自不同的位址空間(多道技術要求物理層面實現程序之間記憶體的隔離),任何乙個程序的在其位址空間中的修改都不會影響到另外乙個程序。
六.程序的終止
1. 正常退出(自願,如使用者點選互動式頁面的叉號,或程式執行完畢呼叫發起系統呼叫正常退出,在linux中用exit,在windows中用exitprocess)
2. 出錯退出(自願,python a.py中a.py不存在)
3. 嚴重錯誤(非自願,執行非法指令,如引用不存在的記憶體,1/0等,可以捕捉異常,try...except...)
4. 被其他程序殺死(非自願,如kill -9)
七.程序的結構層次
無論unix還是windows,程序只有乙個父程序,不同的是:
1. 在unix中所有的程序,都是以init程序為根,組成樹形結構。父子程序共同組成乙個程序組,這樣,當從鍵盤發出乙個訊號時,該訊號被送給當前與鍵盤相關的程序組中的所有成員。
2. 在windows中,沒有程序層次的概念,所有的程序都是地位相同的,唯一類似於程序層次的暗示,是在建立程序時,父程序得到乙個特別的令牌(稱為控制代碼),該控制代碼可以用來控制子程序,但是父程序有權把該控制代碼傳給其他子程序,這樣就沒有層次了。
八.程序的狀態
tail -f access.log |grep '404'
執行程式tail,開啟乙個子程序,執行程式grep,開啟另外乙個子程序,兩個程序之間基於管道'|'通訊,將tail的結果作為grep的輸入。
程序grep在等待輸入(即i/o)時的狀態稱為阻塞,此時grep命令都無法執行
其實在兩種情況下會導致乙個程序在邏輯上不能執行,
1. 程序掛起是自身原因,遇到i/o阻塞,便要讓出cpu讓其他程序去執行,這樣保證cpu一直在工作
2. 與程序無關,是作業系統層面,可能會因為乙個程序占用時間過多,或者優先順序等原因,而呼叫其他的程序去使用cpu。
因而乙個程序由三種狀態
程序的理論基礎
作業系統介於計算機硬體和軟體之間,本質也是乙個軟體,用來協調,管理和控制計算機和軟體的控制大軟體,由作業系統的核心以及系統呼叫兩部分組成,所處的位置如下 作用 隱藏醜陋複雜的硬體介面,提供良好的抽象介面 管理,排程程序,將多個程序變得有序 多道技術 產生背景 針對單核,實現併發 空間上的復用 記憶體...
day32 學習總結
檔案的傳輸,輸入與輸出 按流的方向可以分為 輸入流和輸出流 按流的型別可以分為 位元組流和字元流 字元流主要用於文字檔案,可以通過記事本直接開啟的檔案使用需要通過其子類建立流物件fileoutputstream 檔案位元組輸出流 將內容輸出到文字檔案中構造方法 fileoutputstream fi...
Python 程序與執行緒理論基礎 Day10
理論基礎 一 作業系統的作用 1 隱藏醜陋複雜的硬體介面,提供良好的抽象介面 2 管理 排程程序,並且將多個程序對硬體的競爭變得有序 二 多道技術 1.產生背景 針對單核,實現併發 現在的主機一般是多核,那麼每個核都會利用多道技術,但是核與核之間沒有使用多道技術切換這麼一說,乙個程式io阻塞,會等到...