Memòria

  1. Analitza detingudament el codi de la figura (programa mem) i respon les preguntes justificadament. Considereu que s’executa en un sistema Linux, amb Copy on Write i mida de pàgina de 4096 bytes. La mida de l’executable miprog és la mateixa que la de mem.

     1/************** mem.c ****************/
     2#define MIDAPAGINA 4096
     3int matrix[MIDAPAGINA*16];
     4void fgolafre(int j) {
     5    int i;
     6    for (i=j;i<MIDAPAGINA*16;i++) matrix[i]=23;
     7}
     8int main() {
     9    int *vector;
    10    vector=(int*)malloc(MIDAPAGINA*8);
    11    if (fork()==0) {
    12        execlp("miprog","miprog",NULL);
    13    }
    14    else if (fork()==0) {
    15        vector[4]=73;
    16        exit(0);
    17    }
    18    fgolafre(MIDAPAGINA*4);
    19    waitpid(-1,NULL,0);
    20    waitpid(-1,NULL,0);
    21    free(vector);
    22    return 0;
    23}
    1. A quina regió de memòria està el contingut de la variable matrix? I el contingut de vector?

      Resposta

      matrix és una variable global no inicialitzada, per tant, estarà a la zona de dades. Podeu mirar la sortida de nm, que ens confirma que està a .bss

      vector és una variable local, per tant, estarà a la pila, però el seu contingut estarà al heap.

    2. Quines regions de memòria es modificaran en executar-se la crida a la funció fgolafre?

      Resposta

      El codi de la funció recorre part de matrix, que és a la zona de dades. Però també té paràmetres i variables locals que són a la pila.

    3. Just després del malloc, part del contingut del fitxer maps del procés pare és el següent:

      /proc/29390$ cat maps
      55a6e75e9000-55a6e75ea000 r-xp 00000000 08:01 1074816         /home/alumne/final/mem
      55a6e77e9000-55a6e77ea000 r--p 00000000 08:01 1074816         /home/alumne/final/mem
      55a6e77ea000-55a6e77eb000 rw-p 00001000 08:01 1074816         /home/alumne/final/mem
      55a6e9248000-55a6e9269000 rw-p 00000000 00:00 0               [heap]
      7fff35c97000-7fff35cb8000 rw-p 00000000 00:00 0               [stack]
      Quantes pàgines mesura la regió del heap? Quant feia abans del malloc?
      Resposta

      \$55a6e9269000 - 55a6e9248000 = 21000\$, és a dir, 33 pàginas (1000 en hexadecimal és 4096 en base 10) . Moltes més de les 8 demanades. Abans d’aquesta línia el heap no existia.

    4. Quin procés provoca més fallades de pàgina a causa de l’ús de COW? Si no hi hagués COW, quin procés seria el més perjudicat?

      Resposta

      El procés pare escriu a més pàgines compartides, cosa que provocarà errors de pàgina per demanar noves pàgines per al procés fill i copiar-les.
      Si no hi hagués COW, el primer procés fill seria el més perjudicat quant a temps de creació al fork. Caldria demanar memòria i copiar totes les pàgines del pare, per immediatament rebutjar-les en canviar la imatge del procés a la crida a execlp .

  2. En un sistema amb gestió de memòria basada en paginació, amb una mida de pàgina de 4KB, que no disposa de memòria virtual, executem el codi següent sense que hi hagi altres processos en execució.

     1        int miarray[256]:
     2        main(){
     3           int ret,i;
     4
     5           for (i=0;i<255;i++)
     6              miarray[i]=0;
     7           ret=fork();
     8           /*Hem arribat al primer punt*/
     9           for (i=0;i<255;i++)
    10              miarray[i]=ret;
    11         /*Hem arribat al segon punt*/
    12
    13}

    La regió de codi ocupa 1KB, la regió de pila ocupa 256Bytes, i la regió de dades ocupa 1KB. La figura següent mostra l’estat de les taules de pàgines dels dos processos, suposant que ambdós processos arriben alhora a la línia 8 i que tots dos arriben alhora a la línia 11 (per a cada entrada es mostra només el camp corresponent al frame) .

    Cas A, línia 8
    cas A: línia 8.
    Cas B, línia 11
    cas B: línia 11
    1. Suposant que ambdós processos són a la línia 8 (cas A), calcula la quantitat de memòria física expressada en Bytes reservada entre els dos processos. Justifica el càlcul.

      Resposta

      A les taules de pàgines apareixen 4 frames diferents (405,406,407 i 408): 4KB*4=16384 Bytes

    2. Tenint en compte el codi i els estats de les taules de pàgines. Podem deduïr si aquest sistema ofereix COW? Per què?

      Resposta

      Entre la línia 8 i la 11 canvia la traducció d’una de les pàgines per a 1 dels processos (la pàgina lògica 2 passa de tenir associat el frame 406 a tenir associat el frame 409). Això vol dir que ha deixat de compartir-se. Entre aquestes dues línies es modifica la variable miarray que està a la zona de data, cosa que obliga a fer la rèplica entre els dos processos.

    3. Tenint en compte el codi i els estats de les taules de pàgines, és possible deduir en quin frame o frames tenim el contingut de cada regió de cada procés?

      Resposta

      L’espai d’adreces dels dos processos tenen la regió de codi (que no es modifica), la de pila (que es modifica) i la de dades (que també es modifica). A la línia 8 només hem modificat la pila (variable ret), per tant en els frames 407 i 408 tenim les piles del cada procés. A la línia 11 s’ha modificat la regió data, per tant, els frames 406 i 409 tenen la regió de data de cada procés. I la pàgina 405, el codi compartit.

    4. Suposant que ambdós processos són a la línia 8 (cas A), tenim fragmentació interna? Si és així calcula la quantitat de memòria que es malgasta entre els dos processos en aquest punt.

      Resposta

      Dels 16384 Bytes reservats (4 pàgines de 4096 Bytes cadascuna) només s’usen 2560 Bytes (la suma del que ocupa el contingut de les 4 pàgines): es desaprofiten 13824.

Sistema de fitxers

  1. A un sistema de fitxers Linux, tenim aquesta sortida a la pantalla del terminal. El directori actual és /homeA/j/jfornes/examen

    jfornes@sert-entry-2:~/examen$ ls -liaR
    .:
    total 28
    22289205 drwxr-xr-x  3 jfornes ac  4096 Nov 28 09:20 .
    22282340 drwx--x--x 82 jfornes ac 12288 Nov 28 10:27 ..
    22289207 -rw-r--r--  3 jfornes ac     5 Nov 24 13:52 idem.txt
    22289207 -rw-r--r--  3 jfornes ac     5 Nov 24 13:52 one_file.txt
    22289214 lrwxrwxrwx  1 jfornes ac     1 Nov 24 12:27 quiz -> .
    22289249 drwxr-xr-x  2 jfornes ac  4096 Nov 28 10:27 subdir
    22289215 prw-r--r--  1 jfornes ac     0 Nov 24 12:29 talk_to_me.ch
    
    ./subdir:
    total 24
    22289249 drwxr-xr-x 2 jfornes ac 4096 Nov 28 10:27 .
    22289205 drwxr-xr-x 3 jfornes ac 4096 Nov 28 09:20 ..
    22289283 -rwxr-xr-x 1 jfornes ac 8568 Nov 28 10:27 e.out
    22289251 lrwxrwxrwx 1 jfornes ac   32 Nov 28 10:14 quatre_file.txt -> /homeA/j/jfornes/examen/idem.txt
    22289207 -rw-r--r-- 3 jfornes ac    5 Nov 24 13:52 tres_file.txt

    Respon raonadament a les següents preguntes:

    1. Completa la taula d’inodes, omplint les cel·les amb interrogant.

      Inode

      22289205

      22282340

      22289207

      22289214

      22289249

      22289215

      22289251

      22289283

      #links

      3

      82

      ?

      1

      ?

      1

      1

      1

      Type

      d

      d

      -

      ?

      d

      ?

      l

      -

      Resposta

      Inode

      22289205

      22282340

      22289207

      22289214

      22289249

      22289215

      22289251

      22289283

      #links

      3

      82

      3

      1

      2

      1

      1

      1

      Type

      d

      d

      -

      l

      d

      p

      l

      -

    2. Llista tots els noms de fitxer (path names), per a accedir a l’inode 22289207

      Resposta

      Dins el directori pare (/homeA/j/jfornes/examen), té tres noms de fitxer: one_file.txt, idem.txt i tres_file.txt. També, el soft link, subdir/quatre_file.txt

      Donat el següent codi que correspon al binari e.out i assumint que cap crida al sistema retorna error, respon raonadament a les següents preguntes:

       1int main() {
       2    char buf[128];
       3    int fd,s;
       4    fd=open(/homeA/j/jfornes/examen/subdir/quatre_file.txt, O_RDONLY);
       5    s=lseek(fd,0,SEEK_END);
       6    sprintf(buf,"%d\n",s);
       7    write(1,buf,strlen(buf));
       8    close(fd);
       9    return(0);
      10}
    3. Llançant el programa e.out des del shell

      1. Quins inodes es llegeixen en executar la línia 4? Anota els nombres quan siguin coneguts.

        Resposta

        Ha de llegir l’inode de cadascun dels directoris del camí, ie, /(inode 2), homeA, j (d’aquests dos no podem deduïr el nombre a partir de l’enunciat), jfornes (inode 22282340), examen (inode 22289205) i subdir (inode 22289249), després llegeix l’inode de quatre_file.txt(22289251) que és un soft link i li obliga a llegir l’inode de idem.txt (22289207).

      2. Quins blocs de dades es llegeixen en executar la línia 4?

        Resposta

        Ha de llegir els blocs de dades de cada directori del camí, ie, /, homeA, j, jfornes, examen i subdir. Però no ha de llegir el bloc de dades de quatre_file.txt, perquè la mida del camí d' idem.txt hi cap dins l’inode 22289251, ja llegit.

      3. Quin és el valor de la variable fd després d’executar la línia 4?

        Resposta

        Donat que el programa s’ha llançat des de la línia de comandes, fd valdrà 3. Dit d’una altra manera, el descriptor de fitxer (canal) retornat pel sistema, excepte error, és la primera entrada lliure a la taula de canals del procés.

      4. Quin és el valor de la variable s després d’executar la línia 5?

        Resposta

        Valdrà 5. En acabar lseek amb èxit, retorna els desplaçament del punter de lectura/escriptura, mesurat en bytes, des de l’inici del fitxer. En aquest cas, la mida del fitxer; cosa que també retorna la línea de comandes ls -liaR mostrada al començament de l’enunciat.

Preguntes curtes

  1. Explica l’impacte de l’execució de fork i exit a les tables de gestió d’entrada/sortida.

    Resposta

    fork: copia la taula de canals del pare al procés fill. Així, es tracta d’actualitzar les referències a la TFO (taula de fitxers oberts), augmentant 1 el nombre de referències per cada descriptor de fitxer que apunta a l’entrada concreta. Per això, tant el pare com el fill comparteixen entrades a la TFO i, per tant, altres camps d’aquestes entrades, com ara el punter de Lectura/Escriptura (desplaçament). Un fork mai modifica la taula de inodes.

    exit: implica tancar tots els descriptors de fitxers del procés (canals). Així, també implica l’actualització de referències a la TFO, la qual cosa pot portar a alliberar algunes entrades. Si és així, també actualitza les referències a la taula d’inodes, la qual cosa pot provocar que es s’alliberin algunes entrades.

  2. Llista les crides al sistema d’E/S que poden crear noves entrades a la taula de canals.

    Resposta

    open, dup, dup2, pipe. També acceptariem create i dup3.

  3. El següent codi l’executen dos processos no relacionats per parentiu que volen intercanviar els seus PIDs fent servir sengles named pipes: una per a cada sentit de la comunicació. Cada procés obre correctament les pipes i tots dos primer executen una syscall read i després una syscall write. Digueu si és correcte o no i justifiqueu la resposta.

    1int su_pid,mi_pid;
    2mi_pid=getpid();
    3read(fd_lect,&su_pid,sizeof(int));
    4close(fd_lect);
    5write(fd_esc,&mi_pid,sizeof(int));
    6close(fd_esc);
    Resposta

    No és correcte, perquè tots dos processos quedaràn bloquejats en la crida read.

  4. En un sistema de fitxers basat en inodes, quins són els dos tipus d’enllaços disponibles? Expliqueu breument la seva implementació (tipus de fitxer especial (sí/no), informació, etc.).

    Resposta

    hard link: És la relació directa entre un nom simbòlic i l’ID de l’inode, que té els punters a les dades del propi fitxer. El directori només conté el nom del fitxer i l’ID de l’inode. Per seguretat, no es permeten hard links a directoris (excepte per a l’usuari root).

    Soft link: és un tipus especial de fitxer (enllaç) que conté el camí d’accés a un altre fitxer (per exemple, referència indirecta). El directori té la relació entre el nom del fitxer del soft link i el seu inode. Les dades d’aquest fitxer tenen el camí a descodificar per accedir a les dades del fitxer de destinació final.