"點我查看秘籍連載" 進程基礎 程式和進程 什麼是程式?什麼是進程?程式和進程之間的關係?相信在任何介紹進程基礎的地方都會解釋一下程式和進程之間的關係,這是一個常識性的知識。 單獨來看程式和進程,它們的概念都非常的簡單。粗略去看,程式是一個或多個文件,進程是操作系統上能做某些事情的東西。 更標準一點 ...
進程基礎
程式和進程
什麼是程式?什麼是進程?程式和進程之間的關係?相信在任何介紹進程基礎的地方都會解釋一下程式和進程之間的關係,這是一個常識性的知識。
單獨來看程式和進程,它們的概念都非常的簡單。粗略去看,程式是一個或多個文件,進程是操作系統上能做某些事情的東西。
更標準一點,程式是由編程人員編碼好的一個或多個文件,換句話說,程式是由源代碼組成的靜態的文件,裡面定義了這個程式要做什麼事,實現什麼功能。但是它僅僅只是定義了這些要做的事情以及要實現的功能,並沒有去做這些事情。只有當程式在操作系統上運行起來之後產生了進程,才會由進程去做這些事情。所以,進程是程式在操作系統上運行之後產生的,是程式動起來之後的一個實例,因此也可以將進程看作是“運行中的程式”。
所以,程式自身只是包含了一些指令和一些靜態數據,靜止地躺在磁碟里的某個位置,它是無生命無靈魂的。當開始執行程式後,操作系統負責將程式源代碼裝載到記憶體中,使其動起來,賦予了它的靈魂和生命,它將因此變得有意義。
程式如何變成進程
靜止的程式到底是怎麼轉換成運行的進程的?OS是如何讓程式運行起來的?進程是如何創建並工作的?這是幾個讓人疑惑又想窺得究竟的問題。
早期一些操作系統,會一次性將程式所有相關代碼和數據裝載到記憶體,而現代的操作系統是lazy模式裝載,只在程式的執行過程中需要某段代碼時,臨時去裝載。
當代碼和靜態數據已經裝載到記憶體後,OS還需要為將要運行的程式做一些額外的操作,比如為該進程分配一些記憶體;創建一些數據結構;初始化與IO相關的一些任務(比如Unix系統中,設置好每個進程都關聯的3個文件描述符:stdout、stdin、stderr),等等。
當完成了這些操作後,程式開始執行。因為程式的執行要從main()函數(程式的入口,即使是非C程式,也一定有一個入口函數)開始,所以需要先跳轉到main()函數,然後OS將CPU控制權交給新創建的進程,進程獲取到CPU後就可以執行了。