Changeset 14 for tags


Ignore:
Timestamp:
Jun 4, 2011, 7:31:28 PM (13 years ago)
Author:
Mattia Monga
Message:

Best fit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tags/minix3.1.2a-orig/minix/servers/pm/alloc.c

    r9 r14  
    6868 * needed for FORK or EXEC.  Swap other processes out if needed.
    6969 */
    70   register struct hole *hp, *prev_ptr;
     70  register struct hole *hp, *prev_ptr, *best, *prev_best;
     71  int delta=-1;
    7172  phys_clicks old_base;
    72 
    7373  do {
    7474        prev_ptr = NIL_HOLE;
    75         hp = hole_head;
    76         while (hp != NIL_HOLE && hp->h_base < swap_base) {
    77                 if (hp->h_len >= clicks) {
    78                         /* We found a hole that is big enough.  Use it. */
    79                         old_base = hp->h_base;  /* remember where it started */
    80                         hp->h_base += clicks;   /* bite a piece off */
    81                         hp->h_len -= clicks;    /* ditto */
    82 
    83                         /* Remember new high watermark of used memory. */
    84                         if(hp->h_base > high_watermark)
    85                                 high_watermark = hp->h_base;
    86 
    87                         /* Delete the hole if used up completely. */
    88                         if (hp->h_len == 0) del_slot(prev_ptr, hp);
    89 
    90                         /* Return the start address of the acquired block. */
    91                         return(old_base);
    92                 }
    93 
    94                 prev_ptr = hp;
    95                 hp = hp->h_next;
    96         }
    97   } while (swap_out());         /* try to swap some other process out */
     75        hp = hole_head;
     76        while (hp != NIL_HOLE && hp->h_base < swap_base) {
     77                printf("base:%d len:%d (req:%d)\n", hp->h_base, hp->h_len, clicks);
     78                if (hp->h_len == clicks) {
     79                        /* We found a hole that is big enough.  Use it. */
     80                        old_base = hp->h_base;  /* remember where it started */
     81                        hp->h_base += clicks;   /* bite a piece off */
     82                        hp->h_len -= clicks;    /* ditto */
     83                        /* Remember new high watermark of used memory. */
     84                        if(hp->h_base > high_watermark)
     85                                high_watermark = hp->h_base;
     86                        /* Delete the hole if used up completely. */
     87                        if (hp->h_len == 0) del_slot(prev_ptr, hp);
     88                        /* Return the start address of the acquired block. */
     89                        printf("Allocazione 'perfetta'\n");
     90                        return(old_base);
     91                if (hp->h_len > clicks) {
     92                        if (hp->h_len - clicks < delta || delta == -1){
     93                                delta = hp->h_len - clicks;
     94                                best = hp;
     95                                prev_best = prev_ptr;
     96                        }
     97                prev_ptr = hp;
     98                hp = hp->h_next;
     99        if (delta > -1){
     100           printf("Allocazione con delta=%d\n",delta);
     101           old_base = best->h_base;     /* remember where it started */
     102           best->h_base += clicks;      /* bite a piece off */
     103           best->h_len -= clicks;       /* cioe` delta */
     104           /* Remember new high watermark of used memory. */
     105           if(best->h_base > high_watermark)
     106                high_watermark = best->h_base;
     107           /* Delete the hole if used up completely. */
     108           if (best->h_len == 0) printf("Non dovrebbe mai succedere\n");
     109           /* Return the start address of the acquired block. */
     110           return(old_base);
     111  } while (swap_out());         /* try to swap some other process out */
    98112  return(NO_MEM);
    99113}
Note: See TracChangeset for help on using the changeset viewer.