偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺析Python虛擬機(jī)執(zhí)行框架

開發(fā) 后端
下面的文章大家即將看到Python虛擬機(jī)的整體執(zhí)行框架,大家還可以看到Python虛擬機(jī)在執(zhí)行過程中不斷使用的執(zhí)行環(huán)境。

Python虛擬機(jī)中一個(gè)最核心的概念,在Python語言中,一切都是對(duì)象,也就是說一個(gè)整數(shù)就是一個(gè)對(duì)象,一個(gè)字符串也是一個(gè)對(duì)象,其實(shí)類型也是一種對(duì)象,整數(shù)類型是一個(gè)對(duì)象。

了解這兩點(diǎn)對(duì)掌握第二部分的內(nèi)容已經(jīng)足夠了。但是,虛擬機(jī)和執(zhí)行環(huán)境還僅僅是Python運(yùn)行機(jī)理(或者說運(yùn)行模型)的一部分,為了對(duì)Python整個(gè)的運(yùn)行機(jī)理做一個(gè)全面的了解,我們還需要大致了解一下Python的運(yùn)行時(shí)環(huán)境。

前面我們說了,PyFrameObject對(duì)應(yīng)于可執(zhí)行文件在執(zhí)行時(shí)的棧幀,但是一個(gè)可執(zhí)行文件要在操作系統(tǒng)中運(yùn)行,只有棧幀是不夠的。之前我們遺漏了兩個(gè)對(duì)于可執(zhí)行文件運(yùn)行至關(guān)重要的概念:進(jìn)程和線程。

在本節(jié)中,我們首先要對(duì)Python的運(yùn)行模型(主要是線程模型)進(jìn)行一個(gè)整體概念上的了解,雖然這部分內(nèi)容我們會(huì)留到剖析Python的多線程實(shí)現(xiàn)時(shí)再詳細(xì)考察。但是由于Python虛擬機(jī)在初始化時(shí)會(huì)創(chuàng)建一個(gè)主線程。

所以其運(yùn)行時(shí)環(huán)境中存在一個(gè)主線程,而且本部分將剖析的Python的異常機(jī)制會(huì)利用到Python內(nèi)部的線程模型,因此對(duì)Python線程模型有一個(gè)整體概念上的了解也是必須的。以Win32平臺(tái)為例,我們知道,對(duì)于原生的Win32可執(zhí)行文件,無論是由C/C++產(chǎn)生,還是由Delphi產(chǎn)生,都會(huì)在一個(gè)進(jìn)程(Process)中運(yùn)行。

進(jìn)程并非是與機(jī)器指令序列相對(duì)應(yīng)的活動(dòng)對(duì)象,這個(gè)與可執(zhí)行文件中機(jī)器指令序列對(duì)應(yīng)的活動(dòng)對(duì)象是由線程(Thread)這個(gè)概念來進(jìn)行抽象的,而進(jìn)程則是線程的活動(dòng)環(huán)境。對(duì)于通常的單線程可執(zhí)行文件,在執(zhí)行時(shí)操作系統(tǒng)會(huì)創(chuàng)建一個(gè)進(jìn)程,在進(jìn)程中,又會(huì)有一個(gè)主線程;而對(duì)于多線程的可執(zhí)行文件,在執(zhí)行時(shí)會(huì)操作系統(tǒng)會(huì)創(chuàng)建一個(gè)進(jìn)程和多個(gè)線程。

該多個(gè)線程能共享進(jìn)程地址空間中的全局變量,這就自然而然地引出了線程同步的問題。CPU對(duì)任務(wù)的切換實(shí)際上是在線程之間切換,在切換任務(wù)時(shí),CPU需要執(zhí)行線程環(huán)境的保存工作,而在切換至新的線程之后,需要恢復(fù)該線程的線程環(huán)境。

這些關(guān)于程序運(yùn)行的概念同樣適用于Python,Python實(shí)現(xiàn)了對(duì)多線程的支持,而且Python中的一個(gè)線程就是操作系統(tǒng)上的一個(gè)原生線程。這里我們對(duì)多線程機(jī)制不過多深入,現(xiàn)在只需記住,Python在執(zhí)行時(shí),可能會(huì)有多個(gè)線程存在。

在前面我們看到了虛擬機(jī)的大致運(yùn)行框架,實(shí)際上這個(gè)虛擬機(jī)就是Python中對(duì)CPU的抽象,可以看做是一個(gè)軟CPU,Python中的所有線程都使用這個(gè)軟CPU來完成計(jì)算工作。真實(shí)機(jī)器上的任務(wù)切換機(jī)制對(duì)應(yīng)到Python中。

就是使不同的線程輪流使用虛擬機(jī)的機(jī)制。CPU切換任務(wù)時(shí)需要保存線程運(yùn)行環(huán)境。對(duì)于Python來說,在切換線程之前,同樣需要保存關(guān)于當(dāng)前線程的信息。在Python中,這個(gè)關(guān)于線程狀態(tài)信息的抽象是通過PyThreadState對(duì)象來實(shí)現(xiàn)的,一個(gè)線程將擁有一個(gè)PyThreadState對(duì)象。

所以從另一種意義來說,這個(gè)PyThreadState對(duì)象也可以看成是對(duì)線程本身的抽象。但實(shí)際上,這兩者是有很大區(qū)別的,PyThreadState并非是對(duì)線程本身的模擬,因?yàn)?FONT size=+0>Python中的線程仍然使用操作系統(tǒng)的原生線程。

PyThreadState僅僅是對(duì)線程狀態(tài)的抽象,不過在本書的大部分章節(jié)中,為了敘述的方便,我們不過分嚴(yán)格地區(qū)分線程和線程狀態(tài)本身。所以在以后我們有時(shí)會(huì)稱PyThreadState為線程對(duì)象,有時(shí)會(huì)稱之為線程狀態(tài)對(duì)象。只有在剖析多線程機(jī)制時(shí),我們會(huì)嚴(yán)格區(qū)分兩者。對(duì)于下面將提到的PyInterpreterState對(duì)象,也有類似的考量。

剛才提到,在Win32下,線程是不能獨(dú)立存活的,它需要存活在進(jìn)程的環(huán)境中,而多個(gè)線程可以共享進(jìn)程的一些資源。在Python中同樣也是如此,考慮一下,如果Python程序中有兩個(gè)線程,都會(huì)進(jìn)行同樣的一個(gè)動(dòng)作——import sys,那么這個(gè)sys module究竟應(yīng)該存在幾份?

是全局共享的還是每個(gè)線程都有一個(gè)sys module?如果每個(gè)線程有自己獨(dú)立module集合,那么Python對(duì)內(nèi)存的消耗就會(huì)顯得非常驚人。所以在Python中,這些module都是全局共享的,仿佛這些module都是進(jìn)程中的共享資源一樣,對(duì)于進(jìn)程這個(gè)抽象概念,Python以PyInterpreterState對(duì)象來實(shí)現(xiàn)。

在Win32下,通常都會(huì)有多個(gè)進(jìn)程,而Python實(shí)際上也可以有多個(gè)邏輯上的interpreter存在。在通常的情況下,Python中只有一個(gè)interpreter。這個(gè)interpreter中維護(hù)了一個(gè)或多個(gè)PyThreadState對(duì)象,與這些PyThreadState對(duì)象對(duì)應(yīng)的線程輪流使用一個(gè)字節(jié)碼執(zhí)行引擎??矗遣皇桥c真實(shí)機(jī)器上的程序執(zhí)行模型非常相似?

談到多線程,就不能不談到線程同步。在Python虛擬機(jī)中,是通過一個(gè)全局解釋器鎖GIL(Global Interpreter Lock)來實(shí)現(xiàn)線程同步的,關(guān)于這部分內(nèi)容,我們留到剖析Python多線程機(jī)制時(shí)再詳細(xì)考察。

好了,現(xiàn)在討論剛才提到的那兩個(gè)關(guān)鍵對(duì)象:表示進(jìn)程概念的PyInterpreterObject對(duì)象和表示線程概念的PyThreadState對(duì)象。

【編輯推薦】

  1. 有關(guān)Python系統(tǒng)文件進(jìn)行介紹指導(dǎo)
  2. 如何正確的使用Python函數(shù)
  3. 對(duì)Python 構(gòu)建工具進(jìn)行詳細(xì)介紹分析
  4. PythonAndroid淺析Python優(yōu)勢所在
  5. 如何使用Python模塊解析配置文件?
責(zé)任編輯:chenqingxiang 來源: CSDN
相關(guān)推薦

2009-06-19 15:38:43

Java虛擬機(jī)

2018-04-04 15:05:17

虛擬機(jī)字節(jié)碼引擎

2012-05-18 10:22:23

2013-07-17 09:32:58

2010-07-26 09:02:38

2024-09-30 16:08:43

Python虛擬機(jī)棧幀

2019-03-19 15:30:42

程序員JVM虛擬機(jī)

2009-12-22 16:05:05

Linux操作系統(tǒng)

2010-02-26 15:28:15

Python虛擬機(jī)

2023-01-26 00:06:05

JAVA虛擬機(jī)優(yōu)化

2017-11-14 16:43:13

Java虛擬機(jī)線程

2009-06-18 13:51:07

Java虛擬機(jī)

2014-02-21 11:20:34

KVMXen虛擬機(jī)

2010-12-23 14:05:12

虛擬機(jī)

2023-09-03 17:05:20

虛擬機(jī)

2012-04-10 10:29:29

2020-01-17 10:52:37

無服務(wù)器容器技術(shù)

2010-02-24 10:49:11

Python運(yùn)行環(huán)境

2010-02-01 08:39:50

Linux虛擬機(jī)

2009-09-07 22:01:52

虛擬機(jī)安裝Linux系
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)