Lost_headache Δημοσ. 27 Νοεμβρίου 2005 Δημοσ. 27 Νοεμβρίου 2005 Καλησπέρα! Μήπως ξέρει κανεις αν υπάρχει κάποια εντολή στη c που να επιστρέφει τη διαθέσιμη μνήμη του προγράμματός μας? Δηλαδή θέλω να κάνω όσο πιο μεγάλο malloc μπορώ, αλλά θέλω να ξέρω πόσο θα είναι αυτό! Δύσκολο?
takis456 Δημοσ. 27 Νοεμβρίου 2005 Δημοσ. 27 Νοεμβρίου 2005 Για πιο λόγο θα ήθελες κάτι τέτοιο? Μπορείς να δοκιμάσεις μια δικιά σου αρκετά μεγάλη τιμή και να καλέσεις την malloc. Εάν δεν υπάρχει αρκετή μνήμη θα σου επιστρέψει null, έτσι μπορείς να μειώσεις τη μνήμη που κάνεις malloc και να ξαναδοκιμάσεις.
YiannisMn Δημοσ. 27 Νοεμβρίου 2005 Δημοσ. 27 Νοεμβρίου 2005 Ανάλογα με το λειτουργικό που τρέχεις (π.χ. Windows, Linux, κλπ), καλείς την αντίστοιχη κλήση του λειτουργικού που επιστρέφει την ελεύθερη μνήμη του συστήματος... Μου διαφεύγει αυτή τη στιγμή αν υπάρχει σε κάποιο standard library αυτή η δουλειά, οπότε πας μέσω λειτουργικού... π.χ. Αν προγραμματιζεις σε Windows, ψάξε στις κλήσεις του Win32 API, κλπ κλπ, διότι βαριέμαι να το ψάξω τώρα εγώ... ΠΡΟΣΟΧΗ: Θα πρέπει να προσέξεις να του ζητήσεις μόνο την ελεύθερη μνήμη, χωρίς την ποσότητα Swap file...
Lost_headache Δημοσ. 27 Νοεμβρίου 2005 Μέλος Δημοσ. 27 Νοεμβρίου 2005 Ευχαριστώ πολύ παιδιά!! Μάλλον για τη δουλειά που θέλω να κάνω θα προσπαθήσω να εφαρμόσω τη λύση του takis456, και μόλις καθαρίσω θα ψάξω το Win32 API να δω τι προσφέρει!! Ευχαριστώ πολύ!!!
Directx Δημοσ. 28 Νοεμβρίου 2005 Δημοσ. 28 Νοεμβρίου 2005 Καλύτερα να μελετήσεις την εντολή GlobalMemoryStatus του WinAPI καθώς η χρήση της malloc από την στιγμή που τα Windows υλοποιούν εικονική μνήμη δεν θα σε βοηθήσει ιδιαίτερα ενώ παράλληλα θα επηρεάσει αρνητικά τις επιδόσεις του συστήματος και ενδεχομένως την σταθερότητα του.
chiossif Δημοσ. 28 Νοεμβρίου 2005 Δημοσ. 28 Νοεμβρίου 2005 Η γλώσσα C είναι η πιο μεταφέρσημη (portable) τόσο οριζόντια (σε όλους τους Η/Υ του καιρού μας) όσο και κάθετα (αυτό ισχύει από τότε που γράφτηκε έως σήμερα). Είναι λοιπόν ΣΚΟΠΙΜΟ να μην διαθέτει μια τέτοια υπορουτίνα. ΔΕΝ συμφωνώ με μια λύση της μορφής: malloc 2GB και μετά αμέσως free και στην συνέχεια να θεωρώ ότι τα 2GB θα είναι διαθέσιμα εσαεί. Στα ταπεινά προγραμματάκια μου (σε ANSI C), και χωρίς να είμαι ειδικός, όποτε ζήτησα μνήμη την πήρα. Φρόντισα βέβαια τα βαριά να τα τρέχω σε linux...ή αν είμαι στα windows (2k) να με καλύπτει η RAM διότι, κατά την ταπεινή μου πάντα άποψη, η διαχείρηση εικονικής μνήμης στα win είναι έσχως.... (και για να προλάβω τον Βασιλάκη τον Πόρτα, μπορεί να έστειλα αυτό το μύνημα με firefox αλλά απο κάτω τρέχουν w2k. κλαψ...κλαψ...κλαψ...)
YiannisMn Δημοσ. 29 Νοεμβρίου 2005 Δημοσ. 29 Νοεμβρίου 2005 Ενώ συμφωνώ μαζί σας απόλυτα επί της αρχής, εν τούτοις υπάρχουν περιπτώσεις που πολλαπλές μικρές malloc+free ΔΕΝ είναι η ιδανική λύση κατά τη γνώμη μου, διότι έχει και η malloc το κατιτίς overhead της το οποίο σε κάποιες ειδικές περιπτώσεις ίσως και να θέλουμε να το αποφύγουμε... Π.χ., αν είναι να φτιάξω ένα προγραμμα το οποίο θα πρέπει να κρατάει εκατοντάδες χιλιάδες ή εκατομύρια μικρά objects (ή records) με δεν ξέρω-γω τί abstract πληροφορίες στη μνήμη, τότε οι εκατοντάδες χιλιάδες ή εκατομύρια malloc και μετά οι αντίστοιχες free ΔΕΝ θα ήταν η λύση που θα διάλεγα! Ούτε όμως θα διάλεγα ένα τεράστιο chunk για όλα αυτά τα objects, διότι όταν δεσμεύεις τεράστια chunks μνήμης τότε δυσκολεύεις το λειτουργικό να διαχειριστεί τα δεσμευμένα blocks μνήμης του συστήματος και σε συνδυασμό και με το swap file... Οπότε το πρόγραμμά σου θα είναι μάλλον βαρύ σ' αυτή την περίπτωση, και θα καταλήξει να είναι μισητό στους χρήστες του με την πάροδο του χρόνου... Σ' αυτές τις περιπτώσεις, ο καλύτερος τρόπος νομίζω είναι να οργανώνεις τα blocks που θα δεσμεύεις με κάποον τρόπο (ανάλογα με την περίπτωση/εφαρμογή), έτσι ώστε 1 block μνήμης (με 1 malloc+free κάθε φορά) να κρατάει κάποιον αριθμό objects μαζεμένα στο ίδιο block (όχι φοβερά μεγάλο πλήθος). Για παράδειγμα, θα προτιμούσα να φωνάζω μία malloc+free ανά 10 ή 100 ή 1000 τέτοια object-άκια, ή (ακόμα καλύτερα) να έχω μια υποδομή containers για όσα objects συνδέονται μεταξύ τους με κάποια λογική και συνήθως δημιουργούνται και διαγράφονται όλα μαζί από τη λογική του προγράμματος με μία και μοναδική malloc και με μία και μοναδική free...
spinner Δημοσ. 30 Νοεμβρίου 2005 Δημοσ. 30 Νοεμβρίου 2005 Oσον αφορα το Linux διαβαζεις το αρχειο /proc/meminfo υπερβολικα απλα τα πραγματα... Η malloc απο λειτουργικο σε λειτουργικο εχει διαφορετικη συμπεριφορα γιατι η libc ειναι διαφορετικη απο λειτουργικο σε λειτουργικο.(οχι κατα κανονα ομως.) Αν δυσκολευεσαι κοιτας τον κωδικα τις εντολης free και παιρνεις καποια ιδεα
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.