CHƯƠNG 3 : QUẢN LÝ BỘ NHỚ
3.2. MỘT SỐ CÁCH TỔ CHỨC CHƯƠNG TRÌNH
Một vấn đề quan trọng trong tổ chức chương trình và quản lý bộ nhớ là làm sao giảm được khơng gian chương trình chiếm trên đĩa và trong bộ nhớ, qua đó có thể sử dụng khơng gian nhớ hiệu quảhơn.
Tổ chức tĩnh. Theo cách thơng thường nhất, chương trình được tạo thành từ một số mơ đun khác nhau. Các mơ đun có thể được viết và dịch thành file object (đi .o), sau đó liên kết với nhau thành chương trình thực hiện được hay cịn gọi là chương trình tải được. Một số mơ đun object chứa các hàm hay dùng có thể được lưu trữ dưới dạng thư viện để tiện cho việc liên kết với các mơ đun khác của chương trình. Khi cần thực hiện chương trình, hệ điều hành sẽ tải tồn bộ chương trình vào bộ nhớ. Quá trình này được thể hiện trên hình 3.1. Cách tổ chức chương trình như vậy có thể gọi là cách tổ chức tĩnh hay tổ chức tuyến tính.
Mặc dù đơn giản và trực quan, cách tổ chức, liên kết và tải chương trình như vậy khơng cho phép sử dụng bộ nhớ hiệu quả. Sau đây, ta xem xét một số kỹ thuật cho phép giải quyết vấn đề này.
3.2.1. Tải trong quá trình thực hiện
Bình thường, tồn bộ chương trình được tải vào bộ nhớ để thực hiện. Đối với các chương trình lớn, trong một phiên làm việc, một số phần của chương trình có thể khơng được dùng tới, chẳng hạn các hàm xử lý lỗi. Các hàm này sẽ chiếm chỗ vơ ích trong bộ nhớ, đồng thời làm tăng thời gian tải chương trình lúc đầu.
Từ nhận xét này, một kỹ thuật được áp dụng là tải các hàm hay chương trình con trong quá trình thực hiện chương trình, hay cịn gọi là tải động. Thực chất của kỹ thuật này là hoãn
việc tải các hàm cho đến khi hàm được sử dụng. Hàm nào chưa được gọi đến thì chưa được tải vào bộ nhớ. Mỗi khi có một lời gọi hàm, chương trình gọi sẽ kiểm tra xem hàm được gọi đã nằm trong bộ nhớ chưa. Nếu chưa, chương trình tải sẽ được gọi để tải hàm vào bộ nhớ, ánh xạ địa chỉ hàm vào khơng gian nhớ chung của chương trình và thay đổi bảng địa chỉ ghi lại các ánh xạ đó.
Trong kỹ thuật này, việc kiểm tra và tải các hàm do chương trình người dùng đảm nhiệm. Hệ điều hành khơng kiểm sốt q trình tải mà chỉ cung cấp các hàm phục vụ việc tải các mô đun thôi.
3.2.2. Liên kết động và thư viện dùng chung
Trong quá trình liên kết truyền thống, còn gọi là liên kết tĩnh, các hàm thư viện được liên kết luôn vào chương trình chính. Kích thước chương trình khi đó sẽ bằng kích thước chương trình vừa được dịch cộng với kích thước các hàm thư viện. Trên thực tế, có các hàm thư viện được dùng trong hầu hết các chương trình, ví dụ đa số chương trình viết cho Windows sử dụng các hàm quản lý cửa sổ và giao diện đồ hoạ. Nếu liên kết tĩnh, các hàm này sẽ có mặt lặp đi lặp lại trong các chương trình làm tăng khơng gian chung mà các chương trình chiếm, bao gồm cả khơng gian trên đĩa và khơng gian bộ nhớ chính khi các chương trình được tải vào để thực hiện.
Một trong những cách giải quyết vấn đề này là sử dụng kỹ thuật liên kết động và các thư
viện hàm dùng chung.Về bản chất, kỹ thuật này chỉ thực hiện liên kết thư viện vào chương
trình trong thời gian thực hiện, khi chương trình đã ở trong bộ nhớ. Trong giai đoạn liên kết, chương trình liên kết khơng kết nối các mơ đun thư viện vào mơ đun chương trình. Thay vào đó, một đoạn mã nhỏ sẽ được chèn vào vị trí của hàm thư viện. Đoạn mã này chứa thông tin về mơ đun thư viện như mơ đun đó nằm trong thư viện nào, vị trí (địa chỉ) mà mơ đun đó chiếm trong khơng gian địachỉ của chương trình.
Trong thời gian chạy, khi đoạn mã chèn vào được thực hiện, đoạn này sẽ kiểm tra xem mô đun thư viện đã có nằm trong bộ nhớ chưa. Nếu chưa, mô đun thư viện sẽ được đọc vào bộ nhớ, sau đó chương trình sẽ thay địa chỉ đoạn mã chèn thành địa chỉ mô đun thư viện. Trong lần thực hiện tiếp theo, khi tới đoạn đến đoạn chương trình này, mơ đun thư viện sẽ được thực hiện ngay, không cần mất thời gian kiểm tra và tải lại. Đối với mô đun thư viện được sử dụng bởi nhiều tiến trình, tất cả tiến trình có thể dùng chung một bản duy nhất phần mã chương trình của thư viện. Thư viện khi đó được gọi là thư viện dùng chung.
Kỹ thuật liên kết động được minh họa trên hình 3.2.
Ngồi ưu điểm tiết kiệm bộ nhớ, thư viện dùng chung còn giúp cho việc cập nhật và sửa lỗi thư viện dễ dàng hơn. Khi có thay đổi trong thư viện, người lập trình khơng cần biên dịch và liên kết lại tồn bộ chương trình. Thay vào đó, chương trình chỉ cần chứa thơng tin về phiên bản của thư viện tương thích với chương trình và lựa chọn phiên bản phù hợp.
Một ví dụ sử dụng liên kết động và thư viện dùng chung là hệ điều hành Windows. Thư viện dùng chung của Windows được chứa trong các file có đi là DLL (Dynamic Linking
Library). Khi xây dựng chương trình, trình liên kết cho phép người lập trình lựa chọn chế độ liên kết tĩnh hay liên kết động. Nếu liên kết tĩnh, tồn bộ các mơ đun chương trình và thư viện được liên kết thành một file thực hiện duy nhất có thể cài và chạy trên máy khác. Ngược lại, nếu chọn liên kết động, file thực hiện khơng chứa thư viện và có kích thước nhỏ hơn so với liên kết tĩnh. Tuy nhiên, khi cài đặt trên máy khác cần cài đặt cả file thực hiện chính và các file .DLL chứa thư viện. Hệ thống sẽ thông báo khơng tìm được file DLL cần thiết trong trường hợp khơng tìm được các file này.
Hình 3.2: Liên kết động trong thời gian thực hiện