28. oktober 2002 - 15:51Der er
5 kommentarer og 1 løsning
Hægtet liste i shared memory
Hvordan opretter jeg en en hægtet liste i shared memory? Jeg kan godt få lagt et element fra listen ind i shared memory, men hvordan lægger jeg hele listen ind? Skal jeg oprette et shared memory-segment for hvert listeelement?, og hvordan får jeg så segmenterne til at pege på hinanden?
I princippet skal du jo lave din memory management selv. Hvis du tager og allokerer en ordentlig røvfuld memory kan du jo selv styre, hvor du tildeler stykker af dette segment til hvert liste-element. Der er således ikke nogle systemkald indblandet i dette, når blot du har allokeret dit shared memory-segment.
Du skal således opretholde en free-liste, der indeholder oplysninger om de delsegmenter, der er ledige. Hver gang du laver en sh_mem_malloc() (eller hvad du nu vil kalde den) skal du så opdatere din free-liste tilsvarende.
Jeg ved ikke, om du har været med så længe som fra dengang, der ikke var værktøjer til at finde memory leaks, men det er tilsvarende teknikker, så man i et kontrolleret miljø kan holde styr på den hukommelse, der bliver allokeret og frigivet. Du skal bare gøre det i et stykke shared memory.
Jeg har jo set det tidligere spørgsmål, og så vil jeg da lige give en anden mulighed, som jeg måske selv ville vælge: Hvorfor laver du ikke en tredje proces, der udelukkende styrer din linked list? Den kan du udstyre med en message queue (eller dit foretrukne IPC-værktøj), hvorigennem du kan give ordrer til at indsætte, slette, læse osv. Det giver endvidere mulighed for at undgå en yderligere synkronisering... Eller hvad med RPC? Kunne det ikke være en mulighed? Så ville du kunne gøre det uden hensyntagen til Linux/UNIX-arkitekturer...
Nå, dette var lidt off topic, men jeg ved, at du helst vil undgå shared memory, og da shared memory vil give dig en ret stor kodeopgave i form af et memory management-system, så... Hvis det har interesse kan jeg nok grave en reference frem til noget omkring mem.mgmt.system...
Jeg havde også selv overvejet at bruge message queues, men problemet er, at systemet skal kunne lave flere opdateringer i listen samtidigt, hvilket jeg ikke tror er muligt hvis jeg benytter message queues?
Jeg må indrømme at jeg ikke kender noget til det mem.mgmt.system du nævner, men hvis du tror det kan hjælpe mig og hvis det ikke kræver den helt store kodning, er jeg meget interesseret
Det kræver en del kodning - det går ud på det, jeg skrev ovenfor... Hvad mener du med at sige "lave flere opdateringer samtidigt"? Mener du sådan *virkelig* samtidig, eller "bare" at flere processer på skift og uden orden skal kunne opdatere listen? Hvis du laver det i shared memory, skal der være en synkronisering som gør, at der ikke er mere end én proces, der piller i (de samme områder af) listen på én gang. Jeg er ikke klar over, hvilke operationer, du forventer at skulle anvende på listen, men hvis du f.eks. vil sortere den engang i mellem, skal i princippet hele listen låses... Dette vil du også (og sandsynligvis lettere) kunne implementere med en message queue eller en anden IPC-form... Ved message queues er det køen, der giver dig synkroniseringen.
Fortæl lidt mere om dine krav: Er det vigtigt, at to eller flere processer piller i listen på én gang, eller er det blot nødvendigt at to eller flere processer kan få listen ændret?
Jeg har lige løst problemet! Hver gang jeg opretter et nyt listeelement gør jeg det i et nyt shared memory segment. Hvert segment indeholder så en pointer, så det kan pege på det næste element i listen.
Du skal have mange tak for hjælpen... Hvis det er, vil jeg stadig gerne se hvad du har om mem.mgmt.system
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.