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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
|
#LyX 2.3 created this file. For more info see http://www.lyx.org/
\lyxformat 544
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass book
\use_default_options true
\maintain_unincluded_children false
\language spanish
\language_package default
\inputencoding auto
\fontencoding global
\font_roman "default" "default"
\font_sans "default" "default"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100 100
\font_tt_scale 100 100
\use_microtype false
\use_dash_ligatures true
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\use_minted 0
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style french
\dynamic_quotes 0
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Standard
Normalmente hay bastantes más procesos que CPUs, por lo que hay que repartir
el uso de estas por parte de los procesos, buscando bien la eficiencia,
como en sistemas antiguos, o el poder ejecutar varios programas dando la
sensación de que todos se ejecutan a la vez, como ocurre actualmente.
El paralelismo y el pseudoparalelismo, que se dan normalmente a la vez,
permiten compartir recursos físicos y lógicos entre varios resultados y
acelerar los cálculos dividiéndolos entre varias CPUs, además de aportar
modularidad, al poder diseñar un sistema como un conjunto de procesos,
y comodidad, permitiendo a los usuarios hacer varias cosas a la vez.
\end_layout
\begin_layout Standard
El cambio de un proceso a otro se llama
\series bold
cambio de proceso
\series default
o de
\series bold
contexto
\series default
.
El
\series bold
planificador
\series default
es el procedimiento que decide el siguiente proceso a ejecutar mediante
un
\series bold
algoritmo de planificación
\series default
, y modifica las estructuras necesarias para que el cambio de contexto sea
correcto.
\end_layout
\begin_layout Standard
En UNIX, los procesos se organizan en un árbol de procesos y se crean con
la llamada al sistema
\family typewriter
fork()
\family default
, que crea una copia idéntica del proceso que hace la llamada y devuelve
al hijo el valor 0 y al padre el PID (
\emph on
process identifier
\emph default
) del proceso hijo.
El PID del propio proceso se obtiene con la llamada al sistema
\family typewriter
getpid
\family default
.
Las llamadas de la familia
\family typewriter
exec
\family default
, como
\family typewriter
execve
\family default
, hacen que un proceso sustituya su código y datos por los de otro programa,
que comienza la ejecución desde el principio, si bien se conservan los
ficheros abiertos (aunque se puede especificar el cierre de algunos descriptore
s de ficheros en
\family typewriter
execve
\family default
), el PID y casi todas las propiedades.
\end_layout
\begin_layout Standard
En Windows la jerarquía de procesos de UNIX desaparece al poder un proceso
cambiar de proceso padre, y los procesos se crean con
\family typewriter
CreateProcess
\family default
, que equivale a ejecutar un
\family typewriter
fork
\family default
seguido de
\family typewriter
exec
\family default
en el proceso hijo.
\end_layout
\begin_layout Standard
La terminación voluntaria de un proceso se hace mediante la llamada al sistema
\family typewriter
exit
\family default
en UNIX y
\family typewriter
ExitProcess
\family default
en Windows.
La terminación involuntaria es producida por el sistema operativo si se
produce un error fatal (división por cero, acceso a una zona memoria incorrecta
, etc.) o por otro proceso autorizado a ello con la llamada al sistema
\family typewriter
kill
\family default
en UNIX o
\family typewriter
TerminateProcess
\family default
en Windows.
\end_layout
\begin_layout Section
Estados
\end_layout
\begin_layout Standard
Un proceso puede estar en uno de varios estados:
\end_layout
\begin_layout Itemize
\series bold
Nuevo
\series default
: El proceso acaba de ser creado y todavía no tiene los recursos necesarios.
\end_layout
\begin_layout Itemize
\series bold
En ejecución
\series default
: Utilizando la CPU.
\end_layout
\begin_layout Itemize
\series bold
Listo
\series default
o
\series bold
listo suspendido
\series default
: Ejecutable pero detenido porque otro proceso está usando la CPU.
\end_layout
\begin_layout Itemize
\series bold
Bloqueado
\series default
o
\series bold
bloqueado
\series default
\series bold
suspendido
\series default
: A la espera de un evento externo.
\end_layout
\begin_layout Itemize
\series bold
Saliente
\series default
(
\emph on
zombie
\emph default
): El proceso ha terminado su ejecución pero todavía no ha desaparecido
del todo.
Por ejemplo, en UNIX, cuando un proceso acaba debe esperar a que su padre
recoja su estado de salida mediante la llamada al sistema
\family typewriter
wait
\family default
o
\family typewriter
waitpid
\family default
.
\end_layout
\begin_layout Standard
Un proceso suspendido no puede ejecutarse y suele guardarse en disco.
La
\series bold
suspensión
\series default
y posterior
\series bold
reanudación
\series default
de un proceso, por parte de otro(s), es útil:
\end_layout
\begin_layout Itemize
Si el sistema está funcionando mal, mientras se corrige el problema.
\end_layout
\begin_layout Itemize
Si se cree que los resultados del proceso son incorrectos, para comprobar
si lo son.
\end_layout
\begin_layout Itemize
Si el sistema está muy cargado, para dar servicio a procesos de más prioridad.
\end_layout
\begin_layout Standard
Cambios de estado:
\end_layout
\begin_layout Itemize
De
\begin_inset Quotes fld
\end_inset
Nuevo
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Listo
\begin_inset Quotes frd
\end_inset
cuando ya dispone de los recursos o a
\begin_inset Quotes fld
\end_inset
Listo suspendido
\begin_inset Quotes frd
\end_inset
si no hay memoria disponible y el proceso no tiene prioridad suficiente
para expulsar a otro.
\end_layout
\begin_layout Itemize
De
\begin_inset Quotes fld
\end_inset
Listo
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
En ejecución
\begin_inset Quotes frd
\end_inset
o viceversa, debido al planificador.
\end_layout
\begin_layout Itemize
De
\begin_inset Quotes fld
\end_inset
En ejecución
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Bloqueado
\begin_inset Quotes frd
\end_inset
, si el proces, ueado suspendido
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Listo suspendido
\begin_inset Quotes frd
\end_inset
, cuando ocurre el evento esperado.
\end_layout
\begin_layout Itemize
De
\begin_inset Quotes fld
\end_inset
Bloqueado
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Bloqueado suspendido
\begin_inset Quotes frd
\end_inset
o de
\begin_inset Quotes fld
\end_inset
Listo
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Listo suspendido
\begin_inset Quotes frd
\end_inset
, o viceversa.
\end_layout
\begin_layout Itemize
De
\begin_inset Quotes fld
\end_inset
En ejecución
\begin_inset Quotes frd
\end_inset
a
\begin_inset Quotes fld
\end_inset
Saliente
\begin_inset Quotes frd
\end_inset
cuando termina.
\end_layout
\begin_layout Section
Implementación
\end_layout
\begin_layout Standard
El SO mantiene una
\series bold
tabla de procesos
\series default
con una entrada,
\series bold
PCB
\series default
(
\emph on
Process Control Block
\emph default
) o BCP para cada proceso, donde se guarda todo lo necesario para poder
continuar la ejecución tras perder la CPU y recuperarla luego, junto con
datos estadísticos, el estado del proceso, etc.
En concreto suelen guardarse:
\end_layout
\begin_layout Itemize
Para
\series bold
administración de procesos
\series default
, PID, registros (incluyendo contador del programa, palabra de estado y
puntero de pila), estado del proceso, prioridad, parámetros de planificación,
PID del proceso padre, grupo de procesos, señales, hora de inicio, tiempo
usado de CPU.
\end_layout
\begin_layout Itemize
Para
\series bold
administración de memoria
\series default
, apuntadores a los segmentos de texto, datos, memoria dinámica.
\end_layout
\begin_layout Itemize
Para
\series bold
administración de ficheros
\series default
, directorio raíz, directorio actual, descriptores de fichero, identificadores
de usuario y grupo.
\end_layout
\begin_layout Standard
Crear un proceso consiste en darle nombre (como el PID en UNIX), insertarlo
en la tabla de procesos, determinar su prioridad inicial y asignarle recursos
iniciales.
En el caso de UNIX,
\family typewriter
fork
\family default
busca una entrada libre en la entrada de procesos y copia la información
del PCB del padre a esta, cambiando el PID; evita que uno sobrescriba la
memoria del otro
\begin_inset Foot
status open
\begin_layout Plain Layout
Según los apuntes se copian los segmentos de datos y de pila, y el de código
se comparte por ser de sólo lectura.
Realmente, desde hace mucho Linux implementa copia en escritura, consistente
en marcar las entradas de la tabla de página de ambos de forma que el núcleo
solo tenga que hacer la copia de una página cuando uno de los procesos
escriba en ella.
\end_layout
\end_inset
; incrementa los contadores de los descriptores de ficheros del padre para
reflejar que estos también están abiertos en el hijo, y marca el proceso
hijo como
\begin_inset Quotes fld
\end_inset
Listo
\begin_inset Quotes frd
\end_inset
.
\end_layout
\begin_layout Standard
Los procesos en UNIX tienen dos modos: modo usuario, en que ejecutan un
programa normal, y modo núcleo, común a todos los procesos, en que ejecutan
código del SO al hacer una llamada al sistema.
En este último los procesos pueden bloquearse esperando a algún evento,
lo que hace que se le ceda la CPU a otro proceso hasta que el evento suceda,
momento en que el proceso continuará su ejecución en modo núcleo.
Otro enfoque es considerar el SO como una colección de procesos de sistema
distintos a los procesos de usuario, de modo que cada proceso ejecuta sólo
código de usuario, lo que ocurre en los sistemas cliente-servidor.
\end_layout
\begin_layout Standard
En las llamadas al sistema, el hardware almacena en una pila el contador
de programa del proceso que se interrumpe, pasa a modo núcleo y almacena
un elemento del vector de interrupciones, que debe ser la dirección de
inicio de alguna rutina del SO, en el contador de programa.
Entonces, un procedimiento guarda el contexto del proceso activo en su
PCB (pudiendo actualizarse otra información como estado, contabilidad o
auditoría), elimina la información introducida en la pila por el hardware,
configura una pila en el núcleo para la llamada al sistema, comprueba que
esta es válida y llama a un procedimiento que procesa la llamada.
Tras esta, el primer procedimiento ejecuta el planificador si lo determina
necesario, teniendo en cuenta que, si el proceso se ha bloqueado en la
llamada, este ya ha sido invocado y no es necesario llamarlo de nuevo,
y finalmente ejecuta el
\series bold
despachador
\series default
, que restaura el contexto del proceso a ejecutar, entre otras cosas cambiando
a la pila de usuario e introduciendo en esta la dirección de su contador
de programa.
\end_layout
\begin_layout Section
Hilos
\end_layout
\begin_layout Standard
Un proceso tradicional es:
\end_layout
\begin_layout Itemize
Unidad de propiedad de recursos, con un espacio de direcciones, variables
globales, ficheros abiertos, procesos hijos, alarmas, señales, semáforos,
información contable, etc.
\end_layout
\begin_layout Itemize
Unidad de planificación y ejecución, con un contador de programa, una serie
de registros, una pila y un estado.
\end_layout
\begin_layout Standard
Estas funciones son independientes, y los sistemas operativos modernos llaman
\series bold
hilos
\series default
(
\emph on
threads
\emph default
),
\series bold
procesos ligeros
\series default
(
\emph on
LightWeight Processes
\emph default
, LWP),
\series bold
hebras
\series default
o
\series bold
subprocesos
\series default
a las unidades de ejecución y procesos a las de propiedad de recursos,
de forma que un mismo proceso puede tener uno o varios hilos.
Cuando comienza la ejecución de un programa existe un único hilo, el
\series bold
hilo principal
\series default
, que puede crear otros.
\end_layout
\begin_layout Standard
En Linux y otros muchos UNIX, un hilo puede crear otro mediante
\family typewriter
pthread_create
\family default
, que entre sus parámetros recibe un puntero a otra función que es donde
comienza la ejecución el hilo hijo.
Todo hilo tiene un TID (
\emph on
thread identifier
\emph default
), que se obtiene desde el propio hilo con la llamada al sistema
\family typewriter
gettid
\family default
.
Para facilitar la colabolación entre hilos, que pueden necesitar acceder
y modificar las mismas variables globales, existen métodos de sincronización
como
\emph on
mutex
\emph default
(exclusión mutua) y semáforos.
\end_layout
\begin_layout Standard
Ventajas de los hilos:
\end_layout
\begin_layout Itemize
Al compartir espacio de direcciones, se pueden comunicar entre sí sin intervenci
ón del núcleo, por lo que esta comunicación es más rápida.
\end_layout
\begin_layout Itemize
Los hilos se pueden bloquear mientras termina una llamada al sistema, por
lo que si hay varios, la E/S puede solaparse con el cómputo.
\end_layout
\begin_layout Itemize
Es mucho más rápido crear un hilo en un proceso existente que un nuevo proceso,
y el cambio de uno a otro es más rápido.
\end_layout
\begin_layout Itemize
Se puede conseguir paralelismo real dentro de un mismo proceso.
\end_layout
\begin_layout Standard
Los hilos pueden ser soportados directamente por el núcleo, como en Windows
y Linux, o ser implementados mediante una biblioteca a nivel de usuario,
como se hacía en Linux antes de que implementara hilos en el núcleo.
\end_layout
\begin_layout Standard
La implementación en modo usuario tiene como ventajas que el programa se
puede usar en núcleos que no implementan hilos, los cambios de contexto
son mucho más rápidos al no tener que pasar por el núcleo y cada proceso
puede tener un algoritmo distinto de planificación.
Sin embargo, en este caso una llamada al sistema bloqueante, o un fallo
de página, bloquearía a todos los hilos del proceso, y no es posible obtener
paralelismo real dentro de un mismo proceso.
\end_layout
\begin_layout Standard
En la implementación en modo núcleo, la creación, destrucción y sincronización
entre hilos es más costosa, pero esto se puede aliviar usando una biblioteca
de sincronización que sólo realice llamadas al sistema cuando sea estrictamente
necesarios, y manteniendo las estructuras de un hilo después de que termine
para poder usarlo posteriormente en vez de crear otro nuevo.
En cualquier caso todos los hilos deben pasar a estado suspendido al mismo
tiempo, pues la memoria de todo el proceso se mueve al disco.
\end_layout
\begin_layout Section
Planificación
\end_layout
\begin_layout Standard
Metas:
\end_layout
\begin_layout Itemize
\series bold
Equidad
\series default
: Dar a cada proceso una proporción adecuada de CPU.
\end_layout
\begin_layout Itemize
Maximizar la
\series bold
eficacia
\series default
de la CPU,
\begin_inset Formula $E:=\frac{\text{Tiempo útil}}{\text{Tiempo total}}\cdot100$
\end_inset
, y el
\series bold
rendimiento
\series default
o
\series bold
productividad
\series default
, el número de tareas procesadas por unidad de tiempo.
\end_layout
\begin_layout Itemize
Minimizar el
\series bold
tiempo de espera
\series default
(el que pasa un proceso en estado
\begin_inset Quotes fld
\end_inset
Listo
\begin_inset Quotes frd
\end_inset
), el de
\series bold
respuesta
\series default
(el que pasa desde que se solicita la ejecución de una acción hasta que
se obtienen los primeros resultados, importante para usuarios interactivos)
y el de
\series bold
regreso
\series default
o
\series bold
retorno
\series default
(el que pasa desde que se entrega a un trabajo hasta que termina y se obtienen
sus resultados, importante para trabajos por lotes).
\end_layout
\begin_layout Standard
Algunas de estas, como el tiempo de espera y la eficacia, son contradictorias.
\end_layout
\begin_layout Standard
Una planificación es
\series bold
apropiativa
\series default
si puede expulsar a procesos de la CPU para ejecutar otros sin necesidad
de que se bloqueen, y
\series bold
no apropiativa
\series default
o
\series bold
de ejecución hasta terminar
\series default
en caso contrario.
Para los procesos por lotes son convenientes tanto una planificación no
apropiativa como una apropiativa con periodos de CPU largos (pues los cambios
de proceso desperdician CPU), mientras que para procesos interactivos suele
ser necesaria una planificación apropiativa para cambiar la CPU rápidamente
de un proceso a otro.
\end_layout
\begin_layout Standard
Los procesos alternan entre ráfagas de CPU y de E/S, comenzando y terminando
por una de CPU.
Decimos que un proceso es
\series bold
limitado por E/S
\series default
si pasa la mayor parte de su tiempo en espera de E/S, y normalmente tendrá
muchas ráfagas de CPU aunque breves, y es
\series bold
limitado por CPU
\series default
si usa la CPU la mayor parte del tiempo, y normalmente tendrá pocas ráfagas
de CPU aunque muy largas.
\end_layout
\begin_layout Standard
Podemos representar un algoritmo de planificación mediante un
\series bold
diagrama de colas
\series default
, en el que cada rectángulo es una cola, los círculos son recursos que dan
servicio a las colas y las flechas indican el flujo de los procesos.
Un
\series bold
diagrama de Gantt
\series default
representa el proceso en ejecución en cada momento mediante rectángulos
de longitud proporcional a la duración de la ráfaga de CPU.
\end_layout
\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open
\begin_layout Plain Layout
\align center
\begin_inset Graphics
filename pegado3.png
width 80text%
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
Diagrama de colas de planificación de procesos.
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open
\begin_layout Plain Layout
\align center
\begin_inset Graphics
filename pegado4.png
width 80text%
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
Diagrama de Gantt.
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
Algoritmos no apropiativos:
\end_layout
\begin_layout Itemize
\series bold
FCFS
\series default
(
\emph on
First Coming, First Served
\emph default
,
\begin_inset Quotes fld
\end_inset
primero en llegar, primero en ser servido
\begin_inset Quotes frd
\end_inset
).
Es el más simple y se puede implementar con una cola FIFO.
El tiempo medio de respuesta puede ser bastante largo debido al
\series bold
efecto convoy
\series default
: Un proceso limitado por CPU ocupa la CPU mucho tiempo mientras el resto
terminan su E/S y entonces los dispositivos de E/S quedan inactivos hasta
que el proceso en ejecución pasa a realizar su E/S; entonces los procesos
limitados por E/S pasan a usar la CPU y terminan rápido por tener ráfagas
de CPU breves y la CPU queda inactiva hasta que el proceso limitado por
CPU continúa su ejecución, momento en que el ciclo se repite, resultando
en desaprovechamiento de recursos.
\end_layout
\begin_layout Itemize
\series bold
SJF
\series default
(
\emph on
Shortest Job First
\emph default
,
\begin_inset Quotes fld
\end_inset
primero el trabajo más corto
\begin_inset Quotes frd
\end_inset
).
Adecuado para procesos por lotes, donde los tiempos de ejecución aproximados
se suelen conocer de antemano, y de lo contrario se puede estimar mediante
\series bold
maduración
\series default
:
\begin_inset Formula $E_{t}=aE_{t-1}+(1-a)T_{t-1}$
\end_inset
, donde
\begin_inset Formula $E_{t}$
\end_inset
es la estimación de tiempo actual,
\begin_inset Formula $E_{t-1}$
\end_inset
la estimación anterior para el mismo proceso,
\begin_inset Formula $T_{t-1}$
\end_inset
el tiempo que tardó realmente y
\begin_inset Formula $a$
\end_inset
un parámetro ajustable entre 0 y 1, pues un valor de
\begin_inset Formula $a$
\end_inset
pequeño hace que se olviden rápidamente los tiempos de ejecuciones anteriores
y un valor grande hace que se recuerden demasiado tiempo.
Si se dispone de todos los procesos de forma simultánea, este algoritmo
proporciona el mínimo tiempo medio de retorno.
\end_layout
\begin_layout Standard
Algoritmos apropiativos:
\end_layout
\begin_layout Itemize
\series bold
SRTF
\series default
(
\emph on
Shortest Remaining Time First
\emph default
,
\begin_inset Quotes fld
\end_inset
primero el que tenga el menor tiempo restante
\begin_inset Quotes frd
\end_inset
).
Variante del SJF que permite quitar la CPU a un proceso para dársela a
otro con tiempo total de ráfaga de CPU menor al tiempo restante de CPU
de la ráfaga del proceso que se está ejecutando.
\end_layout
\begin_layout Itemize
\series bold
\emph on
Round Robin
\series default
\emph default
(
\series bold
RR
\series default
) o
\series bold
circular
\series default
.
Es de los más antiguos, sencillos, equitativos y de mayor uso.
Similar al FCFS pero con un
\emph on
quantum
\emph default
de tiempo
\begin_inset Formula $q$
\end_inset
tal que, si un proceso consume un
\emph on
quantum
\emph default
, pasa al final de la cola de procesos listos para dar la CPU al siguiente
proceso.
De esta forma, si hay
\begin_inset Formula $n$
\end_inset
procesos, ninguno tiene tiempo de espera mayor a
\begin_inset Formula $(n-1)q$
\end_inset
.
Si
\begin_inset Formula $q$
\end_inset
es pequeño se desperdicia tiempo de CPU en cambios de proceso, pero si
es grande, los últimos procesos tardan mucho en ser atendidos, resultando
en tiempos de respuesta muy pobres en procesos interactivos.
\end_layout
\begin_layout Standard
Otras formas de planificación pueden hacerse apropiativas o no apropiativas:
\end_layout
\begin_layout Itemize
\series bold
Planificación por prioridad
\series default
.
Cada proceso tiene una prioridad, normalmente un número que es mayor a
mayor prioridad (en UNIX es al revés), de modo que la CPU se da al primer
proceso de la cola con la mayor prioridad.
La asignación de prioridad puede ser
\series bold
estática
\series default
, si no cambia durante la ejecución del proceso, o
\series bold
dinámica
\series default
si depende de parámetros.
Un ejemplo de asignación dinámica para favorecer a los procesos limitados
por E/S, y que puedan ejecutarse pronto para enviar su siguiente solicitud
de E/S, es hacer que la prioridad sea inversamente proporcional a la fracción
del último
\emph on
quantum
\emph default
usado por el proceso.
Este
\emph on
quantum
\emph default
puede ser una referencia para medir el tiempo consumido o funcionar como
en la planificación
\emph on
round-robin
\emph default
.
\begin_inset Newline newline
\end_inset
El
\series bold
bloqueo indefinido
\series default
o
\series bold
inanición
\series default
ocurre cuando los procesos de baja prioridad nunca llegan a ejecutarse.
Para evitarlo se puede disminuir cada cierto tiempo la prioridad del proceso
en ejecución, lo que tiene sentido si la planificación es apropiativa.
Esto sigue teniendo el problema de que pueden llegar continuamente procesos
de mayor cantidad que los que llevan tiempo esperando, por lo que una alternati
va es aumentar cada cierto tiempo la prioridad de los procesos listos.
\end_layout
\begin_layout Itemize
\series bold
Planificación de múltiples colas con realimentación
\series default
.
Es la más general, pero también la más compleja.
Existen varias colas de procesos listos y un proceso va a una u otra según
si es interactivo o por lotes, de sistema o de usuario, su prioridad, la
cola que usó la última vez, el consumo de CPU, etc.
Debe haber una planificación dentro de cada cola, y una planificación entre
colas, que suele ser apropiativa por prioridad pero puede ser cualquiera,
como el reparto equitativo y que cada cola se administre de una forma.
Para evitar que el esquema sea inflexible, debe haber un criterio para
que los procesos cambien de cola (realimentación).
\end_layout
\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open
\begin_layout Plain Layout
\align center
\begin_inset Graphics
filename pegado5.png
width 80text%
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
Planificación de múltiples colas.
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
Si no se dispone de suficiente memoria es necesario que algunos procesos
se mantengan en disco.
Para ello, los procesos en memoria los gestiona un
\series bold
planificador a corto plazo
\series default
(PCP) mientras que un
\series bold
planificador a medio plazo
\series default
(PMP) es llamado periódicamente y se encarga de la suspensión y reanudación
de procesos, teniendo en cuenta criterios como el tiempo desde el último
intercambio, el tiempo de CPU que ha consumido el proceso recientemente,
el tamaño del proceso (los pequeños no causan problemas) y la prioridad
de este.
También es posible añadir un
\series bold
planificador a largo plazo
\series default
(PLP) que decida, de entre los procesos por lotes preparados, cuál ejecutar
después, eligiendo si este pasa directamente a memoria o a disco.
\end_layout
\begin_layout Standard
\begin_inset Note Comment
status open
\begin_layout Plain Layout
\begin_inset Float figure
wide false
sideways false
status open
\begin_layout Plain Layout
\align center
\begin_inset Graphics
filename pegado6.png
width 80text%
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
Planificación a corto, medio y largo plazo.
\end_layout
\end_inset
\end_layout
\end_inset
\end_layout
\end_inset
\end_layout
\end_body
\end_document
|