Làm thế nào Windows có thể kết xuất RAM hoàn chỉnh trong tệp ngủ đông nhanh như vậy?


65

Tôi đã xem qua một bài viết giải thích quy trình ngủ đông trong Microsoft Windows. Những điểm chính mà tôi nhận được từ nó là

  1. Windows bỏ toàn bộ RAM (sau khi xử lý có thể) trong hiberfil.systệp.
  2. Trong quá trình khởi động, tệp ngủ đông được đọc và nội dung được tải trong RAM.

Câu hỏi của tôi là khi tôi thường sao chép một tệp có kích thước, giả sử, 1 GB, mất khoảng 2 phút để hoàn thành.

Tuy nhiên, khi Windows đang ghi tệp ngủ đông (trong quy trình ngủ đông), toàn bộ quá trình có thể mất từ ​​10 - 15 giây. Tại sao có sự khác biệt về tốc độ viết như vậy?

Dung lượng RAM của tôi là 4 GB. (Tôi không nói về công nghệ khởi động nhanh.)

Điểm chuẩn:

  1. Sao chép tệp 1 GB từ Đĩa 1 sang Đĩa 2 (bên ngoài): 2,3 phút.
  2. Ngủ đông hệ thống: 15 giây.

3
Tôi không biết câu trả lời, nhưng tôi cá là nếu bạn kiểm tra cuốn sách Windows Internals "Chương 13: Khởi động và tắt máy" thì nó sẽ cho bạn biết (Nếu tôi có cuốn sách đó tôi sẽ kiểm tra).
Scott Chamberlain

2
Đây là một câu hỏi hay. Khi ngủ đông lần đầu tiên được thực hiện vào năm 1998, nó không quá nhanh.
Gabe

22
@coder: hệ thống NT đảm bảo hyberfil.sys có toàn bộ không gian được phân bổ và toàn bộ tệp không bị phân mảnh. Trong điều kiện đó, không có đầu nhảy vào ổ cứng trong quá trình hoạt động. Vì vậy, bạn sẽ có tốc độ hiệu quả như 150Mo / s. Bạn có thể kiểm tra lại những gì tôi nói với fsutil.
dùng2284570

3
Đĩa ngoài thường chậm hơn đĩa bên trong.
Harry Johnston

2
@EricLippert - chắc chắn là nó không lưu trữ tất cả RAM, nhưng điều đó vẫn không giải thích được. Tôi thường xuyên có vài gigabyte RAM hoạt động cần được lưu trữ (VS2013 hoặc Eclipse + một vài thứ nữa cần rất nhiều ram) và chúng được lưu trữ ở tốc độ dường như lớn hơn cả tốc độ ghi lý thuyết của tôi không phải là SSD lái xe.
Thưởng thức

Câu trả lời:


45

Đây có lẽ là một câu trả lời ba lần.

Một điều có thể đang diễn ra ở đây là Hybrid Shutdown mới trong Windows sẽ đóng các ứng dụng của bạn một cách hiệu quả, đăng xuất bạn và sau đó tiến hành ngủ đông lõi của hệ điều hành. Đã có dữ liệu này được lưu có nghĩa là nó không cần phải "ngủ đông" lại.

Điều thứ hai là chế độ ngủ đông sẽ không cần lưu các trang bộ nhớ được phân trang ra tệp hoán đổi hoặc không được sử dụng (đây cũng là một lý do để tích cực lấp đầy tệp hoán đổi giữ dữ liệu trong bộ nhớ) .

Thứ ba là dữ liệu tệp ngủ đông cũng được nén . Kết hợp điều đó với điểm thứ hai của tôi và nếu bạn chỉ có một bộ dữ liệu nhỏ để xuất có chứa dữ liệu có khả năng nén cao (các tệp thực thi thường được nén tốt) thì lượng dữ liệu đi ra tệp ngủ đông có thể nhỏ hơn đáng kể so với bộ làm việc Dữ liệu. Lưu ý rằng, như đã nêu trong các nhận xét, bộ đệm tệp và dữ liệu bộ đệm không cần thiết khác có thể dễ dàng bị loại bỏ mà không có tác dụng xấu để giảm lượng dữ liệu được đổ vào tệp ngủ đông.

Ngoài ra, ổ cứng hiện tại khá nhanh. Với một đĩa có tốc độ ghi ổn định theo thứ tự 100 MB / s, bạn sẽ có thể ghi ra (không nén) 4 GB RAM trong vòng một phút. Vì ngủ đông có thể được thực hiện như là điều cuối cùng sau khi tạm dừng tất cả các quy trình của người dùng và trước khi tạm dừng CPU, HĐH thường sẽ có tốc độ ghi đầy đủ của đĩa. Đây là một điều mà điểm chuẩn đơn giản của bạn sẽ không có và việc sao chép từ đĩa này sang đĩa khác có khả năng sẽ chậm hơn so với việc ghi RAM ra đĩa.

Kết hợp những điều này và lượng dữ liệu được ghi vào tệp ngủ đông có thể khá nhỏ, có khả năng là 1 GB và có thể sẽ được ghi vào một khối lớn liên tục trong vòng dưới 10 giây.


37
Hoặc, để làm cho rõ ràng hơn: RAM của bạn có thể không đầy. Bộ đệm được xóa và bộ nhớ cache bị loại bỏ khi ngủ đông. Chỉ bộ nhớ thực sự được sử dụng bởi các ứng dụng phải được ghi vào đĩa. Tắt máy lai giúp giảm dung lượng bộ nhớ sử dụng bằng cách đăng xuất người dùng.
Daniel B

2
Các trang không bẩn là một tuyên bố chung hơn về "phân trang cho tệp hoán đổi", điều này sẽ bao gồm các tệp thực thi. .
Paul A. Clayton

3
@ user2284570 từ tài liệu tôi đã liên kết trong câu trả lời đó "Windows hỗ trợ chế độ ngủ đông bằng cách sao chép nội dung của bộ nhớ vào đĩa. Hệ thống nén nội dung bộ nhớ trước khi lưu trữ chúng trên đĩa, giúp giảm dung lượng đĩa cần thiết xuống ít hơn tổng dung lượng bộ nhớ vật lý trên hệ thống. "
Mokubai

4
@ user2284570: Đó là vì trường hợp xấu nhất là nén 1: 1. Windows phải đảm bảo có đủ không gian (dành riêng) trong hyberfil.sys cho mọi cấu hình bộ nhớ có thể - ngay cả khi nó chỉ cần một phần mười kích thước RAM cho chế độ ngủ đông cụ thể. Thêm vào đó, một phần kha khá trong sử dụng RAM là các tệp được tải vào bộ nhớ (tệp thực thi, tài nguyên ...), nhưng vẫn được ánh xạ từ ổ cứng và bạn thực sự có thể tiết kiệm rất nhiều ghi. Có một chương trình tạo ra 4 GiB dữ liệu ngẫu nhiên trong RAM và quá trình ngủ đông mất nhiều thời gian hơn đáng kể - và thậm chí sau đó, một số dữ liệu có thể đã được trao đổi.
Luaan 11/03/2015

3
@ user2284570: Tệp có dung lượng lớn để đảm bảo có không gian trên đĩa để lưu trữ tất cả bộ nhớ. Không phải tất cả không gian đó thực sự được sử dụng trong chế độ ngủ đông. Đôi khi tập tin sẽ là (giả sử) 7% nội dung bộ nhớ nén, 93% rác.
psmears 11/03/2015

31

Đầu tiên, dung lượng RAM cần lưu là nhỏ đáng ngạc nhiên. Trên thực tế, chỉ có tập hợp các trang bẩn được ánh xạ ("lười viết") cần được xóa, cũng như tất cả các trang riêng đã được viết và di chuyển mã thực thi cần được viết.

  • Các phân đoạn .text của các tệp thực thi luôn được hỗ trợ bởi ánh xạ tệp. Điều đó cũng đúng với ít nhất một số DLL (nhưng không phải tất cả, phụ thuộc vào việc chúng có cần được di dời hay không).
  • Bộ nhớ được hỗ trợ tương tự bởi ánh xạ tệp có thể bị loại bỏ (giả sử nó không phải là CoW hoặc RW bẩn).
  • Sự lười biếng viết sẽ vẫn phải xảy ra, nhưng ngoài ra, bộ nhớ cache có thể bị loại bỏ.
  • Bộ nhớ đã được phân bổ nhưng không được ghi vào (thường là phần lớn hơn của dữ liệu ứng dụng!) Được hỗ trợ bởi trang 0 và có thể bị loại bỏ.
  • Phần lớn các trang bộ nhớ mà là về "chế độ chờ" trạng thái (thực tế thường trú mỗi quá trình làm việc thiết lập trên Windows là đáng ngạc nhiên nhỏ, chỉ một 16MB) sẽ được sao chép vào tập tin trang trong nền tại một số điểm và có thể bị loại bỏ .
  • Các vùng bộ nhớ được ánh xạ bởi một số thiết bị nhất định như card đồ họa có thể (có thể) không cần phải lưu. Người dùng đôi khi ngạc nhiên khi họ cắm 8GiB hoặc 16GiB vào máy tính và 1GiB hoặc 2GiB chỉ "biến mất" mà không có lý do rõ ràng. Các API đồ họa chính yêu cầu các ứng dụng có khả năng với nội dung bộ đệm trở nên không hợp lệ "trong một số điều kiện" (mà không cho biết chính xác điều này có nghĩa là gì). Do đó, không phải là không có lý khi hy vọng rằng bộ nhớ được ghim bởi trình điều khiển đồ họa cũng bị loại bỏ. Dù sao thì màn hình cũng sẽ tối đi.

Thứ hai, trái với việc bạn sao chép một tập tin, việc bỏ tập hợp các trang RAM cần lưu vào đĩa là một lần ghi liên tục, liên tục theo quan điểm của ổ đĩa. API Win32 thậm chí còn hiển thị chức năng ở cấp độ người dùng cho chính thao tác này. Tập hợp ghi được hỗ trợ trực tiếp bởi phần cứng và hoạt động nhanh như đĩa có thể chấp nhận dữ liệu (bộ điều khiển sẽ trực tiếp kéo dữ liệu qua DMA).
Có một số điều kiện tiên quyết để làm việc này (chẳng hạn như căn chỉnh, kích thước khối, ghim) và nó không hoạt động tốt với bộ nhớ đệm và không có thứ gọi là "lười viết" (đây là một tối ưu hóa rất mong muốn trong hoạt động bình thường ).
Đó là lý do tại sao không phải mọi viếtlàm việc như thế mọi lúc Tuy nhiên, khi hệ thống lưu tệp ngủ đông, tất cả các điều kiện tiên quyết sẽ tự động được đáp ứng (tất cả dữ liệu được căn chỉnh trang, kích thước trang và được ghim) và bộ nhớ đệm đã trở nên không liên quan vì máy tính sẽ bị tắt ngay lập tức.

Thứ ba, thực hiện một lần ghi liền kề duy nhất rất thuận lợi cho cả đĩa quay và đĩa trạng thái rắn.

Tệp hoán đổi và tệp ngủ đông thường là một số tệp sớm nhất được tạo và dành riêng trên đĩa. Họ thường có một, nhiều nhất là hai mảnh. Do đó, trừ khi các cung bị hỏng và đĩa phải phân bổ lại các thành phần vật lý, một ghi tuần tự logic sẽ chuyển thành ghi tuần tự vật lý trên đĩa quay.

Không có thao tác đọc-sửa-ghi là cần thiết trên đĩa khi một lượng lớn dữ liệu liên tục, liên tục được ghi. Vấn đề này ít được phát hiện trên các ổ cứng quay có thể ghi các cung đơn lẻ khá nhỏ (Với điều kiện bạn không ghi các byte đơn, mà bộ nhớ đệm thường ngăn, thiết bị không cần tìm nạp nội dung gốc và ghi lại phiên bản đã sửa đổi.) .
Tuy nhiên, đây là thứ rất đáng chú ý trên SSD khi mọi ghi có nghĩa là khối 512kB (đó là một số thông thường, nhưng nó có thể lớn hơn) phải được đọc và sửa đổi bởi bộ điều khiển và được viết lại thành khác khối. Về nguyên tắc bạn có thể viết thư cho (nhưng không ghi đè) các đơn vị nhỏ hơn trên các đĩa flash, bạn chỉ có thể xóa các khối lớn, đó là cách phần cứng hoạt động. Đây là lý do tại sao SSD giá tốt hơn rất nhiều trên các ghi tuần tự lớn.


Ngay cả khi một DLL được di dời, điều duy nhất cần thiết để đưa nó trở lại là địa chỉ được di chuyển. Tái định cư là một quá trình xác định và có thể được lặp đi lặp lại.
MSalters

"Tập hợp viết"? Bạn có nghĩa là "Thay vì, viết"?
Peter Mortensen

3
@PeterMortensen: Không, tôi thực sự có nghĩa là tập hợp viết (trái ngược với phân tán đọc). Điều này có nghĩa là ghi vào một tệp trong khi thu thập dữ liệu từ nhiều vị trí. Bạn cung cấp một mảng các cấu trúc, mỗi cấu trúc chứa địa chỉ bắt đầu và độ dài (với các yêu cầu căn chỉnh nghiêm ngặt). Hệ điều hành chuyển những thứ này cho bộ điều khiển và phần cứng làm phần còn lại.
Damon

1
@MSalters: Nhưng việc di chuyển tạo ra một bản sao riêng tư của trang và sau đó rất khó để xác định liệu có bất kỳ sửa đổi nào khác đã được thực hiện đối với bản sao riêng tư hay không. Tương phản với ánh xạ không yêu cầu sửa lỗi và sử dụng bản sao khi viết. Nếu các sửa đổi khác được thực hiện, sẽ có một bản sao riêng. Nếu không, trang vẫn sẽ được cấu hình cho CoW.
Ben Voigt

1
@MSalters Nó có thể là một quá trình xác định, nhưng điều đó không có nghĩa là mã ngủ đông hoạt động ở cùng một lớp của ngăn xếp phần mềm như trình liên kết. Nếu chế độ ngủ đông ở lớp nhân và liên kết là lớp người dùng, thì chế độ ngủ đông không thể đưa ra bất kỳ giả định nào về những gì trình liên kết thực hiện.
kasperd 14/03/2015

10

Nó không đổ toàn bộ RAM vào thời gian ngủ đông.

Nó sẽ có một phần lớn RAM đã được sao chép trên đĩa. Điều này không chỉ cho phép ngủ đông diễn ra nhanh chóng mà còn cho phép bộ nhớ được cung cấp nhanh chóng cho các chương trình mới (để chúng có thể khởi chạy nhanh chóng).

Do đó, nó chỉ phải viết một phần nhỏ của 4GB và có thể được thực hiện trong vòng 10 - 15 giây.

Từ microsoft :

Khi RAM bị thiếu (ví dụ: Byte cam kết lớn hơn RAM đã cài đặt), hệ điều hành sẽ cố gắng giữ một phần RAM được cài đặt sẵn để sử dụng ngay bằng cách sao chép các trang bộ nhớ ảo không sử dụng vào trang tệp . Do đó, bộ đếm này sẽ không đạt đến 0 và không nhất thiết là một dấu hiệu tốt cho biết hệ thống của bạn có bị thiếu RAM hay không.


2

Ngoài tất cả những điều trên, tôi nghĩ còn có một vài yếu tố khác.

Một là, khi sao chép một tập tin, tập tin phải được đọc và ghi; hybernation chỉ yêu cầu các tập tin được viết. Đó là, theo định nghĩa, đã có trong bộ nhớ!

Liên quan chặt chẽ đến điều này, khi đọc một tập tin và viết nó cùng một lúc, để tiết kiệm bộ nhớ, quá trình là: đọc một đoạn, viết một đoạn, cập nhật thư mục (để hiển thị kích thước mới); đọc một đoạn, viết một đoạn, cập nhật thư mục.

Mỗi lần bạn di chuyển từ một phần của đĩa sang một phần khác (ví dụ đọc tệp a để ghi tệp b, ghi tệp b để ghi thư mục và viết thư mục để đọc đoạn tiếp theo), đĩa phải tìm kiếm - di chuyển các đầu, cho phép các đầu giải quyết, chờ cho phần bên phải của đĩa đi qua. Đây là một trong những lợi thế của đĩa trạng thái rắn - tìm kiếm không mất thời gian. Khi ngủ đông, dữ liệu được ghi từ đầu đến cuối. Tệp ngủ đông (trao đổi) được phân bổ trước, do đó không cần cập nhật thư mục (bạn không thay đổi kích thước của tệp ngủ đông, chỉ nội dung).

Và cuối cùng, máy tính của bạn đã tạm ngưng tất cả các tác vụ khác - đây là việc CHỈ đang làm (tôi nghi ngờ điều này sẽ tạo ra nhiều khác biệt, nhưng nó buộc phải thực hiện một số!). Ngay cả những thứ như quản lý bộ nhớ và chuyển đổi tác vụ bị đình chỉ.


Đó là ràng buộc để tạo ra một sự khác biệt lớn !
Cuộc đua nhẹ nhàng với Monica

@LightnessRacesinOrbit: Sự tranh chấp CPU sẽ hầu như không có sự khác biệt nào cả. Thiếu tranh chấp I / O là một vấn đề lớn, nhưng câu trả lời này đã tuyên bố rằng việc tìm kiếm hiệu suất giết chết, và tìm kiếm, không thiếu băng thông tổng thể, là vấn đề chính của tranh chấp I / O.
Ben Voigt

@BenVoigt: Vâng, tôi đồng tình. Và khi bạn có 40 quy trình tất cả đang cố gắng thực hiện công cụ trên đĩa, điều đó sẽ làm tăng đáng kể việc tìm kiếm đĩa. (tl; dr Tôi đã không nói về sự tranh chấp CPU)
Các cuộc đua Lightness với Monica

@LightnessRacesinOrbit: Điều đó có vẻ ... bất thường ngay cả trong khi hoạt động bình thường (mọi thứ trừ khi vào và rời khỏi chế độ ngủ đông). Tôi biết rằng khi tôi bắt một tác vụ nền đánh vào đĩa, tôi gỡ cài đặt trình hút và thay thế nó bằng thứ gì đó chỉ truy cập vào đĩa khi tôi yêu cầu nó làm gì đó.
Ben Voigt

@BenVoigt: Điều đó dường như không thể. Ghi nhật ký Daemon là ví dụ rõ ràng nhất, tiếp theo là những thứ như cập nhật tệp trôi dạt của ntpd. Tôi không khẳng định rằng một trong những ví dụ đó có ảnh hưởng lớn ở đây, nhưng tôi không nghĩ sẽ hợp lý khi hy vọng không có tác vụ nền nào tự động chạm vào đĩa.
Cuộc đua nhẹ nhàng với Monica

0

Điều này có thể là do RAM có tốc độ đầu vào / đầu ra nhanh hơn nhiều so với đĩa cứng, do đó, RAM có thể xuất ra những thứ trong đó nhanh như đĩa cứng có thể đọc được.

Khi sao chép tệp, bạn cũng bị giới hạn bởi các yếu tố khác nhau - tốc độ của đĩa, nếu phải đọc vào và ra trên cùng một đĩa thì sẽ mất nhiều thời gian hơn, tốc độ giới hạn của kết nối (nếu vào ổ đĩa ngoài), hãy kiểm tra nó không ghi đè bất cứ điều gì vv


9
nhưng HĐH vẫn cần ghi dữ liệu RAM 4GB trên Đĩa bị chi phối bởi nút cổ chai I / O
mã hóa

Ngoài ra, giả sử các tham số thuận lợi, điều đó có nghĩa là trong quá trình ngủ đông, tốc độ ghi của Đĩa của tôi tăng từ 40 MB / s xuống ~ 260 MB / s. Nó có thể là chính xác?
viên

1
Có lẽ - không nên có quá nhiều nút cổ chai I / O vì nó chỉ cần ghi dữ liệu (có thể có một cái gì đó để nó biết rằng nó sẽ không ghi đè lên công cụ và nơi để đặt dữ liệu để nó không bị ghi đè cần đọc đĩa quá nhiều). Trên máy tính xách tay (linux dual boot) của tôi, tôi có thể sử dụng dd if=/dev/zero of=/tmp/output.img bs=8k count=256kvà nhận được 1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s, vì vậy dường như là có thể (tôi sẽ thêm rằng các cửa sổ sao chép các tập tin dường như mất nhiều thời gian không cần thiết).
Wilf

Bạn cũng có thể nhận được chuyển khoản nhanh hơn nhiều khi sao chép tệp qua internet cục bộ. Ngoài ra, có thể không cần sao chép tất cả nội dung trong RAM - một số dữ liệu trong RAM có thể chỉ được lưu trong bộ nhớ cache và không cần khôi phục hệ thống khi thức dậy sau khi ngủ đông.
Wilf

Tôi vừa thử điểm chuẩn dd trên hệ thống của tôi. Nó không bao giờ vượt quá 52 MB / s: / (máy cũ) Tuy nhiên tôi tin rằng "có thể có một cái gì đó để nó biết rằng nó sẽ không ghi đè lên công cụ và nơi để đặt dữ liệu để nó không cần phải đọc đĩa quá nhiều " Là chìa khóa cho tốc độ nhanh.
viên
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.