11.05.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!