天天3分鐘操做系統修煉祕籍(22):程序如何變成進程

點我查看祕籍連載編程

進程基礎

程序和進程

什麼是程序?什麼是進程?程序和進程之間的關係?相信在任何介紹進程基礎的地方都會解釋一下程序和進程之間的關係,這是一個常識性的知識。數據結構

單獨來看程序和進程,它們的概念都很是的簡單。粗略去看,程序是一個或多個文件,進程是操做系統上能作某些事情的東西。函數

更標準一點,程序是由編程人員編碼好的一個或多個文件,換句話說,程序是由源代碼組成的靜態的文件,裏面定義了這個程序要作什麼事,實現什麼功能。可是它僅僅只是定義了這些要作的事情以及要實現的功能,並無去作這些事情。只有當程序在操做系統上運行起來以後產生了進程,纔會由進程去作這些事情。因此,進程是程序在操做系統上運行以後產生的,是程序動起來以後的一個實例,所以也能夠將進程看做是「運行中的程序」。編碼

因此,程序自身只是包含了一些指令和一些靜態數據,靜止地躺在磁盤裏的某個位置,它是無生命無靈魂的。當開始執行程序後,操做系統負責將程序源代碼裝載到內存中,使其動起來,賦予了它的靈魂和生命,它將所以變得有意義。操作系統

程序如何變成進程

靜止的程序究竟是怎麼轉換成運行的進程的?OS是如何讓程序運行起來的?進程是如何建立並工做的?這是幾個讓人疑惑又想窺得究竟的問題。blog

早期一些操做系統,會一次性將程序全部相關代碼和數據裝載到內存,而現代的操做系統是lazy模式裝載,只在程序的執行過程當中須要某段代碼時,臨時去裝載。進程

當代碼和靜態數據已經裝載到內存後,OS還須要爲將要運行的程序作一些額外的操做,好比爲該進程分配一些內存;建立一些數據結構;初始化與IO相關的一些任務(好比Unix系統中,設置好每一個進程都關聯的3個文件描述符:stdout、stdin、stderr),等等。內存

當完成了這些操做後,程序開始執行。由於程序的執行要從main()函數(程序的入口,即便是非C程序,也必定有一個入口函數)開始,因此須要先跳轉到main()函數,而後OS將CPU控制權交給新建立的進程,進程獲取到CPU後就能夠執行了。get

相關文章
相關標籤/搜索