Avatar billede rellin Nybegynder
28. oktober 2002 - 15:51 Der 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?
Avatar billede rellin Nybegynder
28. oktober 2002 - 15:53 #1
Skal lige sige, at det skal være i standard c i linux...
Avatar billede dittmer Nybegynder
28. oktober 2002 - 19:43 #2
OK, nu bliver det en anelse besværligt...

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...

Mvh
Søren
Avatar billede rellin Nybegynder
28. oktober 2002 - 20:34 #3
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
Avatar billede dittmer Nybegynder
28. oktober 2002 - 22:08 #4
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?

Mvh
Søren
Avatar billede dittmer Nybegynder
28. oktober 2002 - 22:17 #5
BTW: Jeg har ikke referencen her men på kontoret - jeg graver den frem ASAP, men det kan tage lidt tid. Jeg skal ikke derind de næste par dage...

Mvh
Søren
Avatar billede rellin Nybegynder
28. oktober 2002 - 23:48 #6
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester