Tài nguyên Thư viện

Thành viên trực tuyến

7 khách và 0 thành viên

Thống kê

  • truy cập   (chi tiết)
    trong hôm nay
  • lượt xem
    trong hôm nay
  • thành viên
  • Menu Thư viện

    Gốc > Kiến thức tin học > Lập trình Pascal >

    Con trỏ: BỘ NHỚ HEAP


         Các biến động do New tạo ra được Pascal xếp vào một vùng ô nhớ tự do theo kiểu xếp chồng và được gọi là Heap ( bộ nhớ cấp phát động ). Ngôn ngữ Pascal quản lý Heap thông qua một con trỏ của Heap là HeapPtr. Con trỏ của Heap luôn luôn trỏ vào ô nhớ tự do đầu tiên của vùng ô nhớ tự do của Heap. Mỗi lần gọi New, con trỏ của Heap được dịch chuyển về phía đỉnh của vùng ô nhớ tự do một số byte tương ứng với kích thước của biến động mới được tạo ra.

         Ngược lại, mỗi khi giải phóng bộ nhớ biến động, bộ nhớ biến động được thu hồi. Tuy nhiên nếu việc tạo và thu hồi không phải là quá trình liên tục và kế cận thì bản thân của vùng nhớ Heap cũng bị chia nát ra. Nghĩa là có thể có những vùng thu hồi nằm lọt trong vùng các biến động khác vẫn còn đang hoạt động. Turbo Pascal không có cơ chế dồn các biến động đang được sử dụng để gom về những vùng ô nhớ tự do.  

         Thí dụ khi bạn gọi : 

                        New ( P ) ;

                        New ( Q ) ;

                        New ( R ) :

                        Dispose ( Q ) ; 

         Nghĩa là có 3 vùng nhớ kế cận nhau dành cho các biến động P^, Q^ và R^. Song đột nhiên vùng nhớ Q^ bị đòi lại làm cho xuất hiện một lỗ thủng do biến Q^ tạo ra. Turbo Pascal vẫn có cơ chế để quản lý vùng nhớ vừa giải phóng để cho các biến động mới được tạo ra có thể được xếp vào những lổ hổng đó nếu vừa kích thước ( bé hơn hoặc bằng ).

         Một điều bạn quan tâm là khi tạo biến động, liệu máy có cần bộ nhớ cho nó không. Turbo Pascal cung cấp hai hàm : MemAvailMaxAvail. Hàm MemAvail giúp bạn xác định kích thước của tất cả các vùng nhớ cấp cho biến động còn tự do, nghĩa là tổng tất cả các khối nhớ tự do, bao gồm cả các khối nhớ lổ hổng nằm xen kẽ nhau trong Heap. Hàm MaxAvail thì báo cho biết kích thước của khối nhớ Heap tự do lớn nhất. Mỗi khi bạn tạo biến động mới, máy luôn luôn cần biết liệu có còn một khối nhớ tự do nào đủ để " nhét " biến mới vào không. Hãy xem thí dụ dưới đây về cách dùng hai hàm này : 

                        Program Get_Heap_Space ;

                        Uses Crt ;

                        Var

                           Tong_Heap, Khoi_lon_nhat : LongInt ;

                        BEGIN

                           Tong_Heap := MemAvail ;

                           Khoi_lon_nhat := MaxAvail ;

                           Writeln (' Tong cac vung tu do cua Heap la ', Tong_Heap,' bytes ') ;

                           Writeln (' Khoi Heap tu do lon nhat la ', Khoi_lon_nhat,' bytes ') ;

                        END. 

         Kết quả sẽ tùy vào máy của người sử dụng : 

                        Tong cac vung tu do cua Heap la 10200 bytes.

                        Khoi Heap tu do lon nhat la 600 bytes.    

         Mỗi khi tạo biến động mới bạn cũng nên kiểm tra xem máy có đủ bộ nhớ cấp cho nó không. Hãy sử dụng hàm SizeOf để xác định kích thước biến nhớ bạn cần tạo ra : 

        Ví dụ: 

                        Program Check_Heap_Space ;

                        Uses Crt ;

                        Type

                           RecPtrType = ^RecordType ;

                           RecordType = Record

                              ID : String[ 5 ] ;   (* Số CMND *)

                              Ten : String[ 20 ] ;

                              Tuoi : Byte ;

                           End ;

                        Var

                           Ptr : RecPtrType ;

                        BEGIN

                           Ptr := Nil ;

                           Writeln (' Kich thuoc cua ban ghi la ', SizeOf( RecordType ),' bytes ' ) ;

                           Writeln (' Tong cac vung tu do cua Heap la ', MemAvail,' bytes ') ;

                           Writeln (' Khoi Heap tu do lon nhat la ', MaxAvail,' bytes ') ;

                           If MaxAvail < SizeOf( RecPtrType ) Then

                              Writeln (' Khong du bo nho !') ;

                           Else

                              New ( RecPtr ) ;

                          ...

                           Dispose ( RecPtr ) ;

                           RecPtr := Nil ;

                        END.


    Nhắn tin cho tác giả
    Đỗ Trung Thành @ 10:48 13/09/2009
    Số lượt xem: 1633
    Số lượt thích: 0 người
     
    Gửi ý kiến