Nghiờn cứu tỡm hiểu về bộ nhớ trong trong hệ điều hanh linux

27 409 0
Nghiờn cứu tỡm hiểu về bộ nhớ trong trong hệ điều hanh linux

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 BÀI TẬP LỚN MÔN NGUYÊN LÝ HỆ ĐIỀU HÀNH ĐỀ TÀI: Nghiên cứu tìm hiểu nhớ trong hệ điều hanh Linux Giáo Viên Hướng Dẫn: Th.s Nguyễn Thanh Hải Sinh Viên Thưc Hiên: 1.Nguyễn Văn Toàn 2.Nguyễn Văn Thủy 3.Nguyễn Doãn Huyên 4.Nguyễn Đăng Thạo 5.Phan Mạnh Cường 6.Nguyễn Duy Dũng Nhóm 4: Lớp :ĐH HTTT1- K8 Hà Nội, Ngày … Tháng … Năm 2015 Phụ Lục Lời mở đầu Vài 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 chúng mang lại cho máy tính 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 Nó tương tác tốt với hệ điều hành: Apple , Microsoft Novell Không phải ngẫu nhiên 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ở, sử dụng Linux an toàn ứng dụng Windows Linux đem đến cho lợi ích kinh tế với nhiều phần mềm miễn phí Mã nguồn mở hệ điều hành chương trình Linux tài liệu vô giá để học hỏi kỹ thuật lập trình vốn tài liệu không công bố ứng dụng Windows Trong đồ án này, tìm hiểu phần quan trọng hệ điều hành Linux là: quản lý nhớ Linux Một hệ điều hành muốn chạy ổn định phải có chế quản lý nhớ hiệu Cơ chế trình bày cách chi tiết đồ án có kèm theo chương trình minh họa I Mở đầu Giới thiệu 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 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 Ngoà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ể Tổng quan quản lý nhớ Linux Trong hệ thống máy tính, nhớ tài nguyên khan 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ị 128Mb nhớ Các máy chủ server lên đến hàng gigabyte nhớ Thế nhu cầu nhớ không thỏa mãn 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 cho chương trình chạy HĐH - gọi tiến trình mô hình đánh địa phẳng không phân đoạn segmentoffset DOS Mỗi tiến trình thấy vùng không gian địa riêng Hầu tất phiên UNIX cung cấp cách bảo vệ nhớ theo chế bảo đảm tiến trì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ớhệ thống cấp phát cho tiến trình đọc ghi tiến trình khác Trong hầu hết hệ thống Linux UNIX, trỏ sử dụng số nguyên 32 bit trỏ đến ô nhớ cụ thể Với 32 bit, hệ thống đánh địa lên đến GB nhớ Mô hình nhớ phẳng dễ truy xuất xử lý nhớ phân đoạn segmentoffset Ngoài ra, vài hệ thống sử dụng mô hình địa 64 bit, không gian địa mở rộng đến terabyte Để tăng dung lượng nhớ sẵn có, Linux cài đặt chương trình phân trang đĩa tức lượng không gian hoá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ờ 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 hoán đổi không thay RAM 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 Cơ chế phân đoạn, phân trang Sự phân đoạn: II 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 OxBFFFFFFF) không gian địa tiến trình nội dung chúng đọc chỉnh sửa chế độ người dùng chế độ Kernel Hai phân đoạn liên quan đến GB thứ (tò OxCOOO 0000 đến OxFFFFFFFF) 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 Sự phân trang Nhu cầu phân trang a) Vì có 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 Ví dụ, chương trình sở liệu thực truy vấn vào sở liệu Trong trường hợp toàn sở liệu load vào nhớ mà load ghi có liên quan Việc mà load trang ảo vào nhớ chúng truy cập dẫn đến nhu cầu phân trang b) Trang lưu trữ Cache tầng nằm phần quản lý nhớ kernel phần vào đĩa Các trang mà kernel hoá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 Đặc tính chung trang danh sách trang theo chuẩn LRU(Least Recently Used : sử dụng thường xuyên nhất) : active_list: 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_ỉist: 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: 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 Neu lỗi tìm thấy đưa đến active_list để đưa thông báo *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 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 tham chiếu, dẫn đến kích hoạt hàm re_fill inactive() 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 tham chiếu có age == 0, nên mục bảng trang bị xóa Tất nhiên, thời gian tiến trình ánh xạ đến Hàm swap_out thực không đưa trang p 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, 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àm find_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_ launderO 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_ launderO 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 ) 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 tiến trình tham chiếu đến page cache - Hàm page_ launder() thực lại để tìm trang không sử dụng clean, đưa chúng đến inactive_clean_list - 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 page cache ( điều bảo đảm tiến trình khác tham chiếu đến trình quản lý lỗi trang ), đưa cho lời gọi trang trống Hoặc : Hàm kreclaimd() cố gắng tạo nhớ trống Nó giành lại trang p xóa Đây chuỗi kiện hợp lý : trang sống page cache thòi gian dài, chết đi, lại phục hồi trở lại, Trang phục hồi từ inactive_clean, active lists hay inactive_dirty list Trang đọc trang dirty, hàm page launder() đưa chúng từ inactive dirty list đến inactive clean_list để làm trống Các trang inactive_clean list kiểm tra định kì nhằm tạo khối nhớ trống lớn liên tiếp để đáp ứng có yêu cầu Tóm lại, trang p thực chất trang logic, thể vài trang vật lý cụ thể c) Bảng trang (page table) Hình 2.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 cách mà địa ảo chia thành trường Mỗi trường cung 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 Mỗi mà Linux chạy phải cung cấp chuyển đổi macro cho phép kernel hiểu bảng trang tương ứng Do đó, kernel không cần biết định dạng mục bảng trang cách xếp Điều giúp cho Linux thành công việc sử dụng đoạn mã để xử lý bảng trang xử lý Alpha ( có mức bảng trang ) đối vói xử lý Intel x86 ( có mức bảng trang ) d) Đị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 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ớ : - 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 - map_nr : 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 Toà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 Hình cho thấy cấu trúc free_area Phần tử có trang trống (khung trang số ), phần tử có khối trống gồm trang ( khối khung trang số 4, khối thứ hai khung trang số 56 ) - Đị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 10 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 3: Mô hình trừu tượng ánh xạ tù địa ảo đến địa vật lý Trong mô hînh này, địa chï ảo bao gôm hai phầnn : địa offset số khung trang ảo Nêu kích thước trang 4Kbyte từ bit 11 đến bit cua địa chi chứa địa offset, từ bit 12 trở lên sô khung trang ảo lần sử 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ậ lý sau truy cập vào địa offset trang vật lý Dể làm điều xử lý sử dụng bảng trang Hình không gian địa ảo tiến trình X Y, tiến trình có bảng trang riêng Mỗi 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 có thành phần sau : - Cờ hợp lệ : cho biết mục 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 truy cập nhờ sử dụng số khung trang ảo địa 13 offset Khung trang ảo số phần tử thứ trang bảng Để 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 Neu mục bảng trang địa offset hợp lệ xử lý lấy số khung trang vật lý từ mục Neu 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ự Tạo không gian hoán đổi Một file swap file thông thường, đặc biệt kernel Điều mà có nghĩa kernel 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 nhanh chóng mà 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 disk sector định vị nên kernel sử dụng file Cách tốt để tạo file swap mà vùng trống thực đoạn lệnh 14 sau : $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 Neu kích thước bội số cặp Kbyte cuối không sử dụng Một phân vùng swap đặ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 hoàn toà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 mkswapo, sử dụng sau : $ mkswap/extra-swap 1024 Setting up swapspace, size = 1044480 bytes $ Chú ý không gian hoá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 mkswapo 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 hoán đổi 127MB Tuy nhiên bạn sử dụng lúc tới không gian hoán đổi nên tổng kích thước lên đến 1GB Điều không đúng, với phiên kernel mói giới hạn thay đổi tùy thuộc vào cấu trúc Ví dụ đối vói xử lý Ì386 giới hạn 2GB Sử dụng không gian hoán đổi Một không gian hoán đổi khởi tạo lấy để sử dụng nhờ lệnh swapon Lệnh báo cho kernel không gian hoán đổi sử dụng Đường dẫn đến không gian hoán đổi cấp đối số, để bắt đầu hoán đổi file swap tạm thời, bạn sử dụng đoạn lệnh sau: $ swapon /extra-swap $ Không gian hoán đổi sử dụngtựđộng cách liệt kê chúng 15 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 hoá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 hoán đổi thêm Bạn quản lý việc sử dụng không gian hoán đổi với lệnh free Nó cho biết tổng số không gian hoán đổi sử dụng $ free total used free shared buffers $ Một không gian hoán đổi bị loại bỏ lệnh swapoff Thông thường không cần phải dùng lệnh ngoại trừ không gian hoán đổi tạm thời Bất kì trang sử dụng không gian hoán đổi đưa vào trước Neu đủ nhớ vật lý để chứa chúng chúng đưa đến không gian hoán đổi khác Neu đủ nhớ ảo để chứa tất trang, Linux bắt đầu dừng lại (thrash), sau khoảng thời gian dài khôi phục lúc hệ thống sử dụng Bạn nên kiểm tra ( lệnh free ) để xem có đủ nhớ trống không trước loại bỏ không gian hoán đổi Tất không gian hoán đổi sử dụng tự động nhờ lệnh swapon -a loại bỏ với lệnh swapoff -a, lệnh tìm thông tin file /etc/fstab để loại bỏ Còn không gian hoán đổi điều khiển tay sử dụng bình thường Đôi có nhiều không gian hoá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 hoá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ớ Dữ liệu đưa không tự động đưa vào cần, nhớ vật lý trống thời gian dài Bạn không cần phải lo lắng điều mà cần biết điều xảy Định vị không gian hoán đổi Người ta thường nói bạn nên định vị không gian hoán đổi gấp đôi nhớ vật lý, quy luật Bạn xem cách làm sau : + 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 16 Lệnh free ps có ích để đoán lượng nhớ cần dùng + Cộng thêm vào dự đoán bước 1, dự đoá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 Nên định vị dư thiếu không dư nhiều gây lãng phí Bạn nên làm tròn lên thành số chẵn megabyte + Dựa tính toán trên, bạn biết cần tổng cộng nhớ Vì vậy, để định vị không gian hoán đổi, bạn cần lấy tổng nhớ dùng trừ cho nhớ vật lý + Neu không gian hoá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 hoán đổi cho dù theo tính toá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 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ớ Cơ chế quản lý nhớ vật lý, ánh xạ nhớ IV Quản lý nhớ vật lý a) Bộ định vùng Các bảng trang kernel ánh xạ tối đa nhớ vật lý vào dãy địa bắt đầu PAGE_OFFSET Các trang vật lý chiếm đoạn mã liệu kernel dành riêng không sử dụng cho mục đích khác Các trang vật lý khác định vị cho nhớ ảo tiến trình, nhớ đệm, nhớ ảo kernel, cần Để làm điều này, phải có cách theo dõi trang vật lý sử dụng sử dụng Bộ định vùng ( zone allocator ) quản lý nhớ vật lý Bất kì mã kernel gọi tới định vùng thông qua hàm alloc_pages() cấp khối gồm 2n trang canh đường biên tương ứng Chúng ta chuyển khối trang lại cho định vùng nhờ hàm free_pages() số mũ n gọi thứ tự định vùng Các khối không cần phải giải phóng giống cách mà chúng xác định, phải giải phóng xác, khung trang khối phải có số tham chiếu khác Ví dụ, bạn yêu cầu khối trang, sau giải phóng khối trang khối trang đó, muốn làm điều trước hết bạn phải tăng biến tham chiếu trang khối trang Lý bạn định vị khối trang, có biến tham chiếu trang khối tăng, mặt khác đoạn mã giải phóng trang không giải phóng trang có biến tham chiếu 0, nên biến tham chiếu trang khác phải điều khiển tay Việc tăng tất biến tham chiếu trang khối không cần thiết đồng thời làm tăng kích thước đoạn mã định vị trang b) Các vùng 17 Các dãy trang vật lý khác có thuộc tính khác nhau, phục vụ cho mục đích kernel Ví dụ, DMA ( Direct Memory Access ) cho phép thiết bị ngoại vi đọc viết liệu trực tiếp lên RAM mà can thiệp CPU, làm việc vói địa vật lý nhỏ 16MB Một vài hệ thống có nhớ vật lý nhiều ánh xạ PAGE_OFFSET 4GB, trang vật lý truy cập trực tiếp đến kernel, chúng phải quản lý theo cách khác Bộ định vùng quản lý khác cách chia nhớ thành vùng xem vùng đơn vị cho định vị Cấu trúc liệu root quản lý định vùng zone_struct, gồm tập hợp tất liệu liên quan đến việc quản lý vùng cụ thể Zonelist_struct bao gồm mảng trỏ zone_struct gfp_mask chế định vị sử dụng zone_list Zone_struct offset địa offset nơi bắt đầu vùng nhớ vật lý Á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ớ 18 Hì nh : Areas of Virtual Memory 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à giá trị 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 ( biến ), liệu không khởi tạo, Linux hỗ trợ số hoạt động nhớ ảo chuẩn V a) Cấp phát giải phóng vùng nhớ Cấp phát vùng nhớ Cấp phát vùng nhớ đơn giả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 19 void *malloc(size_t size); Không giống DOS Windows, sử dụng hàm này, không cần phải khai báo thư viện malloc.h size : kích thước vùng nhớ muốn cấp phát, size có kiểu size_t Thực size_t định nghĩa kiểu nguyên không dấu unsigned int Ví dụ : memoryl.c #include #include #include #define Kich_thuoc( 1024* 1024) //1 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){ sprintf(some_memory,"Cap phat vung nho gian don "); printf(" % s",some_memory); exit_code=EXIT_S UCCESS; } exit(exit_code) } Chương trình yêu cầu hàm malloc() cấp phát trả trỏ trỏ đến vùng nhớ MB Chương trình kiểm tra trỏ Null để đảm bảo hàm malloc( ) cấp phát thành công Tiếp theo chuỗi "Cap phat vung nho gian don" đặt vào phần đầu vùng nhớ Tuy chuỗi " Cap phat vung nho gian don" không chiếm hết MB vùng nhớ hàm malloc( ) cấp phát vùng nhớ kích cỡ chương trình yêu cầu.Hàm malloc( ) trả trỏ *void( trỏ dạng tổng quát), chương trình cần phải chuyển trỏ dạng char* để truy cập đến vùng nhớ theo dạng chuỗi kí tự Hàm malloc() bảo đảm vùng nhớ cấp phát dãy byte xếp liền Vì lý này, định nghĩa kiểu trả trỏ liệu b) Cấp phát vùng nhớ lớn Vùng nhớ lớn có kích thước vượt kích thước thật nhớ vật lý Do chưa biết hệ thống có chấp nhận hay không nên trình 20 xin cấp phát, hệ thống ngắt ngang nhớ cạn kiệt Ví dụ : memory2.c #include #include #include #define Kich_thuoc( 1024* 1024) //1 Mb nhớ /* -*/ int main( ){ char *some_memory; size_t size_to_allocate= Kich_thuoc; int megs_obtained=0; while( megs_obtainde< 16) { some_memory=(char *)malloc(size_ro_allocate); if (some_memory != NƯLL){ megs_obtained ++; sprintf(some_memory,"Cap phat vung nho lon"); printf("%s-now allocated%dMegabytes\n",some_memory,megs_obtained); } else{ exit(EXIT_FAILURE) ; } } exit(EXIT_SUCCESS ) ; } Chương trình tương tự chương trình cấp phát vùng nhớ giản đơn Nó thực vòng lặp yêu cầu cấp phát liên tục vùng nhớ ( đến 512 Mb) Chương trình chạy hoàn toàn tốt đẹp chạy chớp mắt Rõ ràng hệ thống có khả đáp ứng nhu cầu xin cấp phát vùng nhớ lớn, lớn vùng nhớ vật lý có sẵn máy Tuy nhiên, xem lần cấp phát vùng nhớ chương trình memory3.c này, khả đáp ứng hệ thống đủ hay không Chương trình memory3.c xin cấp phát lần 1Kb nhớ ghi liệu vào Chương trình thực làm cạn kiệt tài nguyên hay chậm hệ thống, bạn nên đóng tất ứng dụng trước chạy thử 21 Ví dụ : memory3.c #include #include #include #define ONE_K(1024) /* -*/ int main(){ char *some_memory; int size_to_allocate= ONE_K; int megs_obtained=0; int ks_obtained=0; while(l){ for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++) { some_memory= (char *)malloc(size_to_allocate); if (some_memory == NULL) exit (EXIT_FAILURE); sprintf(some_memory, "Hello world"); } megs_obtained++; printf("Now allocated %d Megabytes\n", megs_obtained); } exit(EXIT_SUCCESs ) ; } Lần cấp phát 154Mb chương trình chấm dứt Hơn chương trình chạy chậm memeory2.c Tuy nhiên, nhớ xin cấp phát có khả lớn nhớ vật lý có sẵn Bộ nhớ mà ứng dụng yêu cầu phân bổ quản lý hạt nhân Linux UNIX Mỗi lần chương trình yêu cầu vùng nhớ cố đọc ghi vào vùng nhớ phân bổ trước đó, hạt nhân Linux theo dõi định xem cần xử lý yêu cầu Khởi đầu, hạt nhân hoàn toàn đơn giản sử dụng vùng nhớ vật lý trống để thỏa mãn yêu cầu vùng nhớ cho ứng dụng Tuy nhiên , vùng nhớ vật lý bị đầy hay cấp phát hết, hạt nhân bắt đầu dùng đến không gian hoán đổi Trên hầu hết phiên Linux UNIX, vùng không gian hoán đổi nằm riêng biệt phân vùng Hạt nhân thực việc di 22 chuyển liệu mã lệnh chương trình từ vùng nhớ vật lý không gian tráo đổi ngược lại Khi ứng dụng yêu cầu cấp phát vùng nhớ mà không gian tráo đổi lẫn nhớ vật lý thật đầy hệ thống cấp phát hoán chuyển nhớ Trong trình xin cấp phát vùng nhớ, cần phải đặc biệt lưu ý đến số lần kích thước vùng nhớ xin cấp phát Điều ảnh hưởng đến hiệu vùng nhớ cấp phát Ví dụ yêu cầu cấp phát 10 lần , lần Kb, thu 10 khối nhớ rời , khối đảm bảo Kb Tuy nhiên để tăng hiệu yêu cầu cấp phát lần vói kích thước khối nhớ 10 Kb xếp liên tục gần Hệ điều hành quản lý khối nhớ cấp phát theo danh sách liên kết Nếu khối nhớ nhỏ rời rạc danh sách liên kết lớn chiếm nhiều không gian thời gian quản lý c) Vùng nhớ bảo vệ Mặc dù tiến trình dành cho Gb không gian địa tiến trình đọc/ghi liệu tùy tiện chưa xin HĐH cấp phát Bạn chép liệu vào vùng nhớ mà HĐH cấp phát thông qua malloc() Neu tiến trình cố gắng đọc hay ghi liệu vào vùng nhớ mà chưa cấp phát, HĐH định cắt ngang chương trình với lỗi trang hay gọi lỗi phân đoạn (segment fault) cho dù vùng nhớ nằm không gian địa Gb Chương trình sau xin cấp phát vùng nhớ 1024 bytes ghi liệu vào tòng byte Ta cố ý ghi liệu vào byte cuối vùng nhớ (byte thứ 1025) Ví dụ: memory4.c #include #include #define C)NE_K(1024) /* */ int main(){ char *some_memory; char *scan_ptr; int count=0; some_memory= (char *)malloc(ONE_K); if (some_memory==NULL) exit (EXIT_FAILURE); scan_ptr= some_memory; while(l){ prinf("write byte %d", ++count); 23 *scan_ptr ='\0'; scan_ptr ++;} exit(EXIT_SUCCESS);} Khi chương trình bị lỗi hệ thống , HĐH ghi toàn ảnh tiến trình nhớ ( bao gồm thị lệnh thực thi bị lỗi) xuống đĩa với tên file core Có dùng file với chương trình debug để biết nguyên nhân sinh lỗi d) Một số hàm cấp phát vùng nhớ khác - Hàm calioc() Hàm không sử dụng phổ biến hàm malloc( ) Hàm cho phép vùng nhớ cấp phát thiết kế phân bổ vùng nhớ cho mảng cấu trúc (table) void *calloc( size_t nmemb, size_t size); Hàm yêu cầu tham số khó hàm malloc(): + tham số nmemb số phần tử mảng (số ô table) + tham số size thị kích cỡ phần tử mảng (kích thước ô table) Vùng nhớ cấp phát khởi tạo với giá trị zero Neu thành công , giá trị trả hàm trỏ trỏ đến phần tử mảng ngược lại hàm trả giá trị NULL Tương tự hàm malloc( ) lần gọi tiếp theo, calloc( ) không đảm bảo cung cấp cho chương trình vùng nhớ liên tục với lời gọi trước - Hàm realioc() Hàm không sử dụng phổ biến Hàm chỉnh sửa kích cỡ khối nhớ cấp phát trước void *realloc(void *ptr, size_t size); Hàm nhận đối số trỏ ptr trỏ đến vùng nhớ trả hàm cấp phát malloc( ), calloc( ), chí kể hàm realloc( ), sau thực co giãn hay tăng giảm khối nhớ theo kích thước size định Hàm đảm bảo vùng nhớ đạt kích thước yêu cầu Neu thành công, giá trị trả hàm trỏ trỏ đến vùng nhớ thay đổi kích thước Một điều lưu ý chương trình nên dùng trỏ khác để nhận kết hàm realloc( ) trả về, không sử dụng lại trỏ chuyển cho realloc( ) trước Ngược lại, vùng nhớ thay đổi kích thước yêu cầu , hàm trả trỏ NULL Do gán cho giá trị trả hàm realloc( ) trỏ sử dụng hàm không thành công, trả giá trị NULL vùng nhớ trỏ trỏ đến trước bị thất lạc Giải phóng vùng nhớ Đối với tiến trình yêu cầu cấp phát vùng nhớ nhỏ, sử dụng chúng thờii gian ngắn kết thúc HĐH tự động giải phóng vùng nhớ 24 tiến trình kết thúc Tuy nhiên hầu hết tiến trình có nhu cầu cấp phát vùng nhớ động lớn, yêu cầu cấp phát , HĐH không hỗ trợ việc giải phóng vùng nhớ, chương trình cần phải giải phóng vùng nhớ không dùng đến cách sử dụng hàm free( ) void free( void *ptr_to_memory); Khi sử dụng khai báo kèm theo thư viện stdlib.h * ptr_to_memory trỏ trỏ đến vùng nhớ cần giải phóng Thường trỏ hàm malloc(), calloc() realoc() trả Ví dụ: memory5.c #include #define ONE_K(1024) int main(){ char*some_memory; int exit_code=EXIT_FAILURE; some_memory=(char*)malloc(ONE_K) if(some_memory!=NULL) { free(some_memory); exit_code=EXIT_SUCCESs; } exit(exit_code) } Sau vùng nhớ giải phóng, trỏ trỏ đến vùng nhớ giải phóng sử dụng (không thể đọc/ghi) hệ thống loại bỏ vùng nhớ khỏi quản lý HĐH Mọi thao tác đọc ghi vùng nhớ giải phóng gây lỗi Truy xuất trỏ NULL Linux bảo vệ chặt chẽ việc đọc/ghi trỏ NULL Do Linux sử dụng thư viện chuẩn GNU (hàm sprintí printf) nên việc đọc trỏ NULL phép Thư viện GNU đơn giản trả cho bạn chuỗi "null", nhiên ghi vào trỏ Null bị cấm Ví dụ: memory6.c #include #include #include int main() { 25 char *some_memory=(char*)0; printf("doc tu tro null %s\n", some_memory); sprintf(some_memory,"ghi vao tro null"); exit (EXIT_SUCCESS); } Nếu không sử dụng hàm thư viện GNU việc đọc trỏ NULL bị cấm 26 Kết Luận Như ta thấy từ đời đến này, tính đến thời điểm tại, Linux đă có nhiều biến thể phiên khác nhau, xây dựng phát triển riêng biệt công ty phần mềm cá nhân Hiện nay, sau 20 năm tồn phát triển, Linux sử dụng rộng răi toàn giới, máy tính cá nhân, máy chủ, đến thiết bị di động, máy nghe nhạc, máy tính bảng, máy ATM chí siêu máy tính… Ngày nay, Linux xem biểu tượng chia sẻ cộng đồng, phát triển cộng đồng ủng hộ hoàn toàn miễn phí Với tính năngngày tiên tiến, hệ thống File nâng cấp, hoàn thiện đáp ứng nhu cầu người sử dụng Hệ điều hành Linux ngày phát triển tương lai 27 ... thiệu 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. .. không công bố ứng dụng Windows Trong đồ án này, tìm hiểu phần quan trọng hệ điều hành Linux là: quản lý nhớ Linux Một hệ điều hành muốn chạy ổn định phải có chế quản lý nhớ hiệu Cơ chế trình bày cách... lý nhớ Linux Trong hệ thống máy tính, nhớ tài nguyên khan 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ị 128Mb nhớ Các máy chủ server lên đến hàng gigabyte nhớ

Ngày đăng: 20/04/2017, 23:06

Mục lục

  • ĐỀ TÀI: Nghiên cứu tìm hiểu về bộ nhớ trong trong hệ điều hanh Linux

  • Giáo Viên Hướng Dẫn: Th.s Nguyễn Thanh Hải

  • Sinh Viên Thưc Hiên:

  • Nhóm 4: Lớp :ĐH HTTT1- K8

  • I. Mở đầu

    • 1. Giới thiệu về hệ điều hành Linux

    • 2. Tổng quan về quản lý bộ nhớ trong Linux

    • 2. Sự phân trang

      • a) Nhu cầu phân trang

      • b) Trang lưu trữ

      • c) Bảng trang (page table)

      • d) Định vị và giải phóng trang:

      • III. Cơ chế quản lý bộ nhớ ảo

        • 1. Khái niệm bộ nhớ ảo, không gian hoán đổi

        • 2. Mô hình bộ nhớ ảo

        • 3. Tạo không gian hoán đổi

        • 4. Sử dụng không gian hoán đổi

        • 5. Định vị không gian hoán đổi

        • IV. Cơ chế quản lý bộ nhớ vật lý, ánh xạ bộ nhớ

          • 1. Quản lý bộ nhớ vật lý

            • a) Bộ định vùng

            • 2. Ánh xạ bộ nhớ(mm3 - Memory Mapping)

            • V. Cấp phát và giải phóng vùng nhớ

              • 1. Cấp phát vùng nhớ

                • a) Cấp phát vùng nhớ đơn giản

                • b) Cấp phát vùng nhớ lớn

                • c) Vùng nhớ được bảo vệ

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan