程序是作業系統才有的概念,執行緒可以是作業系統級別的概念,也可以不是。
任何比喻都會一定程度上的不準確,不過,我還是用比喻來說明吧,當然,很可能你只有真的感受到程序和執行緒是啥子東西之後,才能理解這些比喻。
用高階程式語言編出來的程式碼,也算是程式,但並不是二進位制檔案,而是可以編譯成可執行檔案,有的高階程式語言是解釋執行的,從頭到尾你都看不見二進位制檔案,所以,程式可以看成是一組指令,這些指令可能是二進位制(機器指令),也可以不是二進位制(比如bash),按照這個指令來做就可以完成某些任務。
打個比方,程式就是一個菜譜:
上面是做蛋炒飯的建議菜譜,你也可以理解為一個程式,寫在紙上,誰都可以照做去做蛋炒飯。
執行緒和程序是程式的“執行過程”。
參照上面蛋炒飯的例子,現在菜譜(程式)寫在紙上(硬盤裡),一個活人(電腦)開始讀這個菜譜(程式),讀完之後,就開始操作(執行)了,活人的大腦(CPU)按照菜譜(程式)的指令,一步一步照做,這是執行過程,這個過程並不等同於菜譜本身。
很明顯,即使菜譜(程式)只有一個,一個活人(電腦)可以執行這個菜譜(程式)N多次,每一次之間很獨立,沒什麼干擾。
上面說過,程序是作業系統獨有的,執行緒不是。
在很久很久以前,有一些奴隸,他們存在的唯一目的就做蛋炒飯,所以他們醒來第一件事就是按照上面的菜譜來做蛋炒飯,不停地做,不斷地做,除了做蛋炒飯他們什麼都不做。在那個時代,奴隸(其實就是電腦)是沒有程序的概念的,或者說,他們只有一個程序,就是重複做蛋炒飯。
但是到了現代,沒有奴隸了,人類生活方式變了,他們除了做蛋炒飯還要生活,他們還要看電視、打電話、喝啤酒,而且他們喜歡這些事情混著一起來做,比如一邊做蛋炒飯一邊打電話,打電話的指令是這樣:
活人的大腦(CPU)要能夠同時處理做蛋炒飯和打電話兩件事情,就需要在兩套指令之間切換,所以人腦(CPU)需要進化一點,然後人腦的思維方式(作業系統)也要進化一點,讓自己能夠在兩套指令之間切換,這就是程序出現的意義——可以讓多個指令序列同時執行,互相儘量不要干擾。
可是有些指令其實不可避免有些相互關聯,比如做蛋炒飯,我們再來看:
其實第5條和第6-7條可以部分先後來做的,要是非要幹完第5條再幹第6條那就傻了,所以,實際上這套指令有兩條線。
第一條線:
第二條線:
第二條線隨便什麼時候執行,但是第一條線執行到6的時候,必須要等到第二條線執行完才可以繼續。
可以想象,一個人在做蛋炒飯(程序執行)過程中,能夠並行做飯和準備雞蛋,效率更高,這也就是在程序之外引入執行緒的意義。
很明顯,執行緒之間,要比程序之間共享更多的東西,你在做蛋炒飯的操作之間的關聯度,肯定比你做蛋炒飯同時打電話的關聯度更高。
作業系統可以直接支援執行緒,但是有的程式設計平臺支援不讓作業系統知道的前提下實現執行緒,這個我也不知道怎麼打比方,你先知道這麼回事,等學明白進城執行緒的用法之後再瞭解不遲。
能,就像上面我的比喻一樣。
程序是作業系統才有的概念,執行緒可以是作業系統級別的概念,也可以不是。
任何比喻都會一定程度上的不準確,不過,我還是用比喻來說明吧,當然,很可能你只有真的感受到程序和執行緒是啥子東西之後,才能理解這些比喻。
程式是一個二進位制的檔案,cpu 讀取這個二進位制檔案來執行用高階程式語言編出來的程式碼,也算是程式,但並不是二進位制檔案,而是可以編譯成可執行檔案,有的高階程式語言是解釋執行的,從頭到尾你都看不見二進位制檔案,所以,程式可以看成是一組指令,這些指令可能是二進位制(機器指令),也可以不是二進位制(比如bash),按照這個指令來做就可以完成某些任務。
打個比方,程式就是一個菜譜:
把鍋燒熱放入食用油等待食用油變熱放入剩飯(2碗)加熱剩飯打雞蛋(2個)雞蛋裡放鹽把雞蛋倒在鍋裡炒飯直到每一粒飯都沾著蛋把鍋裡的食物倒出來上面是做蛋炒飯的建議菜譜,你也可以理解為一個程式,寫在紙上,誰都可以照做去做蛋炒飯。
執行緒和程序好像也是個程式 那他們之間在計算機中是怎麼執行的呢?執行緒和程序是程式的“執行過程”。
參照上面蛋炒飯的例子,現在菜譜(程式)寫在紙上(硬盤裡),一個活人(電腦)開始讀這個菜譜(程式),讀完之後,就開始操作(執行)了,活人的大腦(CPU)按照菜譜(程式)的指令,一步一步照做,這是執行過程,這個過程並不等同於菜譜本身。
很明顯,即使菜譜(程式)只有一個,一個活人(電腦)可以執行這個菜譜(程式)N多次,每一次之間很獨立,沒什麼干擾。
執行緒和程序是作業系統才獨有的嗎?上面說過,程序是作業系統獨有的,執行緒不是。
在很久很久以前,有一些奴隸,他們存在的唯一目的就做蛋炒飯,所以他們醒來第一件事就是按照上面的菜譜來做蛋炒飯,不停地做,不斷地做,除了做蛋炒飯他們什麼都不做。在那個時代,奴隸(其實就是電腦)是沒有程序的概念的,或者說,他們只有一個程序,就是重複做蛋炒飯。
但是到了現代,沒有奴隸了,人類生活方式變了,他們除了做蛋炒飯還要生活,他們還要看電視、打電話、喝啤酒,而且他們喜歡這些事情混著一起來做,比如一邊做蛋炒飯一邊打電話,打電話的指令是這樣:
撥通電話吹牛逼結束通話電話活人的大腦(CPU)要能夠同時處理做蛋炒飯和打電話兩件事情,就需要在兩套指令之間切換,所以人腦(CPU)需要進化一點,然後人腦的思維方式(作業系統)也要進化一點,讓自己能夠在兩套指令之間切換,這就是程序出現的意義——可以讓多個指令序列同時執行,互相儘量不要干擾。
可是有些指令其實不可避免有些相互關聯,比如做蛋炒飯,我們再來看:
把鍋燒熱放入食用油等待食用油變熱放入剩飯(2碗)加熱剩飯打雞蛋(2個)雞蛋裡放鹽把雞蛋倒在鍋裡炒飯直到每一粒飯都沾著蛋把鍋裡的食物倒出來其實第5條和第6-7條可以部分先後來做的,要是非要幹完第5條再幹第6條那就傻了,所以,實際上這套指令有兩條線。
第一條線:
把鍋燒熱放入食用油等待食用油變熱放入剩飯(2碗)加熱剩飯把雞蛋倒在鍋裡炒飯直到每一粒飯都沾著蛋把鍋裡的食物倒出來第二條線:
打雞蛋(2個)雞蛋裡放鹽第二條線隨便什麼時候執行,但是第一條線執行到6的時候,必須要等到第二條線執行完才可以繼續。
可以想象,一個人在做蛋炒飯(程序執行)過程中,能夠並行做飯和準備雞蛋,效率更高,這也就是在程序之外引入執行緒的意義。
很明顯,執行緒之間,要比程序之間共享更多的東西,你在做蛋炒飯的操作之間的關聯度,肯定比你做蛋炒飯同時打電話的關聯度更高。
作業系統可以直接支援執行緒,但是有的程式設計平臺支援不讓作業系統知道的前提下實現執行緒,這個我也不知道怎麼打比方,你先知道這麼回事,等學明白進城執行緒的用法之後再瞭解不遲。
如果沒有作業系統,程序和執行緒還能否表示出來?能,就像上面我的比喻一樣。