Process List, aiuto. [8086] [PCB, priorità?]

di il
3 risposte

Process List, aiuto. [8086] [PCB, priorità?]

Salve a tutti, mi scuso se non mi sono presentato ma ho davvero un bisogno urgentissimo.. frequento un istituto tecnico con indirizzo informatico ABACUS (vecchio ordinamento) e mi sono imbattuto in uno strano programma di cui non riesco a capire come posso farlo..
Per quando riguarda la logica credo di aver capito che vuole un'area dati con ID, priorità e roba simile.. e che da un processo P1 si passi ad un altro P2... vi incollo il testo dell'esercizio sotto spoiler, io davvero non so come fare..
Definire:
1.un’area dati per la Process List con 
a.ID IDentity, 
b.nome,
c.per ogni stato un puntatore al record successivo nella lista ‘stato’,
d.Priorità (da 0 a 255) – non gestita in questo esercizio
e.indirizzo del PCB

2.Elenco degli stati che gestisco (es. solo Run, Rdy e Wait), e per ogni stato inserire il puntatore al primo della  lista di ‘stato’. I puntatori puntano ad un record della procees list
3.un’area dati che contenga le Process Control Block di almeno 2 processi P1 e P2 (ogni PCB occupa uno spazio limitato costante – es.: 256 byte) secondo le indicazioni del libro (pag. 67 e 68), mettendo i puntatori delle liste di stato nella Process List. Attenzione che la PSW viene presa in senso più ampio. Considerate tutti i registri!

Scrivere un programma per il cambiamento di contesto (pag 70-71 punti 1, 5) al passaggio da P1 a P2 che utilizzi le aree predisposte.
p.s.: Non avete spoiler? xD
p.p.s: Se volete ho un "esempio" contenuto nel file di testo.. grazie mille a chi risponde!

EDIT: Devo dire che lui non ha spiegato sta roba in laboratorio, in classe siamo arrivati al PCB.. ma dalla teoria alla pratica diamine, ma vuoi fare un esempio concreto?! Siamo passati da esercizi tipo la somma di numeri successivi ad una specie di task manager.. e non è nemmeno informatica, è sistemi! help

EDIT2: Per favore. Ho poco tempo :S

3 Risposte

  • Re: Process List, aiuto. [8086] [PCB, priorità?]

    Bel problema!
    comunque una soluzione mediamente semplice al problema c'è ed è questa :
    1) crea un file a doppio link cioè con puntatori al record successivo e a quello precedente.
    dove il primo record avrà come puntatore al record precedente 0 e l'ultimo record avrà come puntatore al record successivo 0
    i campi del record dovranno essere i seguenti
    record precedente dd ? ; campo numerico
    id processo dw ? ; campo numerico
    nome db 30 dup (?) ; campo alfanumerico
    stato db ? ; dove puoi usare 0 = processo in corso 1= processo sospeso 2= processo finito
    priorità db ?
    dimensione dd ?
    pcb dd ? qui metterai un indirizzo a 32 bit che rappresenterà la locazione di memoria dove vuoi caricare il programma (visto che è un esempio potresti farglielo fare a caso)
    rec successivo dd ? ; puntatore al record successivo
    dimensione del record 50 caratteri
    2) crei un programma per l'immissioni dei processi (record dei file)
    3) crei un programma per la gestione del file dove :
    leggerai il file
    ti carichi in una matrice i seguenti dati
    id processo
    stato
    priorita
    pcb
    dimensione
    ogni riga rappresenta un processo!
    ricordati che quando fai la lettura prima devi spostarti con il puntatore del file e poi vai a leggere.
    esempio spostamento al record n.5
    usa int 21h mod. ah=42 spostamento da inizio file
    record in cui bisogna spostarsi è 5 * 50 - 1
    -1 serve perchè in assembler i numeri iniziano da zero!
    per il tuo programma sarà record successivo * 50 (se utilizzi la struttura che ti ho indicato prima) -1
    una volta spostato puoi leggere il record tramite int 21h mod. ah=3fh
    dopo aver riempito tutta la matrice.
    ti inizializzi un vettore dimensioni di tipo numerico a zero (questo vettore ti permetterà la simulazione di esecuzione di un processo)
    per la simulazione del processo potresti fare nel seguente modo
    conti tutti i processi che hai
    chiudi il file
    ciclo principale
    conti tutti i processi ancora non finiti
    fai tempi processi = 100 / numero processi ( 100 rapresenta il tempo di cpu messo a disposizione per l'elaborazione dei processi)
    poi ti conti i processi che hanno priorità più alta e farai :
    tempo dei processi = tempo dei processi - (tempi processi / numero processi ad alta priorita)
    tempo dei processi = tempo dei processi - (tempo dei processi / numero processi a media priorità)
    tempo dei processi = tempo dei processi - (tempo dei processi / numero processi a bassa priorità)
    dimensione (dei processi ad alta priorità) = dimensione (dei processi ad alta priorità) + (2 * tempo dei processi)
    dimensione (dei processi a media priorità) = dimensione (dei processi ad alta priorità) + (2 * tempo dei processi)
    dimensione (dei processi a bassa priorità) = dimensione (dei processi ad alta priorità) + (2 * tempo dei processi)
    alla fine controlli se la dimensione che stà nella matrice è >= alla dimensione raggiunta dal vettore dimensione.
    cioè processo (x,dimensione) = dimensione(x) ; dove x rappresenta un record qualsiasi.
    se la condizione si avvera allora puoi cambiare stato al processo e terminarlo.
    se tutti i processi sono finiti allora e finito il programma.
    altrimenti rifarai il ciclo principale.

    eccoti spiegato grossolanamente come puoi implementare una simulazione di task manager.
    ps il 2 * rappresenta una cpu 8086 che grossomodo elaborava un byte per ogni ciclo
    4* rappresenta una cpu 80486 una word per ogni ciclo
    8* rappresenta una cpu pentium una dword per ogni ciclo
    16* rappresenta una cpu 64 bit una dd per ogni ciclo

    spiegagli teoricamente come si fa
    perchè se hai poco tempo in pratica non ce la fai per farlo ci vogliono da un minimo di 20 giorni ad un massimo di 3 mesi.
    spero di averti aiutato
  • Re: Process List, aiuto. [8086] [PCB, priorità?]

    Wow!! Non immaginavo una risposta così imponente O.O
    TI ringrazio molto, l'esercizio è per domani ma pur essendomi appoggiato a ben 5 guide di assembler, mi manca proprio il concetto di certe istruzioni. Programmo principalmente in C++ ed è un bel salto di qualità da alto a basso livello.. Ergo, ti ringrazio molto per l'imponente risposta, faccio tesoro di questi concetti per un futuro prossimo (molto prossimo).

    Domani vedrò la reazione del professore. (Comunque, ho saputo che la nostra professoressa di laboratorio ci appoggia nel dire che non possediamo i mezzi necessari per un esercizio simile e, come tu hai detto, ci vogliono un minimo di 20 giorni per completare un esercizio simile.. spero di risolvere l'esercizio, provvederò a pubblicarlo^^)

    Grazie tante
  • Re: Process List, aiuto. [8086] [PCB, priorità?]

    Di nulla e un piacere essere utili.
    ti do un consiglio perchè non l'inplementi in c++?
    cosi i concetti li fisserai meglio e quando poi sarai pronto con l'assembler ti verrà più naturale scrivere il codice.
    in c++ ci vogliono massimo 10 giorni per scriverlo.
    in bocca al lupo
Devi accedere o registrarti per scrivere nel forum
3 risposte