Cấp phát bộ nhớ là quá trình cấp phát bộ nhớ cho một chương trình máy tính. Trong Python, quá trình cấp phát và giải phóng bộ nhớ được xử lý tự động vì có một trình thu gom rác được tạo trong python để người dùng không phải xử lý quá trình thu gom rác
Thu gom rác thải
Đó là một quá trình trong đó bộ nhớ được giải phóng khi nó không được sử dụng để cung cấp không gian cho các đối tượng khác. Trong trường hợp không có ai tham chiếu đến đối tượng trong bộ nhớ thì trong máy ảo, trình thu gom rác sẽ hoạt động để tự động xóa đối tượng trong bộ nhớ heap
Đếm tham khảo
Đó là một thủ tục hoạt động bằng cách đếm số lần một đối tượng được tham chiếu bởi các đối tượng khác trong máy tính. Số lượng này cho một đối tượng bị giảm khi tham chiếu đến một đối tượng bị xóa. Và khi số này trở thành 0, thì đối tượng đó bị hủy bỏ
Ví dụ, trong trường hợp hai biến có cùng giá trị. Sau đó, máy ảo thay vì tạo hai đối tượng khác nhau, nó sẽ tạo hai con trỏ trỏ vào cùng một đối tượng được tạo trong vùng riêng tư
Thí dụ
b = 3 a = 6 b = 6 print[id[a] == id[b]]
đầu ra. Thật
Cấp phát bộ nhớ trong Python
Có hai phần của bộ nhớ
- ngăn xếp bộ nhớ
- bộ nhớ đống
Các lệnh gọi hàm và các tham chiếu được lưu trữ trong bộ nhớ ngăn xếp trong khi tất cả các đối tượng giá trị được lưu trữ trong bộ nhớ heap
Công việc của bộ nhớ ngăn xếp
Nó được gọi là cấp phát bộ nhớ ngăn xếp vì việc cấp phát xảy ra trong ngăn xếp lệnh gọi hàm. Tại thời điểm cấp phát, kích thước bộ nhớ được trình biên dịch biết và khi có lệnh gọi hàm xảy ra, thì biến của nó sẽ được cấp phát bộ nhớ trên ngăn xếp
Đó là bộ nhớ cần thiết bên trong một chức năng cụ thể. Khi hàm được gọi, nó sẽ được thêm vào ngăn xếp của lời gọi chương trình. Khởi tạo biến bên trong hàm được lưu trữ tạm thời trong ngăn xếp lệnh gọi hàm, nơi nó sẽ bị xóa sau khi hoàn thành hàm. Việc phân bổ bộ nhớ này vào bộ nhớ liền kề được xử lý bởi trình biên dịch, các nhà phát triển không phải lo lắng về điều đó
Thí dụ
def func[]: a = 10 b = "" c = {}
Công việc của bộ nhớ Heap
Cấp phát bộ nhớ heap được thực hiện khi bộ nhớ được cấp phát tại thời điểm thực hiện chương trình do lập trình viên viết. Vì có một đống không gian bộ nhớ có sẵn trong quá trình cấp phát và hủy cấp phát, đó là lý do tại sao nó được gọi là bộ nhớ heap. Biến được yêu cầu trên toàn cầu trong chương trình được lưu trữ trong bộ nhớ heap
Thí dụ
# This memory for 5 integers is allocated in the heap. arr = [0] * 5
Bài viết này đã cố gắng thảo luận Làm thế nào các biến được lưu trữ trong python – Stack hoặc Heap?. Hy vọng blog này giúp bạn hiểu khái niệm. Để thực hành nhiều vấn đề hơn, vui lòng kiểm tra MYCODE. Lập trình cạnh tranh tại Prepbytes
Hiểu về cấp phát bộ nhớ rất quan trọng đối với bất kỳ nhà phát triển phần mềm nào vì viết mã hiệu quả có nghĩa là viết mã hiệu quả về bộ nhớ. Cấp phát bộ nhớ có thể được định nghĩa là cấp phát một khối không gian trong bộ nhớ máy tính cho một chương trình. Trong Python, phương thức cấp phát và giải phóng bộ nhớ là tự động vì các nhà phát triển Python đã tạo bộ thu gom rác cho Python để người dùng không phải thực hiện thu gom rác thủ công
Thu gom rác thải
Thu gom rác là một quá trình trong đó trình thông dịch giải phóng bộ nhớ khi không sử dụng để cung cấp bộ nhớ cho các đối tượng khác
Giả sử trường hợp không có tham chiếu nào trỏ đến một đối tượng trong bộ nhớ i. e. vì vậy nó không được sử dụng, máy ảo có bộ thu gom rác tự động xóa đối tượng đó khỏi bộ nhớ heap
Ghi chú. Để biết thêm thông tin, hãy tham khảo Bộ sưu tập rác trong Python
Đếm tham khảo
Đếm tham chiếu hoạt động bằng cách đếm số lần một đối tượng được tham chiếu bởi các đối tượng khác trong hệ thống. Khi các tham chiếu đến một đối tượng bị xóa, số lượng tham chiếu cho một đối tượng sẽ giảm đi. Khi số lượng tham chiếu trở thành 0, đối tượng được hủy bỏ
Ví dụ: Giả sử có hai hoặc nhiều biến có cùng giá trị, vì vậy, máy ảo Python làm gì, thay vì tạo một đối tượng khác có cùng giá trị trong vùng riêng tư, nó thực sự làm cho biến thứ hai trỏ đến điểm ban đầu . Do đó, trong trường hợp của các lớp, việc có một số tham chiếu có thể chiếm một lượng lớn không gian trong bộ nhớ, trong trường hợp như vậy, việc đếm tham chiếu rất có lợi để duy trì bộ nhớ khả dụng cho các đối tượng khác
Thí dụ
x
=
10
Khi x = 10
được thực thi, một đối tượng số nguyên 10 được tạo trong bộ nhớ và tham chiếu của nó được gán cho biến x, điều này là do mọi thứ đều là đối tượng trong Python
Hãy xác minh xem đó có phải là sự thật không
x
=
10
y
=
x
x and y do not refer to the same object2
x and y do not refer to the same object3
x and y do not refer to the same object4
x and y do not refer to the same object5
=
=
x and y do not refer to the same object4
x and y do not refer to the same object9
x
0x
1x
2x
3x
4
đầu ra
x and y refer to the same object
Trong ví dụ trên, x
5 sẽ tạo một biến tham chiếu khác y sẽ tham chiếu đến cùng một đối tượng vì Python tối ưu hóa việc sử dụng bộ nhớ bằng cách phân bổ cùng một tham chiếu đối tượng cho một biến mới nếu đối tượng đã tồn tại với cùng một giá trị
Bây giờ, hãy thay đổi giá trị của x và xem điều gì sẽ xảy ra
x
=
10
y
=
x
x
=
3_______17_______ =
5
x and y do not refer to the same object2
x and y do not refer to the same object3
x and y do not refer to the same object4
=
9=
x and y do not refer to the same object4
x and y do not refer to the same object9
x
0x
1x
210
6x
4
đầu ra
x and y do not refer to the same object
Vì vậy, bây giờ x đề cập đến một đối tượng mới x và liên kết giữa x và 10 bị ngắt kết nối nhưng y vẫn đề cập đến 10
Phân bổ bộ nhớ trong Python
Có hai phần của bộ nhớ
- ngăn xếp bộ nhớ
- bộ nhớ đống
Các phương thức/cuộc gọi phương thức và các tham chiếu được lưu trữ trong bộ nhớ ngăn xếp và tất cả các đối tượng giá trị được lưu trữ trong một đống riêng
Công việc của bộ nhớ ngăn xếp
Việc phân bổ xảy ra trên các khối bộ nhớ liền kề. Chúng tôi gọi đó là cấp phát bộ nhớ ngăn xếp vì việc cấp phát xảy ra trong ngăn xếp lệnh gọi hàm. Kích thước của bộ nhớ được phân bổ được trình biên dịch biết và bất cứ khi nào một hàm được gọi, các biến của nó sẽ nhận được bộ nhớ được phân bổ trên ngăn xếp
Đó là bộ nhớ chỉ cần thiết bên trong một lệnh gọi hàm hoặc phương thức cụ thể. Khi một chức năng được gọi, nó sẽ được thêm vào ngăn xếp cuộc gọi của chương trình. Bất kỳ phép gán bộ nhớ cục bộ nào, chẳng hạn như khởi tạo biến bên trong các chức năng cụ thể, được lưu trữ tạm thời trên ngăn lệnh gọi hàm, nơi nó sẽ bị xóa sau khi hàm trả về và ngăn xếp lệnh gọi chuyển sang tác vụ tiếp theo. Việc phân bổ này vào một khối bộ nhớ liền kề được trình biên dịch xử lý bằng cách sử dụng các thường trình được xác định trước và các nhà phát triển không cần phải lo lắng về điều đó
Thí dụ
10
8 10
9
x = 10
0
x
0x = 10
2
x
0x = 10
4
x
0x = 10
6=
x = 10
8
x
0x
0=
x
2
x
0x
4=
x
6
Công việc của bộ nhớ Heap
Bộ nhớ được phân bổ trong quá trình thực hiện các hướng dẫn được viết bởi các lập trình viên. Lưu ý rằng tên heap không liên quan gì đến cấu trúc dữ liệu heap. Nó được gọi là heap vì nó là một đống không gian bộ nhớ có sẵn cho các lập trình viên để cấp phát và hủy cấp phát. Các biến cần thiết bên ngoài các cuộc gọi phương thức hoặc chức năng hoặc được chia sẻ trong nhiều chức năng trên toàn cầu được lưu trữ trong bộ nhớ Heap