BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN , BÁO CÁO BTL THUỘC HỌC PHẦN NGUYÊN LÍ HỆ ĐIỀU HÀNH ĐỀ TÀI Nghiên cứu tìm hiểu về quản lí bộ nhớ Trong trong hệ điều hành linux GV Hướng dẫn Nguyễn Thanh Hải Hà Nội 2022 Mục lục Lời mở đầu 2 Chương 1 Giới thiệu về hệ điều hành Linux 2 1 1 Hệ điều hành Linux 2 1 2 Tổng quan về quản lý bộ nhớ trong linux 2 Chương 2 Cơ chế phân trang, phân đoạn 3 2 1 Cơ chế phân đoạn 3 2 2 Cơ chế phân trang 4 2 2 1 N.
z 1 BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN *************************** BÁO CÁO BTL THUỘC HỌC PHẦN: NGUYÊN LÍ HỆ ĐIỀU HÀNH ĐỀ TÀI: Nghiên cứu tìm hiểu quản lí nhớ Trong hệ điều hành linux GV Hướng dẫn : Nguyễn Thanh Hải 2 Hà Nội - 2022 Mục lục Lời mở đầu Linux hệ điều hành mã nguồn mở phổ biến toàn giới Nhiều năm qua, Linux thực tạo cách mạng lĩnh vực máy tính Sự phát triển mà Linux mang lại thật đáng kinh ngạc: hệ điều hành đa nhiệm, đa người dùng Linux chạy nhiều vi xử lý khác như: Intel, Motorola, MC68K, Dec Alpha Ngồi Linux cịn tương tác tốt với hệ điều hành của: Apple , Microsoft Novell Vì ưu điểm mà ngành công nghệ thông tin Việt Nam chọn Linux làm hệ điều hành cho chương trình ứng dụng chủ đạo kinh tế quốc phòng Với mã nguồn mở, việc sử dụng Linux an toàn với ứng dụng Windows Linux đem đến cho lợi ích kinh tế với nhiều phần mềm miễn phí Giống hệ điều hành khác, Linux phải có chế phương pháp khai thác sử dụng tài nguyên máy hiệu quả, đặc biệt tài nguyên nhớ Trong đồ án 3 này, em trình bày phần quan trọng hệ điều hành Linux hệ điều hành khác là: chế quản lý nhớ Linux Chương 1: Giới thiệu hệ điều hành Linux 1.1 Hệ điều hành Linux Linux hệ điều hành họ UNIX miễn phí sử dụng rộng rãi Được viết vào năm 1991 Linus Toward, hệ điều hành Linux thu thành công định Là hệ điều hành đa nhiệm, đa người dùng, Linux chạy nhiều phần cứng khác Với tính ổn định mềm dẻo, Linux dần sử dụng nhiều máy chủ máy trạm mạng máy tính Linux cịn cho phép dễ dàng thực việc tích hợp hệ điều hành khác mạng máy tính Windows, Novell, Apple Ngồi ra, với tính mã nguồn mở, hệ điều hành cho phép khả tùy biến cao, thích hợp cho nhu cầu sử dụng cụ thể 4 1.2 Tổng quan quản lý nhớ linux Trong hệ thống máy tính, nhớ tài nguyên quan trọng Cho dù có nhớ khơng đáp ứng nhu cầu người sử dụng Các máy tính cá nhân trang bị dung lượng khối lớn Thậm chí máy chủ Server có đến hàng gigabyte nhớ Thế nhu cầu nhớ khơng thỏa mãn Có nhiều chiến lược quản lý nhớ nghiên cứu áp dụng, chiến lược sử dụng nhớ ảo hiệu Giống hệ điều hành khác, Linux sử dụng chế nhớ ảo để quản lý tài nguyên nhớ máy tính Linux có cách tiếp cận quản lý nhớ rõ ràng Các ứng dụng Linux không phép truy cập trực tiếp vào địa vật lý nhớ Linux cung cấp chương trình chạy hệ điều hành - cịn gọi tiến trình mơ hình đánh địa phẳng khơng phân đoạn segment offset DOS Mỗi tiến trình thấy vùng không gian địa riêng Tất phiên UNIX cung cấp cách bảo vệ nhớ theo chế bảo đảm khơng có tiến tình ghi đè lên vùng nhớ tiến trình khác hoạt động vùng nhớ hệ thống Nói chung, nhớ mà hệ thống cấp phát cho tiến trình khơng thể đọc ghi tiến trình khác tránh xung đột nhớ Trong hầu hét hệ thống Linux, trỏ sử dụng số nguyên 32 bit trỏ đến ô nhớ cụ thể Với 32 bit, hệ thống đánh địa đến GB nhớ Mơ hình nhớ phẳng dễ truy xuất xử lý nhớ phân đoạn segment:offset Ngoài ra, vài hệ thống cịn sử dụng mơ hình địa 64 bit, khơng gian địa mở rộng đến hàng Terabyte Để tăng dung lượng nhớ sẵn có,Linux cịn cài đặt chương trình phân trang đĩa tức lượng khơng gian hốn đổi phân bố đĩa.Khi hệ thống yêu cầu nhiều nhớ vật lý,nó đưa trang khơng hoạt động đĩa,nhờ bạn chạy ứng dụng lớn lúc hỗ trợ nhiều người sử dụng.Tuy vậy,việc hốn đổi khơng thay RAM vật lý,nó chậm cần nhiều thời gian để truy cập đĩa Kernel cài đặt khối nhớ hợp cho chương trình người sử dụng đệm đĩa tạm thời(disk cache).Theo cách này,tất nhớ trống dành để nhớ tạm nhớ đệm(cache)sẽ giảm xuống xử lý chạy chương trình lớn 5 Chương 2: Cơ chế phân trang, phân đoạn 2.1 Cơ chế phân đoạn - Chương trình người sử dụng biên dịch thành module độc lập Thông tin module độc lập Thông tin module chứa bảng điều khiển gọi bảng quản lí đoạn (segment control block -SCB) Trong bảng quản lí đoạn cịn chứa thơng tin trợ giúp việc định vị module - Linux sử dụng chế phân đoạn để phân tách vùng nhớ cấp phát cho hạt nhân tiến trình Hai phân đoạn liên quan đến 3GB (từ đến 0xBFFF FFFF) khơng gian địa tiến trình nội dung chúng có 6 thể đọc chỉnh sửa chế độ người dùng chế độ Kernel Hai phân đoạn liên quan đến GB thứ (từ 0xC000 0000 đến 0xFFFF FFFF) khơng gian địa tiến trình nội dung đọc chỉnh sửa chế độ Kernel Theo cách này, liệu mã Kernel bảo vệ khỏi truy cập khơng hợp lý tiến trình chế độ người dùng Kernel/User Linear addresses 2.2 Cơ chế phân trang 2.2.1 Nhu cầu phân trang Vì có q nhớ vật lý so với nhớ ảo nên HĐH phải trọng để khơng lãng phí nhớ vật lý Một cách để tiết kiệm nhớ vật lý load trang ảo mà sử dụng chương trình thực thi Việc mà load trang ảo vào nhớ chúng truy cập dẫn đến nhu cầu phân trang 2.2.1.1 Trang lưu trữ (page cache) Cache tầng nằm phần quản lý nhớ kernel phần vào đĩa Các trang mà kernel hốn đổi khơng ghi trực tiếp lên đĩa mà ghi vào cache Khi cần vùng nhớ trống kernel ghi trang từ cache đĩa 7 - Đặc tính chung trang danh sách trang theo chuẩn LRU (Least Recently Used) là: - active_list: Là trang có page -> age > 0, chứa khơng chứa liệu, ánh xạ mục bảng trang tiến trình - inactive_dirty_list: Là trang có page -> age == 0, chứa không chứa liệu, không ánh xạ mục bảng trang tiến trình - inactive_clean_list: Mỗi vùng có inactive_dirty_list riêng nó, chứa trang clean với age==0, khơng ánh xạ mục bảng trang tiến trình Trong quản lý lỗi trang, kernel tìm kiếm trang lỗi page cache Nếu lỗi tìm thấy đưa đến active_list để đưa thơng báo 2.2.2.2 Vịng đời User Page Trang P đọc từ đĩa vào nhớ lưu vào page cache Có thể xảy trường hợp sau: - Tiến trình A muốn truy cập vào trang P Nó trình quản lý lỗi trang kiểm tra xem có tương ứng với file ánh xạ khơng Sau lưu vào page cache bảng trang tiến trình Từ vịng đời trang bắt đầu active_list, nơi mà lưu giữ kể sử dụng - Trang P đọc suốt trình hoạt động đầu đọc hoán đổi, lưu vào page cache Trong trường hợp này, lý mà trang đọc đơn giản phần cluster khối đĩa Một loạt trang liên tiếp đĩa đọc mà không cần biết trang có cần hay khơng Chúng ta không cần quan tâm đến việc thông báo cho trang chúng khơng dùng, chúng phục hồi cho dù khơng cịn tham chiếu đến - Trang P đọc suốt trình hoạt động đầu đọc cluster ánh xạ nhớ Trong trường hợp này, chuỗi trang liền tiếp sau trang lỗi file ánh xạ nhớ đọc Những trang bắt đầu vòng đời chúng page cache kết hợp với file ánh xạ nhớ active_list Trang P ghi tiến trình, có chứa liệu (dirty) Lúc trang P active_list Trang P không sử dụng thời gian Sự kích hoạt định kì hàm kswapd() (kernel swap daemon) giảm dần biến đếm page->age Hàm kswapd() hoạt động nhiều nhu cầu nhớ tăng Thời gian tồn trang P giảm dần xuống (age == 0) khơng cịn tham chiếu, dẫn đến kích hoạt hàm re_fill inactive() 8 Nếu nhớ đầy, hàm swap_out gọi hàm kswapd() để cố gắng lấy lại trang từ khơng gian địa ảo tiến trình A Vì trang P khơng cịn tham chiếu có age == 0, nên mục bảng trang bị xóa Tất nhiên, thời gian khơng có tiến trình ánh xạ đến Hàm swap_out thực khơng đưa trang P ngồi mà đơn giản loại bỏ tham chiếu tiến trình đến trang Nhờ vào page cache chế swap mà trang bảo đảm ghi lên đĩa cần Thời gian xử lý hay nhiều tùy thuộc vào nhu cầu sử dụng nhớ Tiếp theo, hàm refill_inactive_scan() tìm trang mà đưa đến inactive_dirty list Từ trang P không ánh xạ tiến trình có age == đưa từ active_list đến inactive_dirty list Tiến trình A truy cập vào trang P, khơng có nhớ ảo tiến trình mục bảng trang bị xóa hàm swap_out() Trình điều khiển lỗi gọi hàmfind_page_nolock() để xác định vị trí trang P page cache Sau tìm thấy, mục bảng trang phục hồi trang P đưa đến active_list Quá trình nhiều thời gian hàm swap_out() xóa mục bảng trang tiến trình A, hàm refill_inactive_scan() vơ hiệu hóa trang P, đưa đến inactive_dirty list Việc tốn nhiều thời gian làm nhớ trở nên chậm Hàm page_ launder() kích hoạt để làm trang dirty Nó tìm trang P inactive_dirty list ghi trang P đĩa Sau đó, trang đưa đến inactive_clean_list Khi hàm page_ launder() thực định ghi lên trang thực bước sau: - Khóa trang - Gọi phương thức writepage Lời gọi kích hoạt vài đoạn mã đặc biệt để thực ghi lên đĩa (khơng đồng bộ) với trang bị khóa Lúc này, hàm page_launder() hoàn thành nhiệm vụ, trang inactive_dirty_list mở khóa việc ghi hoàn tất - Hàm page_launder() gọi lại để tìm trang clean để đưa đến inactive_clean_list, giả sử thời gian khơng có tiến trình tham chiếu đến page cache 10 Hàm page_launder() thực lại để tìm trang khơng sử dụng clean, đưa chúng đến inactive_clean_list 11 Giả sử cần trang trống riêng lẻ Điều thực cách lấy lại trang inactive_clean, trang P chọn Hàm reclaim_page() loại bỏ trang P khỏi pagecache (điều bảo đảm khơng có tiến trình khác tham chiếu đến q trình quản lý lỗi trang), đưa cho lời gọi trang trống 9 2.2.3 Bảng trang (page table) Hình I.3: Mức bảng trang Linux giả sử có mức bảng trang Mỗi bảng trang chứa số khung trang bảng trang mức Hình I.3 cách mà địa ảo chia thành trường Mỗi trườngcung cấp địa offset đến bảng trang cụ thể Để chuyển địa ảo thành địa vật lý, xử lý phải lấy nội dung trường chuyển thành địa offset đến trang vật lý chứa bảng trang đọc số khung trang bảng trang mức Việc lặp lại lần số khung trang trang vật lý chứa địa ảo tìm Bây giờ, trường cuối địa ảo sử dụng để tìm liệu trang 2.2.4 Định vị giải phóng trang Có nhiều nhu cầu trang vật lý hệ thống Ví dụ, ảnh load vào nhớ, HĐH cần định vị trang Những trang làm trống ảnh xử lý xong khơng cịn load Một cơng dụng khác trang vật lý chứa cấu trúc liệu cụ thể vể kernel cấu trúc trang Cơ chế cấu trúc liệu sử dụng để định vị giải phóng trang có ý nghĩa vơ quan trọng việc quản lý cách hiệu nhớ ảo Tất trang vật lý hệ thống mô tả cấu trúc liệu mem_map, danh sách gồm cấu trúc liệu mem_map_t khởi tạo lúc khởi động Mỗi mem_map_t mô tả trang vật lý hệ thống Các trường quan trọng có liên quan đến việc quản lý nhớ là: - Count: Lưu số lượng người sử dụng trang Count > trang chia sẻ nhiều tiến trình - Age: Trường mơ tả "tuổi" trang dùng để định trang bị loại bỏ hay hoán đổi 10 10 - Map_nr: Đây số khung trang vật lý mà mem_map_t mô tả Vector free_area sử dụng đoạn mã định vị trang để tìm làm trống trang Tồn lược đồ quản lý đệm hỗ trợ chế đoạn mã liên quan, kích thước trang chế phân trang vật lý sử dụng xử lý khơng liên quan Mỗi phần tử free_area chứa thông tin khối trang Phần tử thứ mảng mô tả trang đơn lẻ, khối gồm trang tiếp theo, khối gồm trang tiếp theo, tăng theo lũy thừa Phần tử list đứng đầu hàng đợi trỏ đến cấu trúc liệu page mảng mem_map Các khối trống trang xếp Con trỏ map trỏ đến ảnh bitmap để theo dõi nhóm trang định vị theo kích thước Bit thứ N ảnh bitmap thiết lập khối thứ N trang trống a Định vị trang Linux sử dụng thuật toán Buddy để định vị giải phóng cách hiệu khối trang Đoạn mã định vị trang xác định khối hay nhiều trang vật lý Những trang định vị khối có kích thước lũy thừa Điều có nghĩa định vị khối gồm trang, trang, trang, Khi có đủ số trang trống hệ thống để cấp cho yêu cầu, đoạn mã định vị tìm free_area khối trang có kích thước yêu cầu Mỗi phần tử free_area ánh xạ đến khối trang trống có kích thước tương ứng Ví dụ, phần tử thứ mảng ánh xạ đến khối gồm trang trống định vị Hình I 4: Cấu trúc liệu free_area Ví dụ, hình I 4, khối gồm trang yêu cầu khối trang thứ (bắt đầu khung trang số 4) chia thành hai khối trang Khối thứ (bắt đầu khung trang số 4) cung cấp cho lời gọi khối thứ 11 11 hai (bắt đầu khung trang số 6) đưa vào hàng đợi khối trang trống phần tử thứ mảng free_area b Giải phóng trang Việc định vị khối trang làm cho nhớ bị phân mảnh khối trang lớn bị chia nhỏ Đoạn mã giải phóng trang kết hợp trang lại thành khối lớn trang trống Khi có khối trang trống khối lân cận có kích thước kiểm tra xem có trống khơng Nếu có chúng kết hợp với để tạo khối trang có kích thước gấp đơi Đoạn mã giải phóng trang lại tìm cách kết hợp khối với khối khác Theo cách này, khối trang trống lớn dần CHƯƠNG III: CƠ CHẾ QUẢN LÝ BỘ NHỚ ẢO 3.1 Khái niệm nhớ ảo, khơng gian hốn đổi Linux hỗ trợ nhớ ảo, nghĩa sử dụng phần đĩa RAM để tăng kích thước nhớ Kernel( ) ghi nội dung khối nhớ không sử dụng lên đĩa cứng để nhớ sử dụng cho mục đích khác Khi cần lại nội dung chúng đọc trở lại vào nhớ Việc hoàn toàn suốt người sử dụng, chương trình chạy Linux thấy số lượng lớn nhớ có sẵn mà khơng quan tâm phần nằm đĩa Tất nhiên, việc đọc ghi lên đĩa chậm ( khoảng ngàn lần ) so với sử dụng nhớ thật, chương trình chạy không nhanh Phần đĩa cứng sử dụng nhớ ảo gọi khơng gian hốn đổi Linux sử dụng mơt file thơng thường file hệ thống phân vùng riêng để làm khơng gian hốn đổi Một phân vùng swap nhanh lại dễ việc thay đổi kích thước file swap Khi bạn biết cần khơng gian hốn đổi bạn bắt đầu tạo phân vùng swap, bạn không bạn nên sử dụng file swap trước, sử dụng hệ thống thời gian để biết khơng gian hốn đổi mà cần sau tạo phân vùng swap 3.2 Mơ hình nhớ ảo Trước tìm hiểu phương thức mà Linux sử dụng để hỗ trợ nhớ ảo, nên tìm hiểu mơ hình trừu tượng Khi xử lý thực chương trình, đọc lệnh từ nhớ giải mã lệnh Trong giải mã lệnh, lấy hay lưu trữ nội dung vị trí nhớ Sau xử lý thực lệnh di chuyển đến lệnh chương trình Theo cách này, xử lý luôn truy cập nhớ để lấy lệnh lấy lưu trữ liệu Tất địa nhớ ảo địa ảo địa vật lý Bộ xử lý 12 12 chuyển địa ảo thành địa vật lý dựa vào thông tin bảng quản lý HĐH Để cho chuyển đổi dễ dàng nhớ ảo nhớ vật lý chia thành nhiều khúc có kích thước thích hợp gọi trang Tất trang có kích thước để dễ quản lý Linux hệ thống Alpha AXP sử dụng trang 8Kbyte, hệ thống Intel x86 trang 4Kbyte Mỗi trang cung cấp số gọi số khung trang ( PFN : Page Frame Number) Hình : Mơ hình trừu tượng ánh xạ từ địa ảo đến địa vật lý Trong mơ hình này, địa ảo bao gồm hai phần : địa offset số khung trang ảo Nếu kích thước trang 4Kbyte từ bit 11 đến bit địa ảo chứa địa offset, từ bit 12 trở lên số khung trang ảo Mỗi lần xử lý bắt gặp địa ảo, lấy địa offset số khung trang ảo Bộ xử lý phải chuyển từ số khung trang ảo sang số khung trang vật lý sau truy cập vào vị trí địa offset trang vật lý Để làm điều xử lý sử dụng bảng trang Hình khơng gian địa ảo hai tiến trình X Y, tiến trình có bảng trang riêng Các bảng trang ánh xạ trang ảo tiến trình vào trang vật lý nhớ Khung trang ảo số tiến trình X ánh xạ vào nhớ khung trang vật lý số khung trang ảo số tiến trình Y ánh xạ vào khung trang vật lý số Mỗi mục bảng trang theo lý thuyết chứa thông tin sau : - Cờ hợp lệ : cho biết mục bảng trang có hợp lệ hay không - Số khung trang vật lý mà mục mô tả - Thông tin điều khiển truy cập : mô tả trang sử dụng ?, ghi hay khơng ?, có chứa đoạn mã thực thi hay không ? Bảng trang 13 13 truy cập nhờ sử dụng số khung trang ảo địa offset Khung trang ảo số phần tử số bảng ( bắt đầu phần tử ) Để chuyển từ địa ảo sang địa vật lý, xử lý trước hết phải làm việc với số khung trang ảo địa offset trang ảo Xem lại hình giả thiết kích thước trang 0x2000 byte địa 0x2194 khơng gian địa ảo tiến trình Y, xử lý chuyển địa thành địa offset 0x194 vào khung trang ảo số Bộ xử lý sử dụng số khung trang ảo mục vào bảng trang tiến trình để truy xuất vào mục bảng trang Nếu mục bảng trang địa offset hợp lệ xử lý lấy số khung trang vật lý từ mục Nếu mục không hợp lệ tiến trình truy cập vào vùng khơng tồn nhớ ảo Trong trường hợp này, xử lý làm việc với địa mà chuyển điều khiển cho HĐH để khắc phục lỗi Chúng ta xem cách mà xử lý báo cho HĐH biết tiến trình cố gắng truy cập vào địa ảo không hợp lệ Điều gọi lỗi trang, xử lý chuyển đến HĐH HĐH thông báo địa ảo gây lỗi nguyên nhân lỗi trang Giả sử mục hợp lệ bảng trang, xử lý lấy số khung trang vật lý nhân với kích thước trang để lấy địa trang sở nhớ vật lý Cuối cùng, xử lý cộng gộp vào địa offset để lệnh hay liệu cần dùng Sử dụng lại ví dụ trên, khung trang ảo số tiến trình Y ánh xạ đến khung trang vật lý số bắt đầu 0x8000 ( x 0x2000 ), cộng với địa offset 0x194 cho ta địa vật lý cuối 0x8194 Bằng cách ánh xạ địa ảo địa vật lý này, nhớ ảo ánh xạ vào nhớ vật lý hệ thống theo thứ tự Ví dụ, hình 3, khung trang ảo số tiến trình X ánh xạ đến khung trang vật lý số khung trang ảo số ánh xạ đến khung trang vật lý số cao khung trang ảo số nhớ ảo Điều chứng minh cho kết luận thú vị nhớ ảo : trang nhớ ảo hiển thị nhớ vật lý khơng theo thứ tự 3.3 Tạo khơng gian hốn đổi Một file swap file thơng thường, khơng có đặc biệt kernel Điều mà có nghĩa kernel khơng có vùng trống Nó chuẩn bị để sử dụng với hàm mkswap() Nó phải thường trú đĩa cục Bit vùng trống quan trọng File swap dự trữ khơng gian đĩa để kernel đưa trang ngồi nhanh chóng mà khơng phải thực tất bước cần thiết định vị disk sector cho file Bởi vùng trống file có nghĩa khơng có disk sector định vị nên kernel khơng thể sử dụng file Cách tốt để tạo file swap mà khơng có vùng trống thực đoạn lệnh sau : 14 14 $ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out $ Trong đó, /extra-swap tên file swap kích thước cho sau count= Kích thước tốt bội số kernel ghi trang nhớ, trang có kích thước Kbyte Nếu kích thước khơng phải bội số cặp Kbyte cuối khơng sử dụng Một phân vùng swap khơng có đặc biệt Bạn tạo giống phân vùng khác, khác sử dụng phân vùng thơ, khơng chứa file hệ thống Phân vùng swap đượ đánh dấu loại 82 ( Linux swap ), điều giúp cho việc liệt kê phân vùng rõ ràng khơng hồn tồn cần thiết kernel Sau bạn tạo phân vùng swap phân vùng swap, bạn cần ghi chữ ký lên nơi bắt đầu Chữ ký sử dụng kernel chứa số thông tin việc quản lý Đoạn lệnh để làm việc hàm mkswap(), sử dụng sau : $ mkswap /extra-swap 1024 Setting up swapspace, size = 1044480 bytes $ Chú ý khơng gian hốn đổi chưa sử dụng, tồn kernel khơng sử dụng để cung cấp nhớ ảo Bạn nên cẩn thận sử dụng hàm mkswap() khơng kiểm tra file hay phân vùng sử dụng chưa Bạn dễ dàng ghi đè lên file hay phân vùng quan trọng với hàm mkswap() Tốt hết bạn nên sử dụng hàm cài đặt lên hệ thống bạn Trình quản lý nhớ Linux giới hạn kích thước khơng gian hốn đổi 127MB Tuy nhiên bạn sử dụng lúc tới khơng gian hốn đổi nên tổng kích thước lên đến 1GB Điều khơng cịn đúng, với phiên kernel giới hạn thay đổi tùy thuộc vào cấu trúc Ví dụ xử lý i386 giới hạn 2GB Để tăng dung lượng sẵn có, Linux cịn cài đặt chương trình phân trang đĩa tức lượng khơng gian hốn đổi phân bố đĩa Khi hệ thống yêu cầu nhiều nhớ vật lý, đưa trang không hoạt động đĩa, nhờ ta chạy ứng dụng lớn lúc hỗ trợ nhiều người sử dụng Tuy vậy, việc hốn đổi khơng thay nhớ vật lý, chậm cần nhiều thời gian để truy cập đĩa, Kernel cài đặt khối nhớ hợp cho chương trình người sử dụng đệm đĩa tạm thời (disk cache) Theo cách này, tất nhớ trống dành để nhớ tạm nhớ đệm (cache) giảm xuống xử lý chạy chương trình lớn 15 15 3.4 Sử dụng khơng gian hốn đổi Một khơng gian hốn đổi khởi tạo lấy để sử dụng nhờ lệnh swapon Lệnh báo cho kernel không gian hốn đổi sử dụng Đường dẫn đến khơng gian hốn đổi cấp đối số, để bắt đầu hốn đổi file swap tạm thời, bạn sử dụng đoạn lệnh sau: $ swapon /extra-swap $ Khơng gian hốn đổi sử dụng tự động cách liệt kê chúng file /etc/fstab /dev/hda8 none swap sw 0 /swapfile none swap sw 0 Đoạn mã khởi động chạy lệnh swapon -a, lệnh bắt đầu thực hốn đổi tất khơng gian hoán đổi liệt kê file /etc/fstab Do lệnh swapon thường sử dụng cần hốn đổi thêm Đơi có nhiều khơng gian hốn đổi sử dụng có nhiều nhớ vật lý trống Điều xảy thời điểm có nhu cầu hốn đổi, sau tiến trình lớn chiếm nhiều nhớ vật lý kết thúc giải phóng nhớ 3.5 Định vị khơng gian hốn đổi Người ta thường nói bạn nên định vị khơng gian hốn đổi gấp đôi nhớ vật lý, quy luật Bạn xem cách làm sau đây: + Dự đoán tổng nhớ mà bạn cần Đây số lượng nhớ lớn mà bạn cần thời điểm đó, tổng nhớ cần thiết cho tất chương trình mà bạn muốn chạy lúc + Cộng thêm vào dự đốn bước 1, dự đốn kích thước chương trình sai bạn quên số chương trình mà bạn muốn chạy, để chắn bạn nên chuẩn bị không gian phụ để dùng cần + Dựa tính tốn trên, bạn biết cần tổng cộng nhớ Vì vậy, để định vị khơng gian hốn đổi, bạn cần lấy tổng nhớ dùng trừ cho nhớ vật lý + Nếu khơng gian hốn đổi mà bạn tính lớn hai lần nhớ vật lý bạn nên mua thêm RAM, không hiệu máy thấp Tốt hết nên có vài khơng gian hốn đổi cho dù theo tính tốn bạn không cần Linux sử dụng không gian hoán đổi linh hoạt Linux đưa trang nhớ khơng sử dụng ngồi cho dù nhớ chưa cần dùng Điều giúp tránh việc chờ đợi hoán đổi cần nhớ 16 16 CHƯƠNG IV: CƠ CHẾ QUẢN LÝ BỘ NHỚ VẬT LÝ, ÁNH XẠ BỘ NHỚ 4.1 BỘ ĐỊNH VÙNG (The Zone Allocator) Các bảng trang Kernel ánh xạ tối đa nhớ vật lý vào phạm vi địa PAGE_OFFSET Các trang vật lý bị chiếm giữ mã Kernel liệu bảo lưu không phân bổ cho mục đích khác Tất trang vật lý khác phân bổ để xử lý nhớ ảo, đệm, nhớ ảo Kernel bổ sung, cần Để làm điều này, phải có cách theo dõi trang vật lý sử dụng, Bộ định vùng quản lý nhớ vật lý Bất kỳ mã Kernel gọi đến cấp phát vùng qua hàm _alloc_pages() cung cấp khối gồm 2n trang chỉnh ranh giới 2n trang cho giá trị nhỏ n (tối đa hơn) Chúng ta đưa khối trang trở lại cấp phát vùng thơng qua _free_pages() để giải phóng chúng Số mũ n gọi "thứ tự" phân bổ Các khối khơng thiết phải giải phóng theo cách mà chúng cấp phát, chúng phải giải phóng với chỉnh thích hợp khung trang khối phải có số lượng tham chiếu khác khơng Ví dụ: bạn u cầu khối trang, trang chỉnh, sau giải phóng khối trang, trang khối lớn hơn, trước tiên bạn phải tăng số lượng tham chiếu trang khối nhỏ Lý cho điều bạn phân bổ khối trang, trang khối có số lượng tham chiếu tăng lên - mã giải phóng trang khơng giải phóng trang có số lượng tham chiếu 0; số lượng tham chiếu cho trang khác phải xử lý theo cách thủ công 4.2 CÁC VÙNG (Zones) Các phạm vi trang vật lý khác có thuộc tính khác nhau, cho mục đích Kernel Ví dụ: Truy cập nhớ trực tiếp, cho phép thiết bị ngoại vi đọc ghi liệu trực tiếp vào RAM mà không cần can thiệp CPU, hoạt động địa vật lý nhỏ 16MB Một số hệ thống có nhiều RAM vật lý mức ánh xạ PAGE_OFFSET 4GB; trang vật lý khơng thể truy cập trực tiếp vào Kernel, chúng phải xử lý theo cách khác Bộ cấp phát vùng xử lý khác biệt cách chia nhớ thành số vùng coi vùng đơn vị cho mục đích cấp phát Bất kỳ yêu cầu phân bổ cụ thể sử dụng danh sách khu vực mà từ thử phân bổ, theo thứ tự ưu tiên 17 17 đến ưu tiên Ví dụ: yêu cầu cho trang người dùng phải điền trước từ vùng bình thường (normal), điều khơng thành công, từ vùng HIGHMEM, không thành công nữa, từ vùng DMA Do đó, danh sách vùng cho phân bổ theo thứ tự bao gồm: • • • Vùng bình thường (normal) HIGHMEM DMA Mặt khác, yêu cầu cho trang DMA thực từ vùng DMA, đó, danh sách vùng cho yêu cầu chứa vùng DMA Cấu trúc liệu gốc trì cấp phát vùng zone_struct, cấu trúc tập hợp tất liệu có liên quan để quản lý vùng cụ thể Zonelist_struct bao gồm mảng trỏ zone_struct gfp_mask cho biết loại phân bổ sử dụng zonelist Zone_struct -> offset độ lệch nhớ vật lý phần đầu vùng 4.3 Bản nhớ Mỗi trang vật lý hệ thống đại diện cấu trúc trang mảng zone_struct-> zone_mem_map, mảng cấu trúc trang song song với khối nhớ vật lý đại diện vùng: zone_mem_map[0] đại diện cho trang vùng, zone_mem_map[1] đại diện cho trang thứ hai, … Mỗi cấu trúc trang ghi lại thuộc tính thích hợp trang liên kết, chẳng hạn số lượng tham chiếu 4.4 Ánh xạ nhớ (mm3 – Memory Mapping) Khi ảnh thực hiện, nội dung phải đưa vào khơng gian địa ảo tiến trình File thực thi khơng thực mang vào nhớ vật lý, mà thay vào đơn liên kết đến nhớ ảo tiến trình Sau ảnh mang vào nhớ phần chương trình tham chiếu ứng dụng chạy Sự liên kết ảnh vào không gian địa ảo tiến trình gọi ánh xạ nhớ Mỗi nhớ ảo tiến trình miêu tả cấu trúc liệu mm_struct Cấu trúc chứa thông tin ảnh thực thi trỏ đến số cấu trúc liệu vm_area_struct Mỗi cấu trúc liệu vm_area_struct mô tả điểm bắt đầu kết thúc khu vực nhớ ảo, quyền truy cập tiến trình đến nhớ hoạt động nhớ Các hoạt động tập hợp thường trình (routine) mà Linux phải sử dụng xử lý khu vực nhớ ảo Ví dụ, hoạt động nhớ ảo thực hiệu chỉnh tiến trình tìm cách truy cập vào nhớ ảo mà khơng có giá trị 18 18 tương ứng nhớ vật lý (thông qua lỗi trang) Hoạt động hoạt động nopage Hoạt động nopage sử dụng Linux yêu cầu trang ảnh thực thi nhớ Khi ảnh thực thi ánh xạ vào địa ảo tiến trình, tập hợp cấu trúc liệu vm_area_struct thực Mỗi cấu trúc liệu vm_area_struct mô tả phần ảnh thực thi, đoạn mã thực thi, liệu khởi tạo (là biến), liệu không khởi tạo, Linux hỗtrợ số hoạt động nhớ ảo chuẩn CHƯƠNG V: CẤP PHÁT VÀ GIẢI PHĨNG VÙNG NHỚ Hình ảnh nhớ: - Code segment: Chứa mã thực thi chương trình - Data segment: chứa liệu chương trình (các biến cấp phát tĩnh) - Heap segment: vùng nhớ dành cho cấp phát động Vùng heap mở rộng lên có yêu cầu cấp phát nhớ - Stack segment: vùng nhớ dành cho stack chương trình Stack mở rộng xuống push liệu vào start_stack Stack segment end_brk Heap segment start_brk end_data Data segment start_data end_code Code segment start_code Quản lý nhớ: Mỗi khối nhớ cấp phát gồm có phần: Phần nhớ để quản lý vùng nhớ cấp phát cho người dùng Vùng chứa thông tin quản lý chiếm 19 19 byte, gồm phần Vùng nhớ cấp phát cho người dùng có chiều dài size Cấu trúc MemBlock dùng để chứa thơng tin quản lý vùng nhớ: o size: kích thước vùng data, chiếm byte (số nguyên) o next: trỏ đến vùng nhớ (để tạo thành danh sách liên kết), chiếm byte Vùng data vùng nhớ cấp phát cho người dùng Kích thước vùng size Các vùng nhớ trống quản lý danh sách liên kết, trỏ tới trỏ freeList Nó trỏ tới vùng nhớ nhớ trống (xem 4.3) Con trỏ next vùng MemBlock trỏ tới vùng nhớ trống để tạo thành danh sách liên kết Vùng nhớ trống cuối tới NULL allocListist freeList Free memory Occupied memory size size next size size next next size size next next next 5.1 CẤP PHÁT VÙNG NHỚ A Cấp phát vùng nhớ giản đơn Vùng nhớ giản đơn vùng nhớ có kích thước nhỏ kích thước nhớ vật lý Chúng ta cấp phát vùng nhớ cho tiến trình dựa vào hàm malloc() thư viện C chuẩn: void*malloc(size_tsize); Ví dụ: memory1.c #include 20 20 #define Kich_thuoc(1024*1024) //với Mb nhớ /* -*/ int main(){ char *some_memory; int megabyte=Kich_thuoc; int exit_code=EXIT_FAILURE; some_memory=(char*) malloc(megabyte); if(some_memory != NULL){ cout