Top 16 # Sự Giống Nhau Và Khác Nhau Của Bộ Nhớ Trong Và Bộ Nhớ Ngoài / 2023 Xem Nhiều Nhất, Mới Nhất 12/2022 # Top Trend | Sansangdethanhcong.com

Sự Giống Và Khác Nhau Của Các Loại Bộ Nhớ Trong Máy Tính / 2023

Sự giống và khác nhau của các loại bộ nhớ trong máy tính

Đều là bộ phận được sử dụng để lưu trữ thông tin, dữ liệu máy tính là điểm tương đồng cơ bản nhất giữa bộ nhớ ngoài và bộ nhớ trong của máy tính. Mọi dữ liệu về phần mềm, chương trình, hoạt động đang diễn ra của máy tính đều được lưu trữ trên các loại bộ nhớ này.

Bên cạnh chức năng cơ bản, hệ thống nhớ của máy tính còn là bộ phận đảm bảo máy có thể khởi động, vận hành mượt mà, không giật lag. Máy cần có dung lượng RAM lớn để hoạt động đa nhiệm ổn định, ổ cứng tốc độ đọc nhanh cao để chạy phần mềm ổn định…

Chức năng cơ bản giữa các loại bộ nhớ trong máy tính là giống nhau nhưng về đặc điểm, nhiệm vụ thực sự, đặc điểm lại có khá nhiều điểm khác biệt:

Ngoài ROM thì RAM và bộ nhớ đệm Cache của bộ nhớ trong thực hiện hiện nhiệm vụ lưu trữ dữ liệu tạm thời. Dữ liệu trong cả 2 loại bộ nhớ trong này đều sẽ mất đi nếu nguồn điện bị ngắt. Dữ liệu được lưu trữ trong RAM và bộ nhớ đệm Cache được lưu lại giúp CPU có thể truy xuất và xử lý dữ liệu nhanh hơn.

Riêng với ROM, dữ liệu đã được lập trình sẵn nên chức năng của nó chỉ là đọc.

Bộ nhớ trong được gắn bên trong thùng máy. Tốc độ đọc ghi của bộ nhớ trong cao hơn nhiều so với những thiết bị của bộ nhớ ngoài.

Bộ nhớ ngoài là những thiết bị dùng ngoài thùng máy, có chức năng lưu trữ, sao lưu dữ liệu của máy. Những dữ liệu này sẽ không biến mất ngay cả khi ngắt máy. Tuy tốc độ đọc ghi của bộ nhớ ngoài thấp nhưng vì mức giá trên mỗi Gigabyte thấp nên đây chính là lựa chọn tối ưu với những ai có nhu cầu lưu trữ tệp, dữ liệu lớn.

Với sự so sánh kể trên, hy vọng bạn có thể phân biệt được điểm khác nhau của các loại bộ nhớ trong máy tính.

Bộ nhớ trong hay bộ nhớ ngoài quan trọng hơn?

Bộ nhớ ngoài hay bộ nhớ trong, không có cái nào quan trọng hơn cái nào vì không có chúng máy của bạn khó có thể hoạt động ổn định. Có nhiều lý do để khẳng định như vậy:

Chất lượng RAM ảnh hưởng lớn đến độ ổn định, tốc độ xử lý nhanh chóng của máy tính. Một số thông số quan trọng của RAM như:

DDR3, DDR4: tốc độ truyền tải dữ liệu những loại RAM này khác nhau, DDR4 được đánh giá cao hơn DDR3.

Bus: giá trị càng lớn, tốc độ truyền tải dữ liệu của RAM càng nhanh

Băng thông: tốc độ đọc ghi. Giá trị này ảnh hưởng lớn đến khả năng load khi bạn chuyển giữa các tab đang hoạt động.

Bất cứ một chỉ số nào thay đổi ở RAM cũng ảnh hưởng đến tốc độ truy xuất dữ liệu trên máy tính của bạn. Ngay cả số lượng thanh RAM trong máy cũng ảnh hưởng đến tốc độ xử lý này. Máy có nhiều thanh RAM sẽ hình thành hệ thống truyền thông tin đa kênh → Mỗi chu kì sẽ tăng nhiều lần hiệu quả nạp xuất dữ liệu.

Ổ cứng đang trở thành một thiết bị thuộc bộ nhớ ngoài không thể thiếu trong máy tính để bàn. Ổ đĩa cứng giúp lưu trữ lượng lớn dữ liệu, hỗ trợ chạy phần mềm máy tính nhanh hơn. Với những PC đặc thù như: thiết kế đồ họa, dựng video, gaming thì ổ cứng lại càng được chú trọng đầu tư hơn.

Một ổ cứng dung lượng lớn, chất lượng sẽ giúp máy khởi động chương trình, phần mềm, ứng dụng nặng nhanh hơn. Hiện nay, ổ cứng máy tính thường được gắn trực tiếp vào thùng máy tính.

Ổ cứng Kingston được đánh giá cao về chất lượng

⇒ Bộ nhớ trong hay bộ nhớ ngoài đều quan trọng với máy tính. Tùy vào nhu cầu sử dụng, bạn cần nâng cấp, lựa chọn từng thiết bị cho phù hợp.

Sự Khác Nhau Giữa Bộ Nhớ Heap Và Bộ Nhớ Stack Trong Lập Trình / 2023

Như chúng ta đã biết thì việc Quản lý bộ nhớ đối với một lập trình viên là rất quan trọng.

Mục đích quan trọng của việc quản lý bộ nhớ là cung cấp những cách thức để cấp phát động các ô nhớ cho chương trình khi được yêu cầu và giải phóng các ô nhớ đó khi không cần dùng nữa. Đây là việc rất quan trọng đối với bất kỳ hệ thống máy tính cao cấp nào vì sẽ có nhiều công việc được tiến hành ở mọi thời điểm.

Nhiều phương pháp đã được tìm ra để gia tăng hiệu quả của việc quản lý bộ nhớ. Những hệ thống bộ nhớ ảo giúp tách những địa chỉ ô nhớ đang được dùng ra khỏi những địa chỉ thực, từ đó cho phép chia sẻ công việc và gia tăng lượng RAM một cách hiệu quả nhờ đánh dấu địa chỉ hoặc chuyển đến vùng lưu trữ thứ hai. Chất lượng của việc quản lý bộ nhớ ảo có thể có tác dụng lớn đến hiệu năng làm việc của hệ thống nói chung.

Bộ nhớ Heap và bộ nhớ Stack bản chất đều cùng là vùng nhớ được tạo ra và lưu trữ trong RAM khi chương trình được thực thi.

Bộ nhớ Stack được dùng để lưu trữ các biến cục bộ trong hàm, tham số truyền vào… Truy cập vào bộ nhớ này rất nhanh và được thực thi khi chương trình được biên dịch.

Bộ nhớ Heap được dùng để lưu trữ vùng nhớ cho những biến con trỏ được cấp phát động bởi các hàm malloc – calloc – realloc (trong C) hoặc từ khóa new (trong c++, c#, java,…).

Ví dụ trong ngôn ngữ lập trình C++:

Ngoài ra, còn rất nhiều trọng điểm để so sánh sự khác nhau giữa bộ nhớ Heap và bộ nhớ Stack như :

Kích thước vùng nhớ Stack: kích thước của bộ nhớ Stack là cố định, tùy thuộc vào từng hệ điều hành, ví dụ hệ điều hành Windows là 1 MB, hệ điều hành Linux là 8 MB (lưu ý là con số có thể khác tùy thuộc vào kiến trúc hệ điều hành của bạn). Heap: kích thước của bộ nhớ Heap là không cố định, có thể tăng giảm do đó đáp ứng được nhu cầu lưu trữ dữ liệu của chương trình.

Đặc điểm vùng nhớ Stack: vùng nhớ Stack được quản lý bởi hệ điều hành, dữ liệu được lưu trong Stack sẽ tự động hủy khi hàm thực hiện xong công việc của mình. Heap: Vùng nhớ Heap được quản lý bởi lập trình viên (trong C hoặc C++), dữ liệu trong Heap sẽ không bị hủy khi hàm thực hiện xong, điều đó có nghĩa bạn phải tự tay hủy vùng nhớ bằng câu lệnh free (trong C), và delete hoặc delete [] (trong C++), nếu không sẽ xảy ra hiện tượng rò rỉ bộ nhớ. Ở các ngôn ngữ lập trình bậc cao như .NET, Java, … đã có chế dọn rác tự động (Garbage Collection), bạn không cần phải tự tay hủy vùng nhớ Heap nữa.

Lưu ý: việc tự động dọn vùng nhớ còn tùy thuộc vào trình biên dịch trung gian.

Bạn sử dụng Stack nếu bạn biết chính xác lượng dữ liệu mà bạn phân bổ trước khi biên dịch và dữ liệu không quá lớn. Ngược lại, bạn nên sử dụng Heap…

Note: Trong các ứng dụng đa luồng chạy song song (multithreading), mỗi luồng xử lý (thread) sẽ có vùng nhớ Stack riêng của nó, trong khi tất cả các luồng cùng chia sẻ một vùng nhớ Heap. Sử dụng chung vùng nhớ Heap đồng nghĩa với việc phải đồng bộ hóa để tránh tình trạng xảy ra mâu thuẫn giữa các luồng, cho nên cấp phát vùng nhớ Heap phải cài đặt thêm một số cơ chế do đó thực hiện lâu hơn so với cấp phát vùng nhớ Stack. Cấp phát và hủy vùng nhớ Heap liên tục có thể xảy ra tình trạng phân mảnh bộ nhớ, từ phân mảnh bộ nhớ có thể dẫn đến lỗi cấp phát bộ nhớ thất bại như những mô tả ở trên.

All Rights Reserved

Sự Khác Nhau Giữa Bộ Nhớ Stack Và Heap? / 2023

Stack Heap

Vùng nhớ được cấp phát khi chương trình được biên dịch.

Vùng nhớ được cấp phát khi chạy chương trình (run-time).

Vùng nhớ stack được sử dụng cho việc thực thi thread. Khi gọi hàm, các biến cục bộ của hàm được lưu trữ vào block của stack (theo kiểu LIFO). Cho đến khi hàm trả về giá trị, block này sẽ được xóa tự động. Hay nói cách khác, các biến cục bộ được lưu trữ ở vùng nhớ stack và tự động được giải phóng khi kết thúc hàm.

Vùng nhớ heap được dùng cho cấp phát bộ nhớ động (malloc( ), new( )). Vùng nhớ được cấp phát tồn tại đến khi lập trình viên giải phóng vùng nhớ bằng lệnh free( ) hoặc delete.

Kích thước vùng nhớ stack được fix cố định. Chúng ta không thể tăng hoặc giảm kích thước vùng nhớ stack. Nếu không đủ vùng nhớ stack, gây ra stack overflow. Hiện tượng này xảy ra khi nhiều hàm lồng nhau hoặc đệ quy nhiều lần dẫn đến không đủ vùng nhớ.

Khi kích thước vùng nhớ heap không đủ cho yêu cầu malloc( ), new. Hệ điều hành sẽ có cơ chế tăng kích thước vùng nhớ heap.

Ví dụ: Minh họa stack được sử dụng khi gọi hàm

int MAX(int, int); void main( void ) { int a = 5, b = 7; int max = MAX(a, b); printf("nMAX(%d, %d) = %d", a, b, max); getch(); } int MAX(int a, int b) { }

Giải thích:

Các bạn nhìn Call Stack sẽ thấy hàm main( ) gọi hàm MAX( ). Hàm main( ) và MAX( ) được lưu theo quy tắc (LIFO: last in – first out). Khi kết thúc hàm MAX( ), các thông tin lưu trữ hàm MAX( ) bị xóa, stack chỉ lưu trữ thông tin của hàm main( ). Tương tự như vậy, khi kết thúc hàm main( ), stack được xóa hoàn toàn.

Quản Lý Bộ Nhớ Của Ứng Dụng Trong Android / 2023

Performance, một thứ vô cùng quan trọng đối với một ứng dụng trong Android, ảnh hưởng trực tiếp đến cảm quan người dùng, đặc biệt với các ứng dụng quy mô lớn. Hôm nay chúng ta sẽ đến với bài nhập môn về performance, đó là quản lý bộ nhớ của ứng dụng trong Android.

Random-access memory (RAM) là một nguồn tài nguyên quý giá trong bất kỳ môi trường phát triển phần mềm nào, và nó còn có giá trị hơn trên một hệ điều hành di động, nơi bộ nhớ vật lý thường được hạn chế. Mặc dù máy ảo Dalvik Android thông thường sẽ thực hiện việc thu gom rác thải, nhưng điều này cũng không cho phép bạn bỏ qua khi nào và nơi bạn đã cấp phát hay giải phóng bộ nhớ.

Để cho các bộ thu rác có thể lấy lại bộ nhớ từ ứng dụng, bạn cần tránh vấn đề memory leak và giải phóng bất kỳ một Refernce object nào tại thời điểm thích hợp. Với phần lớn ứng dụng, bộ gom rác Dalvik sẽ sử lý phần còn lại: hệ thống đòi cấp phát bộ nhớ khi object tương ứng ròi khỏi phạm vi của active thread của ứng dụng.

Cách để quản lý bộ nhớ ứng dụng Android

Android không cung cấp không gian trao đổi về bộ nhớ, nhưng nó sử dụng paging và memory-mapping (mmapping) để quản lý bộ nhớ.Nghĩa là bất kỳ bộ nhớ nào bạn sửa đổi cho dù bằng cách cấp phát các đối tượng mới hoặc động đến các trang mmapped -vẫn thường trú trong bộ nhớ RAM và không thể được paged ra. Vì vậy, cách duy nhất để hoàn toàn giải phóng bộ nhớ từ ứng dụng của bạn là để phát hành đối tượng quan hệ bạn có thể nắm giữ, làm cho bộ nhớ có thể được giải phóng. Đó là với một ngoại lệ: bất kỳ tập tin mmapped trong mà không sửa đổi, chẳng hạn như mã số, có thể được paged ra RAM nếu hệ thống muốn sử dụng bộ nhớ ở nơi khác.

Chia sẻ bộ nhớ

Để làm phù hợp tất cả mọi thứ nó cần trong bộ nhớ RAM, Android sẽ cố gắng để chia sẻ các trang bộ nhớ RAM trên quy trình. Nó có thể làm như vậy trong các cách sau:

Mỗi một tiến trình ứng dụng được chia ra từ một tiến trình có sẵn có tên Zygote. Tiến trình Zygote bắt đầu khi khi hệ thống khởi động và load các mã framework và resource chung (giống như activity theme). Để bắt đầu một ứng dụng tiến trình mới, hệ thống chia tiến trình Zygote ra, sau đó load và chạy code của ứng dụng trong một tiến trình mới. Điều này cho phép hầu hết các trang bộ nhớ RAM cấp phát cho code framework và resource có thể chia sẻ cho tất cả các tiến trình trong app.

Hầu hết dữ liệu tĩnh được ánh xạ vào một tiến trình. Điều này không chỉ cho phép cùng một dữ liệu được chia sẻ giữa các tiến trình mà còn cho phép nó được paged ra khi cần thiết.

Ở nhiều nơi, Android chia sẻ RAM động qua quá trình sử dụng được phân bổ một cách rõ ràng các vùng bộ nhớ chia sẻ (hoặc với ashmem hoặc gralloc). Ví dụ, bề mặt cửa sổ sử dụng bộ nhớ giữa các ứng dụng và màn hình compositor chia sẻ, và bộ đệm con trỏ sử dụng bộ nhớ giữa các nhà cung cấp nội dung và khách hàng chia sẻ.

Dalvik heap cho mỗi quá trình được hạn chế đến một phạm vi bộ nhớ ảo duy nhất. Điều này xác định kích thước heap hợp lý, có thể phát triển như nó cần phải (nhưng chỉ đến một giới hạn mà hệ thống định nghĩa cho mỗi ứng dụng).

Kích thước hợp lý của heap không giống như số lượng bộ nhớ vật lý được sử dụng bởi nó. Khi kiểm tra heap của ứng dụng, Android tính một giá trị gọi là tỉ lệ Set Kích thước (PSS), chiếm cả các trang dirty và clean được chia sẻ với các quá trình khác, nhưng chỉ trong tổng số đó là tỷ lệ thuận với số ứng dụng được chia sẻ RAM. (PSS) tổng số này là những gì hệ thống coi là bộ nhớ vật lý của bạn.

Hạn chế bộ nhớ ứng dụng

Để duy trì một môi trường chức năng mutil-task, Android đặt một giới hạn cứng về kích thước heap cho mỗi ứng dụng. Giới hạn kích thước heap chính xác thay đổi giữa các thiết bị dựa trên tổng RAM mà thiết bị có sẵn. Nếu ứng dụng của bạn đã đạt đến giới hạn sức chứa của nó và cố gắng để cấp phát bộ nhớ hơn, nó sẽ nhận được một OutOfMemoryError.

Trong một số trường hợp, bạn có thể muốn truy vấn hệ thống để xác định chính xác bao nhiêu không gian heap bạn đã có sẵn trên thiết bị hiện tại, để xác định có bao nhiêu dữ liệu an toàn để giữ trong bộ nhớ cache. Bạn có thể truy vấn hệ thống cho con số này bằng cách gọi getMemoryClass (). Nó trả về một số nguyên cho biết số lượng của MB có sẵn cho heap của ứng dụng của bạn.

Chuyển các ứng dụng

Thay vì sử dụng không gian trao đổi khi người dùng chuyển đổi giữa các ứng dụng, Android giữ các quy trình mà không được lưu trữ tại một nền trước ( “người dùng có thể nhìn thấy”) thành phần ứng dụng trong một cache LRU (least-recently used). Ví dụ, khi người dùng đầu tiên ra mắt một ứng dụng, một tiến trình được tạo ra cho nó, nhưng khi người dùng rời khỏi ứng dụng, quá trình này không thoát. Hệ thống này giúp quá trình được lưu trữ, vì vậy nếu người dùng sau đó trở lại ứng dụng, tiến trình này được sử dụng lại cho các ứng dụng chuyển đổi nhanh hơn.

Nếu ứng dụng của bạn có một tiến trình trình lưu trữ và nó vẫn nhớ rằng hiện tại nó không cần, kể cả người dùng không sử dụng nó, làm hạn chế hiệu suất tổng thể của hệ thống. Vì vậy, khi hệ thống chạy chậm trên bộ nhớ, nó có thể kill các quy trình trong bộ nhớ cache LRU bắt đầu với quá trình ít được sử dụng nhất, nhưng cũng đưa ra một số xem xét đối với các quy trình có nhiều bộ nhớ chuyên sâu.

Cach nên làm để quản lý bộ nhớ

Bạn nên chú ý hạn chế bộ nhớ RAM trong suốt quá trình phát triển, kể cả trong khi thiết kế ứng dụng (trước khi bạn bắt đầu phát triển). Có rất nhiều cách để bạn có thể thiết kế và viết mã dẫn kết quả cho hiệu quả hơn.

Bạn nên áp dụng các kỹ thuật sau đây khi thiết kế và triển khai các ứng dụng của bạn để làm cho nó bộ nhớ hiệu quả hơn:

6.1 Sử dụng dịch vụ một cách tiết kiệm

Nếu ứng dụng của bạn cần một dịch vụ để thực hiện công việc trong nền, không giữ cho nó chạy, trừ khi nó chủ động thực hiện một công việc. Cũng phải cẩn thận để không bao giờ bị rò rỉ dịch vụ của bạn bằng cách không để ngăn chặn nó khi công việc của mình được thực hiện.

Khi bạn bắt đầu một dịch vụ, hệ thống thích để luôn luôn giữ tiến trình cho dịch vụ đang chạy. Điều này làm cho tiến trình rất tốn kém vì bộ nhớ RAM được sử dụng bởi các dịch vụ không thể được sử dụng bởi bất cứ điều gì khác hoặc paged ra. Điều này làm giảm số lượng của các tiến trình lưu trữ hệ thống có thể giữ trong bộ nhớ cache LRU, làm cho chuyển đổi ứng dụng kém hiệu quả. Nó thậm chí có thể dẫn đến hư hại trong hệ thống khi bộ nhớ bị chật và hệ thống không thể duy trì đủ các quy trình để lưu trữ tất cả các dịch vụ đang chạy.

Cách tốt nhất để hạn chế tuổi thọ của các dịch vụ của bạn là sử dụng một IntentService được kết thúc bởi bản thân ngay khi nó được thực hiện xử lý các intent mà bắt đầu nó.

Chuyển một dịch vụ chạy khi nó không cần thiết là một trong những sai lầm tồi tệ nhất trong quản lý bộ nhớ một ứng dụng Android có thể thực hiện. Vì vậy, không được tham lam bằng cách giữ một dịch vụ cho các ứng dụng của bạn đang chạy. Không chỉ nó sẽ làm tăng nguy cơ ứng dụng của bạn hoạt động không tốt do RAM hạn chế, nhưng người dùng sẽ khám phá các ứng dụng misbehaving đó và gỡ bỏ chúng.

6.2 Giải phóng bộ nhớ khi giao diện người dùng bị ẩn

Khi người dùng điều hướng tới một ứng dụng khác và giao diện người dùng của bạn không còn nhìn thấy được, bạn nên giải phóng bất kỳ resource nào được sử dụng chỉ bởi giao diện của bạn. Giải phóng UI resource vào thời điểm này có thể làm tăng đáng kể khả năng của hệ thống cho quá trình lưu trữ, trong đó có một tác động trực tiếp đến chất lượng của trải nghiệm người dùng.

Để được thông báo khi người dùng thoát khỏi UI của bạn, thực hiện hàm onTrimMemory () gọi lại trong các Activity. Bạn nên sử dụng phương pháp này để lắng nghe cho mức TRIM_MEMORY_UI_HIDDEN, mà chỉ ra UI của bạn hiện đang ẩn trên view và bạn nên giải phóng các resource mà chỉ có giao diện người dùng của bạn sử dụng.

Chú ý rằng ứng dụng của bạn nhận được các callback onTrimMemory () với TRIM_MEMORY_UI_HIDDEN chỉ khi tất cả các thành phần giao diện người dùng của quá trình ứng dụng của bạn trở nên ẩn từ user. Đây là khác biệt từ onStop (), được gọi khi một Activity ẩn, mà xảy ra ngay cả khi người dùng di chuyển đến một Activity khác trong ứng dụng. Vì vậy, mặc dù nên thực hiện onStop () để giải phóng các resource như một kết nối mạng hoặc unregister thu phát sóng, bạn thường không nên release UI resource cho đến khi bạn nhận được onTrimMemory (TRIM_MEMORY_UI_HIDDEN). Điều này đảm bảo rằng nếu người dùng điều hướng trở lại từ một activity khác trong ứng dụng, UI resource vẫn có sẵn để tiếp tục hoạt động một cách nhanh chóng.

6.3 Tránh lãng phí bộ nhớ với bitmap

Khi load một bitmap, hãy giữ nó trong bộ nhớ RAM chỉ ở độ phân giải cần cho màn hình hiện tại, scale xuống nếu bitmap gốc có độ phân giải cao hơn.

Lưu ý: Trên 2.3.x Android (cấp API 10) trở xuống, các đối tượng bitmap luôn xuất hiện cùng kích thước trong heap ứng dụng không phụ thuộc vào độ phân giải hình ảnh (các dữ liệu điểm ảnh thực tế được lưu giữ riêng trong bộ nhớ cục bộ). Điều này khiến khó khăn hơn để gỡ lỗi cấp phát bộ nhớ bitmap bởi vì hầu hết các công cụ phân tích heap không thấy việc phân bổ nguồn gốc. Tuy nhiên, bắt đầu từ Android 3.0 (API cấp độ 11), các dữ liệu pixel bitmap được phân bổ trong heap Dalvik của ứng dụng, cải thiện thu gom rác thải và debuggability. Vì vậy, nếu ứng dụng của bạn sử dụng bitmap và bạn đang gặp rắc rối phát hiện ra lý do tại sao ứng dụng đang sử dụng một số bộ nhớ trên thiết bị cũ, chuyển sang một thiết bị chạy Android 3.0 hoặc cao hơn để gỡ lỗi đó.

Tổng kết: chúng ta sẽ đến với các cách sử dụng bộ nhớ hiệu quả hơn trong phần sau, mong rằng những thông tin này sẽ có ích với ứng dụng của ban.

All Rights Reserved