Malvineous
Malvineous

Reputation: 27330

Allocating memory that can be freed by the OS if needed

I'm writing a program that generates thumbnails for every page in a large document. For performance reasons I would like to keep the thumbnails in memory for as long as possible, but I would like the OS to be able to reclaim that memory if it decides there is another more important use for it (e.g. the user has started running a different application.)

I can always regenerate the thumbnail later if the memory has gone away.

Is there any cross-platform method for flagging memory as can-be-removed-if-needed? The program is written in C++.


EDIT: Just to clarify, rather than being notified when memory is low or regularly monitoring the system's amount of memory, I'm thinking more along the lines of allocating memory and then "unlocking" it when it's not in use. The OS can then steal unlocked memory if needed (even for disk buffers if it thinks that would be a better use of the memory) and all I have to do as a programmer is just "lock" the memory again before I intend to use it. If the lock fails I know the memory has been reused for something else so I need to regenerate the thumbnail again, and if the lock succeeds I can just keep using the data from before.

The reason is I might be displaying maybe 20 pages of a document on the screen, but I may as well keep thumbnails of the other 200 or so pages in case the user scrolls around a bit. But if they go do something else for a while, that memory might be better used as a disk cache or for storing web pages or something, so I'd like to be able to tell the OS that it can reuse some of my memory if it wants to.

Having to monitor the amount of free system-wide memory may not achieve the goal (my memory will never be reclaimed to improve disk caching), and getting low-memory notifications will only help in emergencies. I was hoping that by having a lock/unlock method, this could be achieved in more of a lightweight way and benefit the performance of the system in a non-emergency situation.

Upvotes: 4

Views: 176

Answers (4)

EternityForest
EternityForest

Reputation: 326

This question is very similar and has answers that cover things not covered here. Allocating "temporary" memory (in Linux)

This shouldn't be too hard to do because this is exactly what the page cache does, using unused memory to cache the hard disk. In theory, someone could write a filesystem such that when you read from a certain file, it calculated something, and the page cache would cache it automatically.

All the basics of automatically freed cache space are already there in any OS with a disk cache, and It's hard to imagine there not being an API for something that would make a huge difference especially in things like mobile web browsers.

Upvotes: 0

Naruil
Naruil

Reputation: 2310

In AIX, there is a signal SIGDANGER that is send to applications when available memory is low. You may handle this signal and free some memory.

There is a discussion among Linux people to implement this feature into Linux. But AFAIK it is not yet implemented in Linux. Maybe they think that application should not care about low level memory management, and it could be transparently handled in OS via swapping.

In posix standard there is a function posix_madvise might be used to mark an area of memory as less important. There is an advice POSIX_MADV_DONTNEED specifies that the application expects that it will not access the specified range in the near future.

But unfortunately, current Linux implementation will immediately free the memory range when posix_madvise is called with this advice.

So there's no portable solution to your question.

However, on almost every OS you are able to read the current available memory via some OS interface. So you can routinely read such value and manually free memory when available memory in OS is low.

Upvotes: 2

ta.speot.is
ta.speot.is

Reputation: 27214

Is there any cross-platform method for flagging memory as can-be-removed-if-needed? The program is written in C++

For Windows, at least, you can register for a memory resource notification.

HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);

NotificationType

  • LowMemoryResourceNotification Available physical memory is running low.
  • HighMemoryResourceNotification Available physical memory is high.

Just be careful responding to both events. You might create a feedback loop (memory is low, release the thumbnails! and then memory is high, make all the thumbnails!).

Upvotes: 4

David Schwartz
David Schwartz

Reputation: 182789

There's nothing special you need to do. The OS will remove things from memory if they haven't been used recently automatically. Some OSes have platform-specific ways to improve this, but generally, nothing special is needed.

Upvotes: 0

Related Questions