5. Mô hình thời gian chạy

Thời gian chạy CPython là bộ máy tồn tại sau khi quá trình bắt đầu và trước khi mã Python kết thúc quá trình thực thi. Nó sở hữu trạng thái trình thông dịch, trạng thái luồng, mô-đun, nội dung, bộ cấp phát bộ nhớ, trạng thái ngoại lệ, trạng thái nhập, khung, cuộc gọi đang chờ xử lý, xử lý tín hiệu và hành vi tắt máy.

Một chương trình Python dường như chạy dưới dạng một chuỗi các câu lệnh. CPython chạy nó bên trong hệ thống thời gian chạy theo lớp.```text operating system process CPython runtime interpreter state thread state frame stack executing code object bytecode instructions object operations


## 5.1 Quy trình, Thời gian chạy, Trình thông dịch, Chủ đề, Khung

Mt chương trình CPython đang chy có mt s đơn v thc thi lng nhau.

| Đơn v | Ý nghĩa |
| ------------ | ----------------------------------------------------------------------------------- |
| Quy trình | Quá trình h điu hành cha thi gian chy nhúng hoc thc thi CPython |
| Thi gian chy | Trng thái CPython toàn cu được chia s trong sut quá trình |
| Thông dch viên | Trng thái trình thông dch Python b cô lp bên trong thi gian chy |
| Trng thái ch đề | Trng thái thc thi trên mi lung cho mt trình thông dch |
| Khung | Mt bi cnh thc thi tích cc |
| Đối tượng mã | Mã byte và siêu d liu được biên dch |
| Đối tượng | Giá tr thi gian chy được thao tác bng mã byte |

Mt kch bn đơn gin:```python
x = 1
print(x + 2)
```chy bên trong mt khung. Khung đó thuc v trng thái lung. Trng thái lung thuc v mt trình thông dch. Trình thông dch thuc v thi gian chy CPython.

V mt khái nim:```text
_PyRuntimeState
    PyInterpreterState
        PyThreadState
            PyFrameObject or internal frame
                PyCodeObject
                locals
                globals
                builtins
                value stack
```Cu trúc C chính xác thay đổi gia các phiên bn, nhưng h thng phân cp đủ n định để hướng dn vic đọc ngun.

## 5.2 Thời gian chạy

Thi gian chy là trng thái CPython trên toàn quy trình.

Nó bao gm các dch v toàn cu được s dng bi mt hoc nhiu phiên dch viên:```text
runtime initialization state
memory allocator state
interpreter list
GIL state
pending calls
signal handling state
audit hook state
global caches
runtime finalization flags
``` mc độ cao, thi gian chy tr li:```text
Has CPython been initialized?
Which interpreters exist?
Is the runtime finalizing?
Which global locks and services are active?
Which process-wide hooks are installed?
```Điu này quan trng nht trong quá trình khi động, tt máy, nhúng, trình thông dch ph và hot động phân lung t do.

Mt tp lnh Python bình thường thường có mt thi gian chy và mt trình thông dch chính.

## 5.3 Trạng thái thông dịch viên

Trng thái trình thông dch đại din cho mt trình thông dch Python bên trong quy trình.

Nó s hu trng thái cp độ ngôn ng như:```text
modules dictionary
builtins
import state
sys module state
codec state
warnings state
garbage collector state
interned strings
per-interpreter caches
execution configuration
```V mt khái nim:```text
PyInterpreterState
    modules
    builtins
    sysdict
    import machinery
    gc generations
    codec registry
    pending async exception state
```Hu hết các chương trình Python ch s dng trình thông dch chính.

Trình thông dch ph to các trng thái thông dch viên b sung trong cùng mt quy trình. Chúng có th có các t đin mô-đun và trng thái thi gian chy riêng bit, nhưng chúng vn chia s mt s tài nguyên  cp quy trình.

## 5.4 Trạng thái chủ đề

Mi lung h điu hành thc thi mã Python cn có trng thái lung.

Trng thái lung lưu tr thông tin thc thi cho mt lung trong mt trình thông dch:```text
current frame
current exception state
recursion depth
profiling function
tracing function
async exception request
thread-local interpreter data
```Trng thái lung kết ni thc thi gc vi thc thi Python.

V mt khái nim:```text
current OS thread
    PyThreadState
        current interpreter
        current frame
        exception information
        tracing and profiling hooks
```Khi mã C cn đưa ra mt ngoi l, truy cp khung hin ti hoc tương tác vi API Python, nó thường cn trng thái lung hin ti.

## 5,5 khung hình

Mt khung là mt bn ghi thc thi.

CPython to mt khung khi nó thc thi phn thân mô-đun, phn thân hàm, phn thân lp, trình to, coroutine hoc phn hiu.

Mt khung cha:```text
code object
globals dictionary
builtins dictionary
locals storage
value stack
instruction pointer
block and exception state
line number state
owner information
```Đối vi mt chc năng:```python
def add(a, b):
    c = a + b
    return c
```đang gi đin`add(2, 3)`to khung cho cuc gi đó.

Các ca hàng khung:```text
code object for add
a = 2
b = 3
c after assignment
temporary stack values
current bytecode offset
globals of the defining module
builtins visible to the function
```Khung là đối tượng thi gian chy c th giúp thc hin lnh gi hàm.

## 5.6 Đối tượng mã

Mt đối tượng mã được biên dch ni dung thc thi.

Đó là siêu d liu bt biến cng vi mã byte. Nó không lưu tr các giá tr hin ti ca các biến cc b.

Ví d:```python
def f(x):
    y = x + 1
    return y
```Đối tượng hàm có mt đối tượng mã:```python
code = f.__code__

print(code.co_name)
print(code.co_varnames)
print(code.co_consts)
```Đối tượng mã cho biết cách thc thi hàm. Khung lưu tr mt ln thc thi đang hot động ca mã đó.

S khác bit này quan trng:```text
code object: reusable compiled program
frame: one running invocation of that program
function: callable object that wraps code with globals, defaults, and closure
```Nhiu lnh gi đến cùng mt hàm s dng li cùng mt đối tượng mã nhưng to các khung riêng bit.

## 5.7 Đối tượng hàm

Đối tượng hàm Python bao bc mt đối tượng mã bng ng cnh thi gian chy.

Nó cha:```text
code object
globals dictionary
defaults
keyword-only defaults
closure cells
annotations
function name
qualified name
module name
dict for custom attributes
```Ví d:```python
x = 10

def f(y):
    return x + y
```chc năng`f`cn nhiu hơn mã byte. Nó cũng cn t đin toàn cu nơi`x`có th được tìm thy.

V mt khái nim:```text
PyFunctionObject
    func_code      code for f
    func_globals   module globals
    func_defaults  default argument values
    func_closure   captured cells
```Vic gi hàm s to mt khung bng cách s dng các thành phn này.

## 5.8 Đối tượng và kiểu

Khi chy, mã byte x lý các tham chiếu đối tượng.

Mi giá tr Python đều là mt đối tượng:```python
42
"hello"
[1, 2, 3]
{"a": 1}
lambda x: x + 1
Exception("bad")
```Mi đối tượng có mt loi.

Loi xác định hành vi:```text
allocation
deallocation
attribute lookup
method lookup
call behavior
numeric operations
sequence operations
mapping operations
iteration
representation
hashing
comparison
```Ví d:```python
len(x)
```không trc tiếp kim tra mi cách b trí đối tượng có th. Nó hi loi đối tượng có độ dài hot động như thế nào.

Đây là lý do ti sao mô hình thi gian chy ph thuc vào loi đối tượng. Hướng dn mã byte là chung chung. Các khe loi cung cp hành vi c th.

## 5.9 Không gian tên

Vic thc thi Python s dng không gian tên.

Các loi không gian tên chính là:

| Không gian tên | Sao lưu lưu tr |
| ----------------- | ------------------------------------------------- |
| Người dân địa phương | Chc năng cc b nhanh, không gian tên lp hoc ánh x |
| Toàn cu | T đin mô-đun |
| Ni dung | T đin dng sn |
| Thuc tính đối tượng | Lnh chính t, v trí, b mô t, tra cu kiu |
| Thuc tính mô-đun | T đin mô-đun |

Đối vi mã này:```python
x = 1

def f():
    return x + len([1, 2])
```bên trong`f`, CPython gii quyết:```text
x     global name in module dictionary
len   builtin name if not found in globals
[1,2] newly created list object
```Độ phân gii tên ph thuc vào phân loi thi gian biên dch và tra cu không gian tên thi gian chy.

## 5.10 Người dân địa phương nhanh

Các biến cc b ca hàm thường được lưu tr theo b cc ging như mng được ti ưu hóa, không phi tra cu t đin thông thường cho mi ln truy cp.

Đối vi mt chc năng:```python
def f(a, b):
    c = a + b
    return c
```trình biên dch biết tên địa phương:```text
a
b
c
```Khung có th lưu tr chúng trong các khe được lp ch mc.

Bytecode sau đó có th s dng các hot động cc b nhanh:```text
LOAD_FAST a
LOAD_FAST b
STORE_FAST c
```Vic này nhanh hơn tra cu t đin.

T đin địa phương có th được c th hóa khi cn thiết, ví d bng cách`locals()`, truy tìm, g li hoc kim tra khung. Nhưng đường dn thc thi thông thường s dng cc b nhanh.

## 5.11 Ngăn xếp giá trị

Mã byte CPython s dng máy xếp chng.

Hướng dn đẩy và bt các giá tr tm thi t ngăn xếp giá tr ca khung.

Vì:```python
z = x + y
```vic thc hin khái nim là:```text
LOAD_FAST x       push x
LOAD_FAST y       push y
BINARY_OP +       pop x and y, push result
STORE_FAST z      pop result into local z
```Ngăn xếp giá tr là nơi lưu tr thc thi tm thi. Nó tách bit vi các biến cc b.

Do đó, mt khung cha c hai:```text
local variable storage
value stack for intermediate operations
```Điu này gii thích ti sao mã byte có th nh gn. Hướng dn giao tiếp thông qua ngăn xếp.

## 5.12 Cuộc gọi

Lnh gi hàm là mt trong nhng hot động thi gian chy quan trng nht.

Vì:```python
result = f(1, 2)
```CPython phi:```text
evaluate f
evaluate arguments
prepare call layout
check callable type
create or enter callable execution
bind arguments
execute body or C function
return result
```Các đối tượng có th gi khác nhau có đường dn khác nhau:

| Có th gi được | Đường dn thi gian chy |
| ---------------------- | ------------------------------------------ |
| Hàm Python | To khung và thc thi đối tượng mã |
| Chc năng tích hp | Gi trình bao bc hàm C |
| Phương pháp | Liên kết người nhn và gi hàm cơ bn |
| Lp | Phân b và khi to phiên bn |
| Đối tượng vi`__call__`| Gi loi khe gi |

CPython đã ti ưu hóa các quy ước gi để gim vic phân b t đin và b d liu tm thi. CPython hin đại s dng các đường dn cuc gi nhanh như vectorcall cho nhiu loi có th gi được.

## 5.13 Ngoại lệ

Ngoi l là trng thái thi gian chy cng vi lung điu khin.

Khi mã Python tăng:```python
raise ValueError("bad")
```CPython ghi li thông tin ngoi l  trng thái lung hin ti và bt đầu thc hin tháo g.

Hàm C thường báo li bng cách:```text
setting an exception
returning NULL or -1
```Người gi kim tra giá tr tr v và truyn bá li.

V mt khái nim:```c
PyErr_SetString(PyExc_ValueError, "bad");
return NULL;
``` cp độ bytecode, các ngoi l nh hưởng đến:```text
current frame
exception table
stack unwinding
finally blocks
except matching
traceback construction
propagation to caller
```Các ngoi l không phi là giá tr tr v thông thường. Chúng là mt đường dn điu khin riêng bit trong sut thi gian chy.

## 5.14 Truy nguyên

Truy nguyên ghi li nơi ngoi l đã di chuyn.

Khi mt ngoi l lan truyn qua các khung, CPython có th đính kèm các mc truy nguyên xác định:```text
file name
function name
line number
bytecode position
frame
```Ví d:```python
def a():
    b()

def b():
    1 / 0

a()
```Truy nguyên cha chui cuc gi:```text
module frame
a frame
b frame
```Du vết là đối tượng. Vic gi du vết có th gi cho khung hình tn ti. Gi khung có th gi cho các biến cc b tn ti. Điu này rt quan trng đối vi hành vi b nh.

## 5.15 Mô-đun

Mô-đun là mt đối tượng có không gian tên.

Khi CPython nhp mt mô-đun, nó s to hoc truy xut mt đối tượng mô-đun và thc thi mã trong t đin ca mô-đun đó.

V mt khái nim:```text
find module spec
create module object
insert into sys.modules
execute module code in module namespace
return module object
```T đin mô-đun tr thành không gian tên chung cho các hàm được xác định trong mô-đun đó.

Vì:```python
# example.py
x = 10

def f():
    return x
```chc năng`f`lưu tr mt tham chiếu đến t đin toàn cu ca mô-đun. Khi`f`nhìn lên`x`, nó s tìm kiếm t đin đó.

## 5.16`sys.modules`

`sys.modules`là b đệm nhp.

Nó ánh x tên mô-đun ti các đối tượng mô-đun.```python
import sys
print(sys.modules["sys"])
```B đệm này ngăn vic nhp lp li thc thi li cùng mt mô-đun.

Nhp cùng mt mô-đun hai ln thường tr v mô-đun đã được ti:```python
import math
import math
```Kim tra nhp khu th hai`sys.modules`và tái s dng mô-đun.

B đệm này cũng x lý vic nhp vòng tròn. Mt mô-đun có th xut hin trong`sys.modules`trước khi mã ca nó thc thi xong.

## 5.17 Nội dung

Ni dung là tên có sn khi tra cu cc b và toàn cu không thành công.

Ví d:```python
len
print
range
object
type
Exception
```Mt khung có quyn truy cp vào mt t đin dng sn.

Tra cu tên cho mt tên không đủ tiêu chun bên trong mt hàm đại khái như sau:```text
locals
globals
builtins
```Vì thế:```python
def f(xs):
    return len(xs)
```thường gii quyết`len`t ni dung tr khi có tên toàn cu`len`ph bóng lên nó.

Đường dn tra cu này là mt phn ca mô hình thi gian chy. Nó gii thích ti sao vic gán mt tên toàn cc`len`thay đổi hành vi bên trong mô-đun.

## 5.18 Bộ mô tả và quyền truy cập thuộc tính

Quyn truy cp thuc tính là công văn thi gian chy.

Vì:```python
obj.name
```CPython không ch nhìn vào bên trong`obj.__dict__`.

Nó tuân theo các quy tc tra cu mô t và kiu:```text
look on type for data descriptor
look in instance dictionary
look on type for non-data descriptor or class attribute
call __getattr__ if needed
raise AttributeError if missing
```Đây là lý do ti sao các phương thc liên kết t động:```python
class C:
    def f(self):
        return 1

c = C()
m = c.f
```Đối tượng hàm được lưu tr trên lp là mt b mô t. Vic truy cp nó thông qua mt phiên bn s to ra mt phương thc b ràng buc hoc mt đường dn cuc gi tương đương được ti ưu hóa.

Tra cu thuc tính kết ni b cc đối tượng, loi đối tượng, b mô t, lnh gi phương thc và hiu sut.

## 5.19 Lặp lại

Lp li s dng mt giao thc thi gian chy nh.

Vì:```python
for x in obj:
    body(x)
```CPython thc hin đại khái:```text
iterator = iter(obj)
loop:
    x = next(iterator)
    if StopIteration: exit loop
    execute body
``` cp độ C, điu này ánh x ti các v trí loi và trình tr giúp giao thc.

Đối tượng iterator lưu tr trng thái lp. Đối vi trình vòng lp danh sách, trng thái đó bao gm danh sách và ch mc hin ti. Đối vi mt trình to, trình vòng lp chính là khung thc thi b treo.

Giao thc chung này có quyn hn:```text
for loops
comprehensions
tuple unpacking
list()
sum()
any()
all()
many standard library functions
```## 5.20 Trình tạo và Coroutine

Máy phát đin là mt khung treo.

Vì:```python
def gen():
    yield 1
    yield 2
```đang gi đin`gen()`không thc hin ngay cơ th. Nó to ra mt đối tượng máy phát đin.

Trình to s hu trng thái thc thi:```text
code object
suspended frame or frame-like state
instruction position
local variables
exception state
running flag
```Đang gi`next()`tiếp tc thc hin cho đến ln tiếp theo`yield`hoc quay tr li.

Coroutine và trình to async m rng ý tưởng này bng hành vi giao thc có th ch đợi và tích hp vòng lp s kin.

## 5.21 Quản lý bộ nhớ

Thi gian chy qun lý b nh  nhiu lp.```text
raw memory allocator
object allocator
type-specific free lists or caches
reference counting
cyclic garbage collector
```Vic đếm tham chiếu x lý hu hết các s kin trong đời:```text
new reference increases lifetime
decref releases ownership
zero refcount triggers deallocation
```Trình thu gom rác tun hoàn x lý các chu k đối tượng không th truy cp được.

Qun lý b nh là mt phn ca hành vi thi gian chy vì vic hy đối tượng có th thc thi mã thông qua b hoàn thin, lnh gi li đim yếu hoc đường dn gii phóng để gii phóng nhiu đối tượng hơn.

## 5.22 GIL trong Mô hình thời gian chạy

Trong thi gian chy CPython truyn thng, Khóa phiên dch toàn cu bo v vic thc thi mã byte Python và nhiu cu trúc d liu ni b.

GIL đơn gin hóa:```text
reference count updates
object mutation invariants
interpreter state access
C extension assumptions
```Mt lung phi gi GIL để thc thi mã byte Python.

Các tin ích m rng C có th gii phóng GIL xung quanh vic chn hoc tác phm gc chy lâu dài, sau đó ly li GIL trước khi chm li vào các đối tượng Python.

Do đó, mô hình thi gian chy có hai lp đồng thi:```text
OS threads may run concurrently
Python bytecode execution is serialized by the GIL in traditional builds
```CPython hin đại cũng có công vic xây dng theo lung t do, điu này làm thay đổi nhiu gi định ni b. Nhưng mô hình GIL truyn thng vn cn thiết để hiu mã và phn m rng hin có.

## 5.23 Khởi tạo

Trước khi mã Python chy, CPython khi to thi gian chy.

Khi động bao gm:```text
configure memory allocators
initialize runtime state
create main interpreter
create main thread state
initialize builtins
initialize sys
set up import machinery
initialize encodings
configure paths
process command-line options
run startup hooks
execute requested code
```Đây là lý do ti sao mã khi động li phc tp. Nhiu mô-đun ph thuc vào các mô-đun khác đã tn ti nhưng bn thân h thng nhp cũng cn h tr thi gian chy.

CPython t khi động cn thn.

## 5.24 Tắt máy

Tt máy cũng phc tp.

Vic hoàn thin có th bao gm:```text
running atexit handlers
flushing standard streams
clearing modules
destroying interpreter state
collecting garbage
finalizing objects
releasing memory
tearing down runtime services
```Các đối tượng có th chy trình hoàn thin trong khi tt máy, nhưng toàn cu mô-đun ca chúng có th đã b xóa. Đây là lý do ti sao li tt máy có th rt tinh vi.

Mt công c hoàn thin mong đợi`sys`, `os`hoc mt mô-đun khác có sn đầy đủ có th b li trong quá trình phân tích trình thông dch.

## 5.25 Python nhúng

CPython có th được nhúng bên trong mt chương trình C hoc C++ khác.

Trong trường hp đó, quy trình máy ch s kim soát vic khi to và hoàn thin thi gian chy.

V mt khái nim:```c
Py_Initialize();
/* run Python code */
Py_Finalize();
```Vic nhúng làm cho h thng phân cp thi gian chy hin th rõ ràng hơn. Thi gian chy CPython tn ti bên trong mt quy trình có th có các lung, b cp phát, vòng lp s kin, h thng ghi nht ký và quy tc tt máy riêng.

Mã nhúng phi tôn trng:```text
initialization order
thread state management
GIL rules
reference ownership
exception handling
finalization constraints
```## 5.26 Trạng thái thời gian chạy và khả năng quan sát

Python hin th các phn ca thi gian chy thông qua các mô-đun tiêu chun.

| Mô-đun | Xem thi gian chy |
| ------------- | ------------------------------------------------------ |
|`sys`| Cài đặt thông dch, mô-đun, đường dn, khung, s tin hoàn li |
|`gc`| Nhà nước thu gom rác |
|`inspect`| Khung, chc năng, ngun, ch ký |
|`dis`| Mã byte |
|`types`| Đối tượng loi thi gian chy |
|`threading`| Tóm tt lung Python |
|`tracemalloc`| Du vết phân b |
|`importlib`| Nhp khu máy móc |

Ví d:```python
import sys
import gc
import inspect

print(sys.modules.keys())
print(gc.get_count())
print(inspect.currentframe())
```Các mô-đun này rt hu ích vì chúng cho phép bn quan sát cu trúc thi gian chy mà không cn đọc mã C ngay lp tc.

## 5.27 Bản phác thảo thực thi hoàn chỉnh

Đối vi chương trình này:```python
def add(a, b):
    return a + b

print(add(2, 3))
```CPython đại khái thc hin:```text
initialize runtime
create main interpreter
create main thread state
load builtins and sys
compile module source to code object
create module frame
execute module bytecode

define function:
    create code object for add
    create function object
    bind name add in module globals

call print(add(2, 3)):
    load print from builtins
    load add from globals
    load constants 2 and 3
    call add
        create frame for add
        bind a = 2, b = 3
        load a
        load b
        perform binary addition through object protocol
        return integer result
    call print
        execute built-in C function
        write output
    discard return value

finish module frame
run shutdown sequence
```Đây là mô hình thi gian chy đang hot động.

## 5.28 Mô hình tinh thần làm việc

Gi mô hình nh gn này trong khi đọc các chương sau:```text
A process owns a CPython runtime.
The runtime owns interpreters.
An interpreter owns modules, builtins, import state, and GC state.
A thread state owns the current execution state for one thread.
A frame runs one code object.
Bytecode instructions operate on a value stack and local storage.
Objects carry type pointers.
Types define behavior through slots.
Errors use exception state plus sentinel returns.
Memory is managed by reference counting plus cyclic GC.
```Mô hình này kết ni hu hết các b phn bên trong CPython.

## 5.29 Tóm tắt chương

Thi gian chy CPython là mt h thng thc thi theo lp. Quá trình này cha mt thi gian chy. Thi gian chy cha các trng thái thông dch viên. Mi lung thc thi có mt trng thái lung. Mi cuc gi đang hot động đều có mt khung. Mi khung chy mt đối tượng mã. Bytecode thao tác các tham chiếu đối tượng. Các đối tượng tr đến các loi. Các loi xác định hành vi.

Hiu được h thng phân cp này làm cho phn còn li ca CPython d đọc hơn. Khi động, nhp, gi hàm, ngoi l, to, thu gom rác và tt máy đều phù hp vi cùng mt mô hình thi gian chy.