Ejercicio S.O. multiusuario y multitarea Un sistema operativo ...
Ejercicio S.O. multiusuario y multitarea Un sistema operativo ...
Ejercicio S.O. multiusuario y multitarea Un sistema operativo ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Ejercicio</strong> S.O. <strong>multiusuario</strong> y <strong>multitarea</strong><br />
<strong>Un</strong> <strong>sistema</strong> <strong>operativo</strong> <strong>multiusuario</strong> y <strong>multitarea</strong> almacena la siguiente información<br />
sobre sus usuarios:<br />
uid nombre ppaso flogin hlogin pids<br />
dia mes año hh mm ss<br />
0 <strong>sistema</strong> ******* 12 04 2002 22 34 23 12333 3245 1735 34567 ...<br />
18 monica ****** 07 07 2002 09 30 34 0 2351 3566 0 ...<br />
0 <strong>sistema</strong> ***** 12 04 2002 08 24 16 13444 16335 0 0 ...<br />
25 belen ****** 16 07 2002 16 32 23 0 3625 2561 12667 ...<br />
39 vanesa **** 16 07 2002 17 05 51 2398 0 3352 0 ...<br />
... ...<br />
y sus procesos:<br />
pid prog dirIni dirFin<br />
t_ejec<br />
estado<br />
hh mm ss<br />
34567 eudora 0004 12 42 Dormido<br />
3566<br />
0<br />
netscape 2566600 3006000 0008 36 34 Espera<br />
12667<br />
0<br />
cc 0671000 1002000 0000 01 44 Activo<br />
2351 emacs 3100300 3340000 0000 23 26 Espera<br />
3352 vi 0001 16 16 Dormido<br />
16335 csh 0406200 0408000 0011 25 18 Activo<br />
... ...<br />
Se pide diseñar e implementar:<br />
a) Las dos estructuras de datos correspondientes; TUsuarios y TProcesos;<br />
b) <strong>Un</strong> subprograma, UsuariosGolosos, que escriba en pantalla los usuarios<br />
que estén ocupando mucha memoria (por encima de m_umbral) o hayan usado<br />
más de ¾ t medio de CPU.<br />
Notas.<br />
1. Los identificadores de usuario (uid) y los de procesos (pid) son únicos. No<br />
tener en cuenta el usuario <strong>sistema</strong> (uid=0).<br />
2. dirIni y dirFin son direcciones de memoria.<br />
3. Suponed que los procesos dormidos están en memoria secundaria y no<br />
ocupan memoria principal.<br />
/*<br />
* Sistema <strong>operativo</strong> <strong>multiusuario</strong> y <strong>multitarea</strong>.<br />
*/<br />
CONST<br />
N MaxProcesos=16535, MaxProcUsr=128<br />
N MaxUsuarios=128, MaxCadena=250<br />
TIPOS<br />
C TCadena[1..MaxCadena]<br />
ENUM { Activo, Espera, Dormido } TEstado<br />
// los Dormidos no ocupan Mem. Principal<br />
ENUM { Enero, Febrero, Marzo, Abril,<br />
Mayo, Junio, Julio, Agosto, Septiembre,<br />
Octubre, Noviembre, Diciembre } TMes<br />
REGISTRO THora<br />
N hh, mm, ss<br />
FINREGISTRO<br />
REGISTRO TFecha<br />
N dia<br />
TMes mes<br />
N año<br />
FINREGISTRO<br />
N TArrayN[1..MaxProcUsr]<br />
REGISTRO <strong>Un</strong>Usuario<br />
N uid // User IDentificator 0-><strong>sistema</strong><br />
TCadena nombre // Nombre de usuario<br />
TCadena pp // Palabra de Paso<br />
TFecha flogin // Fecha entrada al <strong>sistema</strong><br />
THora hlogin // Hora entrada al <strong>sistema</strong><br />
TArrayN pids // Procesos en ejecución (>0)<br />
FINREGISTRO<br />
<strong>Un</strong>Usuario TUsuarios[1..MaxUsuarios]<br />
REGISTRO <strong>Un</strong>Proceso<br />
N pid // Process IDentificator (>0)<br />
TCadena prog // Nombre del programa<br />
N dirIni // Byte inicial en memoria<br />
N dirFin // Byte final en memoria<br />
THora t_ejec // Tiempo en ejecución<br />
TEstado estado // Estado del proceso<br />
FINREGISTRO<br />
<strong>Un</strong>Proceso TProcesos[1..MaxProcesos]
*<br />
* Busca la posición de un UID en tabla usuarios.<br />
* Devuelve 0 si no se ha encontrado.<br />
*/<br />
ALGORITMO N BuscarUsuario(E N ui; E TUsuarios uss)<br />
VAR N i; B encontrado<br />
INICIO<br />
i=1; encontrado=FALSO<br />
MIENTRAS NO encontrado Y i
*<br />
* Tiempo de ejecución actual de un proceso (en seg)<br />
*/<br />
ALGORITMO N TEjecProceso(E <strong>Un</strong>Proceso proc)<br />
VAR<br />
N t<br />
INICIO<br />
// en el laboratorio, ¡ojo con los rangos!<br />
t = proc.t_ejec.hh*3600<br />
t = t + proc.t_ejec.mm*60<br />
t = t + proc.t_ejec.ss<br />
DEVOLVER t<br />
FIN TEjecProceso<br />
/*<br />
* Calcula la media de ejecución de todos<br />
* los procesos en segundos.<br />
*/<br />
ALGORITMO R TEjecMedio(E TProcesos procs)<br />
VAR<br />
N i, contador<br />
R t_total<br />
INICIO<br />
t_total = 0.0; contador=0<br />
PARA i=1 HASTA MaxProcesos HACER<br />
SI procs[i].pid !=0 ENTONCES<br />
t_total = t_total + R(TEjecProceso(procs[i]))<br />
contador = contador+1<br />
FINSI<br />
FINPARA<br />
DEVOLVER t_total/R(contador)<br />
FIN TEjecMedio<br />
/*<br />
* Tiempo (en seg) de los procesos de un usuario<br />
*/<br />
ALGORITMO N TEjecTotUsuario(<br />
E N usid; // usuario en cuestión<br />
E TProcesos procs; // Tabla información procesos<br />
E TUsuarios uss; // Tabla información usuarios<br />
S B error) // VERDADERO si el usid no existe<br />
VAR<br />
N i, i_uid, i_pid, t // posiciones en tablas y t en seg.<br />
INICIO<br />
i_uid = BuscarUsuario(usid, uss)<br />
SI i_uid==0 ENTONCES<br />
t = 0; error = VERDADERO<br />
SINO<br />
error = FALSO; t = 0<br />
PARA i=1 HASTA MaxProcUsr HACER<br />
SI uss[i_uid].pids[i] != 0 ENTONCES<br />
i_pid = BuscarProceso(uss[i_uid].pids[i], procs)<br />
SI i_pid != 0 ENTONCES<br />
t = t + TEjecProceso(procs[i_pid])<br />
FINSI<br />
FINSI<br />
FINPARA<br />
FINSI<br />
DEVOLVER t<br />
FIN TEjecTotUsuario<br />
/*<br />
* Devuelve el número de procesos de un usuario<br />
*/<br />
ALGORITMO N NumProcsUsuario(E N ui; E TUsuarios uss)<br />
VAR N i, np=0, i_ui<br />
INICIO<br />
i_ui = BuscarUsuario(ui, uss)<br />
SI i_ui != 0 ENTONCES<br />
PARA i=1 HASTA MaxProcUsr HACER<br />
SI uss[i_ui].pids[i] != 0 ENTONCES<br />
np = np+1<br />
FINSI<br />
FINPARA<br />
FINSI<br />
DEVOLVER np // =0 si el usuario no existe<br />
FIN NumProcsUsuario
*<br />
* Escribe los usuarios que estén ocupando mucha<br />
* memoria (por encima de “m_umbral”) o el tiempo medio<br />
* de sus procesos superen los ¾ del t medio de CPU total.<br />
* No se tiene en cuenta el usuario “<strong>sistema</strong>” (uid=0).<br />
*/<br />
ALGORITMO UsuariosGolosos(<br />
E TProcesos procs; // Tabla información procesos<br />
E TUsuarios uss; // Tabla información usuarios<br />
E N m_umbral) // Más se considera mucha memoria<br />
VAR<br />
N u, m; R t, t_umbral; B error_t, error_m<br />
INICIO<br />
t_umbral = TEjecMedio(procs)*3.0/4.0<br />
PARA u=1 HASTA MaxUsuarios HACER<br />
SI uss[u].uid !=0 ENTONCES<br />
t = R(TEjecTotUsuario(uss[u].uid,uss,procs,error_t))/<br />
R(NumProcsUsuario(uss[u].uid, uss))<br />
m = Memoriasuario(uss[u].uid, uss, procs, error_m)<br />
SI (NO error_t Y t>t_umbral) O<br />
(NO error_m Y m>m_umbral) ENTONCES<br />
Escribir(uss[u].nombre)<br />
FINSI<br />
FINSI<br />
FINPARA<br />
FIN UsuariosGolosos<br />
Modularización:<br />
TEjecMedio<br />
TEjecProceso<br />
UsuariosGolosos<br />
TEjecTotUsuario<br />
BuscarProceso<br />
BuscarUsuario<br />
MemUsuario<br />
MemProceso