Bin ich richtig anzunehmen, dass, wenn ein Prozess malloc aufruft, möglicherweise E/A involviert ist (Auslagern von Caches usw.), um Speicher verfügbar zu machen, was wiederum impliziert, dass er beträchtliche Zeit blockieren kann? Also, sollten wir nicht zwei Versionen von malloc in Linux haben, sagen wir "fast_malloc", das zum Erhalten kleinerer Blöcke & garantiert nicht blockieren (aber natürlich immer noch mit OUT_OF_MEMORY) und einem anderen async_malloc geeignet ist, wo wir nach Belieben fragen könnten -size Speicherplatz, aber einen Rückruf erfordern?Sollte malloc nicht asynchron sein?
Beispiel: Wenn ich einen kleineren Speicherblock benötige, um Platz für ein Element in der verknüpften Liste zu schaffen, bevorzuge ich das traditionelle Inline-malloc, das es in 99.999% der Fälle erfüllen sollte oder einfach fehlschlägt . Ein anderes Beispiel: Wenn ich ein DB-Server bin, der versucht, einen beträchtlichen Chunk zuzuteilen, um Indizes darin zu setzen, kann ich mich für das async_malloc entscheiden und mit der "Callback-Komplexität" umgehen.
Der Grund, warum ich das heraufgebracht habe, ist, dass ich versuche, hoch gleichzeitige Server zu schaffen, die Hunderttausende von Webanfragen pro Sekunde handhaben und generell Threads für die Bearbeitung der Anfragen vermeiden. Anders ausgedrückt: Wenn I/O auftritt, möchte ich, dass es asynchron ist (sagen wir auf Basis von Libevent). Leider habe ich festgestellt, dass die meisten C-APIs keine Unterstützung für die gleichzeitige Verwendung bieten. Zum Beispiel blockiert die allgegenwärtige MySQL C-Bibliothek vollständig, und das ist nur eine Bibliothek, die meine Server ausgiebig nutzen. Auch hier kann ich die Nichtblockierung immer simulieren, indem ich sie auf einen anderen Thread verschiebe, aber das ist bei weitem nicht so billig wie das Warten auf ein Ergebnis über den Completion-Callback.
Der Aufruf von 'malloc' verursacht nicht automatisch mehr IO. Vielleicht verwirren Sie die Verwendung des zurückgegebenen Speichers im Gegensatz zur Zuweisung des Speichers an Sie. Nur weil Sie nach 100MB fragen, heißt das nicht, dass 'malloc' sofort 100MB Swapping auslöst. Das passiert nur, wenn Sie auf den Speicher zugreifen. – kaylum
C gibt nicht die zeitliche Leistung von 'malloc()' an. Sicherlich ist dies nicht die erste Anwendung, die Timing-Bedenken hat. Ein typisches "malloc()", das in einem Major-OS verwendet wird, vermeidet Blockierungen für lange Zeit und verteilt sie nur bei Verwendung. http://stackoverflow.com/q/19991623/2410359. – chux