-
Notifications
You must be signed in to change notification settings - Fork 0
/
PCB.h
146 lines (126 loc) · 3.61 KB
/
PCB.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include "Memory.h"
typedef struct MM {
int code;
int data;
int pgb;
} MM;
typedef struct PCB {
int pid;
int tiempoVida;
int numPrioridad;
int tiempototal;
MM *mm;
int PTBR;
int nPaginas;
int PC;
} PCB;
/**************************************************************
******************** INICIALIZACION **********************
*************************************************************/
MM * createMM(int c,int d, int p) {
MM *mm;
mm = (MM *)malloc(sizeof(MM));
mm->code = c;
mm->data = d;
mm->pgb = p;
return mm;
}
PCB *crearPCB(int id, int tiempoVida, int prioridad, MM *mm, int PTBR, int nPaginas){
PCB *pcb;
pcb = (PCB*)malloc(sizeof(PCB));
pcb->pid = id;
pcb->tiempoVida = tiempoVida;
pcb->tiempototal = tiempoVida;
pcb->numPrioridad = prioridad;
pcb->mm = mm;
pcb->PTBR = PTBR;
pcb->PC = 0;
pcb->nPaginas = nPaginas;
return pcb;
}
PCB * createEmptyPCB() {
PCB *pcb;
pcb = (PCB *)malloc(sizeof(PCB));
pcb->pid = 0;
pcb->tiempototal = 0;
pcb->tiempoVida = 0;
pcb->numPrioridad = 0;
MM *mm = createMM(0,0,0);
pcb->mm = mm;
pcb->PTBR;
pcb->PC = 0;
pcb->nPaginas = 0;
return pcb;
}
/**************************************************************
*********** CONTROL DE TIEMPO Y PRIORIDAD PCB *************
*************************************************************/
int downTimePCB(PCB *pcb){
pcb->tiempoVida = pcb->tiempoVida - 1;
if(pcb->tiempoVida == 0){
return 1;
}else{
return 0;
}
}
int minusPrioridadPCB(PCB *pcb){
if(pcb->numPrioridad == 0 || pcb->numPrioridad == 1){
return 1;
}else{
pcb->numPrioridad = pcb->numPrioridad - 1;
return 0;
}
}
/*-----------------------------------------------------------------
* Aumentar PC del PCB en 4
*----------------------------------------------------------------*/
void aumentarPC(PCB *pcb) {
pcb->PC = pcb->PC + 4;
}
/*-----------------------------------------------------------------
* Ejecutar instrucciones del PCB
*----------------------------------------------------------------*/
int ejecutarInstruccionPCB(Physical *memoria, PCB *pcb) {
//printf("ejecutando PCB");
int i;
for (i=0;i<pcb->nPaginas;i++) {
int instruccion = leerMem(memoria,KERNEL_FI + 1 + pcb->PC + 256*pcb->PTBR + i*256);
printf("El PCB %d esta ejecutando la instruccion %x\n", pcb->pid, instruccion);
aumentarPC(pcb);
}
pcb->tiempoVida = pcb->tiempoVida - 1;
if (pcb->tiempoVida == 0) {
return 1;
} else {
return 0;
}
}
void vaciarMemoriaPCB(Physical *memoria,PCB *pcb) {
int i;
for (i=0;i<pcb->nPaginas;i++) {
escribirMem(memoria,0,KERNEL_FI + 1 + pcb->PC + 256*pcb->PTBR + i*256);
printf("El PCB %d ha terminado y su memoria se ha vaciado\n", pcb->pid);
}
int j;
for (j=0;j<pcb->nPaginas;j++) {
escribirMem(memoria,0,pcb->PTBR+j);
}
}
/**************************************************************
******************* VER ESTADO DE PCB *********************
*************************************************************/
void printMM (MM *mm) {
printf("MM: Code = %d, Data = %d, pgb = %d \n", mm->code, mm->data, mm->pgb);
}
void verPCB(PCB *pcb){
char buf[100];
sprintf(buf, "bash print.sh %d %d %d %d %d", 6, pcb->pid, pcb->tiempoVida, pcb->tiempototal, pcb->numPrioridad);
system(buf);
printMM(pcb->mm);
return;
}