ooomwd
C OOOMWD SOURCE PV090527 26/04/24 08:23:17 12524 SUBROUTINE OOOMWD (LRET,LSEG) C----------------------------------------------------------------------- C C FAIRE DE LA PLACE EN ZONE ACTIVE C C ->LRET 1 PLUS DE PLACE MEMOIRE OU SUR DISQUE C 2 OK C C LSEG NOMBRE DE MOTS DESIRES C C METHODE UTILISEE C C LIBERER DE LA PLACE EN ZONE ACTIVE EN VIDANT LES SEGMENTS NON C ACTIFS QUI S Y TROUVENT VERS LA ZONE DE DEBORDEMENT MEMOIRE C S'ILS SONT GRANDS OU DANS LES CHAINES DE CANDIDATS AU DEPART C S'ILS SONT PETITS . LORSQU'ON RENCONTRE LE MARQUEUR D'UN SUPER C SEGMENT , ON EXAMINE L'ETAT DU SUPER SEGMENT QUI , SUIVANT LE C CAS EST VIDE EN ZONE DE DEBORDEMENT , ECLATE SUR PLACE OU C RECYCLE EN TETE DU LRU OU QUEUE DU MRU . C C LE PROCESSUS S'ARRETE LORSQUE LA SOMME DES TROUS DEVIENT C SUFFISANTE : C'EST OOOMIN QUI , SUIVANT LE CAS , DETECTERA C LE TROU DE LONGUEUR SUFFISANTE OU PROCEDERA AU TASSEMENT C DE LA MEMOIRE . C ON CONNAIT A TOUT MOMENT LA SOMME DES TROUS PAR UN COMPTEUR C MIS A JOUR A CHAQUE ATTRIBUTION OU LIBERATION D'UN BLOC C EN MEMOIRE . C C CE PROCESSUS EPURE LA ZONE ACTIVE (EFFICACE CONTRE LE MITAGE C CAR IL PERMET LE RECOLLAGE PROGRESSIF DES TROUS) ET EVITE LE C PLUS SOUVENT LE RECOURS AU TASSEMENT (TRAITEMENT POUVANT C DEVENIR EXPLOSIF) C C C ON TRAITERA DANS L ORDRE DE LA CHAINE DES SGM NON ACTIFS LRU : C C - SUPER SEGMENT HOMOGENE LRU VERS LA ZONE DE DEBORDEMENT C - SUPER SEGMENT HOMOGENE MRU OU ACTIF/DESACTIVE HOMOGENE C VERS LA TETE DU MRU C - SUPER SEGMENT ACTIF/DESACTIVE LRU : C COMPOSANTS NON ACTIFS --> INACTIFS C MARQUEUR EN QUEUE DU LRU C - SUPER SEGMENTS AUTRES CAS :ECLATEMENT C - GROS SEGMENTS VERS LA ZONE DE DEBORDEMENT C - PETITS SEGMENTS INACTIFS VERS CHAINE INACTIVE C - PETITS SEGMENTS DESACTIVES VERS CHAINE DESACTIVE(MODOUNOMOD) C C PUIS DANS L'ORDRE DE LA CHAINE MRU : C C - SUPER SEGMENTS HOMOGENE MRU VERS LA ZONE DE DEBORDEMENT C - SUPER SEGMENTS AUTRES CAS : ECLATEMENT C - GROS SEGMENTS : VERS LA ZONE DE DEBORDEMENT C - SEGMENTS DESACTIVES VERS CHAINE DESACTIVE (MOD OU NOMOD) C C SI AU COUR DE CE PROCESSUS UNE CHAINE DEPASSE LA CAPACITE C DU BUFFER , LES SEGMENTS SONT TRANSFERES DANS LE BUFFER . C UNE FOIS PLEIN LE BUFFER EST VIDE SUR DISQUE. C C L'ECLATEMENT D'UN SUPER SEGMENT SE FAIT SUR PLACE : C LE COMPOSANT EST INSERE DEVANT LE SEGMENT QUI PRECEDE C LE MARQUEUR S'IL APPARTIENT A LA MEME CHAINE , ET SINON C EN QUEUE DU LRU OU EN TETE DU MRU CORRESPONDANT . C C LES PRINCIPALES VARIABLES C C IDEA TETE D'UNE CHAINE DE DESCRIPTEURS DE SEGMENTS NON ACTIFS C EN ZONE ACTIVE . C IDEB TETE DE LA CHAINE DES DESCRIPTEURS DE SEGMENTS NON ACTIFS C CANDIDATS AU DEPART ( INACTIF DESACTIF ) C IDA DESCRIPTEUR D'UN SEGMENT D'UNE CHAINE IDEA C LSA LONGUEUR DU SEGMENT DE DESCRIPTEUR IDA C ISA ADRESSE DU SEGMENT DE DESCRIPTEUR IDA EN ZONE ACTIVE C C IZA INDICE DE LA ZONE ACTIVE C C PROGRAMMEUR : MOUGIN C MODIF : 03/01/89 ADAPTER A LA FAMILLE OOOW.. C MODIF : 03/04/89 MESSAGE : FICHIER DEBORDEMENT PLEIN C MODIF : 08/08/92 INVERSION MRU LRU POUR MIEUX TRAITER MATRICES C C----------------------------------------------------------------------- C %INC IOOADR %INC IOOADZ %INC IOODES %INC IOOSGM %INC IOOPBUF %INC IOOTRO %INC IOOWCOM C C C------ PAS DE DEBORDEMENT MEMOIRE ? : C KRET = 2 PBUF = MZPBUF IF (PBUF.NE.0) THEN C C------ INITIALISATION C LSBUF=PBUF.BUFFER(/1) C C------ TRAITEMENT DES CHAINES DE SGM NON ACTIFS (LRU OU MRU) C C PV d'apres FT pour traiter efficacement grosse matrice DO I = MRU,LRU,-1 IDEA=MDACHN(I) C PARCOURS D'UNE CHAINE (ON SE RETROUVE TJ EN TETE DE CHAINE) * d'abord on sauve la place libre actuelle mlibre = MZLTROU(IZA,ZMEMDYN) 100 IDA=MSIDS(MDISG(IDEA)) C FIN DE CHAINE? IF (IDA.NE.IDEA) THEN C TRT D'UN SGM (INDICE ET LG) ISA =MDISG(IDA) LSA =MSLS1(ISA) ITYPA =MDTYP(IDA) IQUEUA=MDQUEU(ITYPA) C C------ MARQUEUR D'UN SUPER SEGMENT C IF (MDCAT(ITYPA).EQ.MDMARK) THEN C IF( S S HLRU (ISA) .OR. 1 ( S S HMRU (ISA).AND.(IQUEUA.EQ.MDMRU))) THEN IF (TESOOO) CALL OOOWER (' OOOMWD => OOOSUW') CALL OOOSUW (KRET,IDA) IF (KRET.EQ.1) GO TO 200 IF (TESOOO) CALL OOOWER (' OOOMWD <= OOOSUW') LST = (MSLMARK)+MSMARK(ISA) MSLS1(ISA) = LST MSLS2(ISA) = LST MSIDE(ISA) = IDA MDTRK(IDA) = 0 MDCAT(ITYPA) = MDISOLE MDTYP(IDA) = ITYPA CALL OOOSUG (IDA) IF (IQUEUA.EQ.MDLRU) THEN ICHN=LRU ELSE ICHN=MRU ENDIF MZQCHN(ICHN) =MZQCHN(ICHN)+LST-(MSLMARK) MZJSS(ACTUEL)=MZJSS(ACTUEL)-1 MZJSM(ACTUEL)=MZJSM(ACTUEL)-(MSLMARK) C ELSEIF (( S S HMRU (ISA) 2 .AND. IQUEUA.EQ.MDLRU) THEN IDEB=MSIDS(MDISG(MDACHN(MRU))) IF (IDEB.NE.IDA) THEN MDCHN ,IDEB (IDA) ENDIF MDQUEU(ITYPA)=MDMRU MDTYP(IDA) =ITYPA C ISX =ISA+(MSLMARK) ISF =ISX+MSMARK(ISA) DO WHILE (ISX.LT.ISF) LSX = MSLS1(ISX) IDX = MSIDE(ISX) ITYPX = MDTYP(IDX) IF (MDETAT(ITYPX).NE.MDACT) THEN ISTAT=MSMKISS(ITYPX) MSMKSTAT(ISA,ISTAT) =MSMKSTAT(ISA,ISTAT)-1 MSMKSTAT(ISA,STINACT)=MSMKSTAT(ISA,STINACT)+1 MDETAT(ITYPX) =MDINACT MDTYP(IDX) =ITYPX ENDIF ISX=ISX+LSX ENDDO C IDEB=MDACHN(LRU) MDCHN ,IDEB(IDA) ELSE CALL OOOSUS (IDA) ENDIF C C------ GROS SEGMENT : ECRITURE EN ZONE DE DEBORDEMENT C ELSEIF (LSA.GT.(LSBUF/2)) THEN IF (TESOOO) CALL OOOWER (' OOOMWD => OOOSUW') CALL OOOSUW (KRET,IDA) IF (KRET.EQ.1) GO TO 200 IF (TESOOO) CALL OOOWER (' OOOMWD <= OOOSUW') C C------ PETIT SEGMENT : TRANSFERT DANS LA CHAINE BUFFER CORRESPONDANT C AU TYPE DU SEGMENT ELSE ICHN=MDNQIO(ITYPA) IDEB=MDACHN(ICHN) C CHAINE PLEINE ? C TRANSFERT DES SEGMENTS DANS LE BUFFER IF (MZQCHN(ICHN)+LSA.GT.LSBUF) THEN IF (TESOOO) CALL OOOWER (' OOOMWD 7') ISX = 0 LSX = MZQCHN(ICHN) ISB = MDISG(IDEB) DO WHILE (ISX.LT.LSX) IDB=MSIDS(ISB) ISB=MDISG(IDB) LSB=MSLS1(ISB) CALL OOOZMV (JSG(ISB+1),PBUF.BUFFER(ISX+1),LSB) MZJSS(DEPLACES)=MZJSS(DEPLACES)+1 MZJSM(DEPLACES)=MZJSM(DEPLACES)+LSB ISX=ISX+LSB ENDDO C ECRITURE DU BUFFER EN ZONE DE DEBORDEMENT IF (TESOOO) CALL OOOWER (' OOOMWD => OOOBUW') CALL OOOBUW (KRET,LSX) IF (KRET.EQ.1) GO TO 200 IF (TESOOO) CALL OOOWER (' OOOMWD <= OOOBUW') ENDIF MDCHN , IDEB(IDA) MDIO(ITYPA)=MDBUF MDTYP(IDA) =ITYPA C ENDIF C C NBRE DE MOTS LIBRES SUFFISANT? C ** on s'oblige a un gain minimal IF (MZLTROU(IZA,ZMEMDYN)-mlibre.LT.MZLEN(IZA)*0.05.OR. > MZLTROU(IZA,ZMEMDYN).LT.LSEG) GO TO 100 C LRET = 2 RETURN ENDIF ENDDO ENDIF 200 IF (TESOOO) CALL OOOWER (' OOOMWD => OOOMTA : TASSEMENT') CALL OOOMTA (LRET,LSEG) IF (TESOOO) CALL OOOWER (' OOOMWD <= OOOMTA') IF (LRET.EQ.1 .AND. KRET.EQ.1) THEN CALL OOOERR (0,3,'LE FICHIER DE DEBORDEMENT MEMOIRE EST PLEIN') ENDIF END
© Cast3M 2003 - Tous droits réservés.
Mentions légales