Có thể gợi ý Windows để đưa một quá trình hoàn toàn ra khỏi trao đổi


13

Có thể gợi ý trình quản lý bộ nhớ ảo Windows để đưa một quy trình cụ thể ra khỏi trao đổi không?

Tình huống tôi thường thấy là thường sử dụng khoảng 50% RAM cho tất cả các chương trình thông thường, đặc biệt là IDE cho mục tiêu nhúng, cùng với trình gỡ lỗi liên quan.

Sau đó, tôi để lại một quá trình đói bộ nhớ đang chạy - ví dụ như wireshark hoặc thứ gì đó tích lũy dữ liệu vào cuối tuần, mọi thứ sẽ bị tráo đổi - như họ nên làm. Sau khi quá trình lớn kết thúc, hầu hết các quy trình được để lại trong trao đổi.

Sau đó, lẻ tẻ tạm dừng để trao đổi quá trình trở lại gây ra vấn đề với trình gỡ lỗi, có lẽ là do vấn đề thời gian trong comms giữa IDE và trình gỡ lỗi phần cứng. Vì vậy, việc kiểm soát thiết bị đích có thể rời rạc cho đến khi đủ các nỗ lực đã đưa dữ liệu gỡ lỗi trong IDE ra khỏi trao đổi.


Điều này sẽ rất hữu ích! Từ quan điểm của người dùng, thật khó chịu khi chờ quá trình hoán đổi sau mỗi lần nhấp hoặc hành động của người dùng. Sẽ tốt hơn nhiều khi nói: "bỏ qua quá trình này!" , đi uống cà phê và trở lại một hệ thống đáp ứng!
Tomas

Tôi không quen thuộc với các chi tiết cụ thể của quá trình hoán đổi của Windows nhưng đây có phải là thứ bạn đang tìm kiếm không? Cần có một ví dụ nhị phân làm việc trong các ý kiến.
Rik

1
Tôi đã từng có một câu hỏi tương tự , và đã viết một chương trình dựa trên các câu trả lời tôi nhận được trên Stack Overflow.
Kerrek SB

@Kerrek, tôi đã thử biên dịch mã của bạn theo MinGW và gặp lỗi trên mỗi lần đọc "Không thể đọc một byte từ 0x161000, lỗi 299 (đọc 0 byte)." Vì tôi chỉ có Windows tại nơi làm việc nên tôi không đủ can đảm để chạy nhị phân ngẫu nhiên mà bạn đã đính kèm để vấn đề có thể nằm trong phần tổng hợp của tôi.
Greg

1
@KerrekSB, có vẻ như vấn đề nhỏ. Có lẽ bạn đang chạm vào vùng nhớ không được ánh xạ? Dù sao, tôi nghĩ rằng câu trả lời của bạn xứng đáng với tiền thưởng :) PS: unswap có vẻ chậm hơn nhiều so với tốc độ của nó. Có vẻ như nút cổ chai ở một nơi khác, nhưng ở đâu?
Tomas

Câu trả lời:


1

KerrekSB đã phát triển một công cụ đặc biệt cho mục đích này:

/programming//a/2940209/684229

Nó có sẵn trên GiTHUB với các tệp nhị phân: https://github.com/louitorx/unpage

Trong quá trình chạy, bạn gặp rất nhiều lỗi "Không thể đọc một byte từ 0x .... 000, lỗi 299 (0 byte đọc)", nhưng đó không phải là vấn đề, công cụ hoạt động rất tốt.


"Nhưng đó là một vấn đề"? Tôi không nghĩ đó là một vấn đề.
Kerrek SB

Trích dẫn: "công cụ cố gắng đưa tất cả các ứng dụng trở lại bộ nhớ vật lý". Với "quá trình đói bộ nhớ" của người gửi bài, điều này có thể không hoạt động.
harrymc

@harrymc Trích dẫn từ câu hỏi : After the big process is finished, most processes are left in swap.. Vì vậy, có lẽ ông đã kết thúc "quá trình đói bộ nhớ".
Rik

@KerrekSB tất nhiên, đó là một lỗi đánh máy. Cảm ơn :-)
Tomas

@Tomas Tôi tìm thấy cái này . Với kiến ​​thức rất hạn chế về c ++, tôi đã xác minh rằng với mỗi lần truy cập không thành công, trang thực sự được bảo vệ bởi PAGE_GUARD-bit. Tôi đã sử dụng if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }ngay trước khi ReadProcessMemory-line. PAGE_GUARD là 256 và tôi đã nhận được 260 trang bị lỗi. Vì vậy, có thể thoát khỏi các lỗi. Ai đó có một số kiến ​​thức về C ++ và Paging cần đọc lên bit PAGE_GUARD.
Rik

1

Bạn có thể sử dụng Process Lasso để ưu tiên cho trang Bộ nhớ :

Bắt đầu với Windows Vista, mỗi trang bộ nhớ có mức ưu tiên từ 0 đến 7. Danh sách chờ được chia thành tám danh sách mà mỗi trang xử lý mức ưu tiên khác nhau. Khi Trình quản lý bộ nhớ muốn lấy một trang từ Danh sách chờ, trước tiên, nó sẽ lấy các trang từ danh sách ưu tiên thấp. "

Process Lasso có thể giúp quản lý các ưu tiên bộ nhớ bằng cách cho phép các ưu tiên bộ nhớ liên tục được đặt cho các quy trình, để các trang bộ nhớ ảo của chúng được đặt thành mức ưu tiên cụ thể mỗi lần chạy.

Process Lasso có hai phiên bản: miễn phí và thương mại ($ 18,95 khi dùng thử).


Tôi sợ rằng bạn đang trả lời câu hỏi hoàn toàn khác nhau. Đưa ra quy trình ưu tiên bộ nhớ là một nhiệm vụ khác nhau, có thể là vô ích trong bối cảnh OP và tôi đã phác thảo ra: khi bạn đã có một quy trình được hoán đổi và muốn giải phóng nó. Bạn không muốn ngăn nó đi trao đổi.
Tomas

@Tomas: Đó không phải là hiểu biết của tôi. Yêu cầu là để ngăn chặn một quá trình nhất định không bị tráo đổi. Nếu quá trình tự nó không được lập trình để khóa các trang của nó vào bộ nhớ, giải pháp tốt nhất tiếp theo là ưu tiên bộ nhớ cao nhất để làm cho nó ít bị hoán đổi hơn.
harrymc

3
@harrymc, OP nói khi bộ nhớ hog chạy, "mọi thứ sẽ bị tráo đổi - như họ nên" vì vậy đó là điều OP muốn. Chỉ là vào sáng thứ Hai, anh ấy muốn các bộ công việc của các quy trình quan trọng được đưa vào cùng một lúc, chứ không phải là những giọt nước nhỏ giọt do lỗi trang theo thời gian.
mgkrebbs

@mgkrebbs: Đó là một giải pháp khác cho vấn đề, điều mà tôi tin là không thể làm được. Giải pháp của tôi là nếu IDE không bao giờ bị tráo đổi, thì không cần phải trao đổi lại. "Quá trình đói bộ nhớ" sẽ chỉ có RAM ít hơn vài megabyte, điều này sẽ không ảnh hưởng quá nhiều đến hiệu năng của nó.
harrymc
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.