Está en la página 1de 8

Cdigo muerto

En programacin, se conoce como cdigo muerto a una parte del cdigo fuente que se ejecuta pero sus resultados nunca se
usan.1 2 La ejecucin de este tipo de cdigo consume tiempo de computo en algo que jams se utiliza.
Es frecuente confundirlo con el cdigo inalcanzable aunque conservan una diferencia (este jams se ejecuta, y si bien los
dos son indeseables el cdigo muerto es ms grave que el inalcanzable).
Adems de consumir tiempo de computo el cdigo muerto puede arrojar excepciones o afectar un estado global del
programa. por lo tanto si bien los resultados jams se utilizan remover este cdigo puede cambiar la salida del programa y
evitar bugs innecesarios. Esta es una razn por la cual el cdigo muerto es menos deseado que el cdigo inalcanzable.
Ejemplo
int foo (int X, int Y) {
int Z = X/Y;
return X*Y;
}

En el cdigo anterior la divisin entre X e Y se calcula pero jams se utiliza, adems, en el caso que Y sea 0 el programa
arrojara una excepcin con posibilidad de abortar la ejecucin, por lo tanto la salida del programa se ve afectada por esta
lnea.
Anlisis

Se puede utilizar una optimizacin de compilador llamada eliminacin de cdigo muerto para eliminar este cdigo. Este
anlisis se puede llevar a cabo mediante el anlisis de variable viva, que es una forma de anlisis esttico de software y
anlisis de flujo de datos. Esta tambin es una diferencia con respecto al cdigo inalcanzable que se descubre mediante un
anlisis de control del flujo.
La eliminacin de cdigo en general es la misma tcnica que se usa para eliminar el cdigo inalcanzable y el cdigo
redundante.
En los proyectos de programacin grandes, a veces es difcil de reconocer y eliminar cdigo muerto, especialmente cuando
algn mdulo entero quede muerto.3
Algunos IDE (como Visual Studio 20104 y Eclipse5 ) poseen la habilidad de detectar cdigo muerto durante tiempo de
compilacin.

Bloqueo mutuo
En sistemas operativos, el bloqueo mutuo (tambin conocido como interbloqueo, traba mortal, deadlock, abrazo mortal) es
el bloqueo permanente de un conjunto de procesos o hilos de ejecucin en un sistema concurrente que compiten por
recursos del sistema o bien se comunican entre ellos. A diferencia de otros problemas de concurrencia de procesos, no
existe una solucin general para los interbloqueos.

Todos los interbloqueos surgen de necesidades que no pueden ser satisfechas, por parte de dos o ms procesos. En la vida
real, un ejemplo puede ser el de dos nios que intentan jugar al arco y flecha, uno toma el arco, el otro la flecha. Ninguno
puede jugar hasta que alguno libere lo que tom.
En el siguiente ejemplo, dos procesos compiten por dos recursos que necesitan para funcionar, que slo pueden ser
utilizados por un proceso a la vez. El primer proceso obtiene el permiso de utilizar uno de los recursos (adquiere el lock
sobre ese recurso). El segundo proceso toma el lock del otro recurso, y luego intenta utilizar el recurso ya utilizado por el
primer proceso, por lo tanto queda en espera. Cuando el primer proceso a su vez intenta utilizar el otro recurso, se produce
un interbloqueo, donde los dos procesos esperan la liberacin del recurso que utiliza el otro proceso.

Representacin de Bloqueos Mutuos usando grafos

Ejemplo de representacin de Bloqueo Mutuo en grafos de alocacin de recursos con dos procesos A y B, y dos recursos
R1 y R2.
El Bloqueo mutuo tambin puede ser representado usando grafos dirigidos, donde el proceso es representado por un
cuadrado y el recurso, por un crculo. Cuando un proceso solicita un recurso, una flecha es dirigida del crculo al cuadrado.
Cuando un recurso es asignado a un proceso, una flecha es dirigida del cuadrado al crculo.
En la figura del ejemplo, se pueden ver dos procesos diferentes (A y B), cada uno con un recurso diferente asignado (R1 y
R2). En este ejemplo clsico de bloqueo mutuo, es fcilmente visible la condicin de espera circular en la que los
procesos se encuentran, donde cada uno solicita un recurso que est asignado a otro proceso.

Condiciones necesarias
Tambin conocidas como condiciones de Coffman por su primera descripcin en 1971 en un artculo escrito por E. G.
Coffman.
Estas condiciones deben cumplirse simultneamente y no son totalmente independientes entre ellas.
Sean los procesos P0, P1, ..., Pn y los recursos R0, R1, ..., Rm:

Condicin de exclusin mutua: existencia de al menos de un recurso compartido por los procesos, al cual slo
puede acceder uno simultneamente.

Condicin de retencin y espera: al menos un proceso Pi ha adquirido un recurso Ri, y lo retiene mientras espera al
menos un recurso Rj que ya ha sido asignado a otro proceso.

Condicin de no expropiacin: los recursos no pueden ser expropiados por los procesos, es decir, los recursos slo
podrn ser liberados voluntariamente por sus propietarios.

Condicin de espera circular: dado el conjunto de procesos P0...Pm(subconjunto del total de procesos original),P0
est esperando un recurso adquirido por P1, que est esperando un recurso adquirido por P2,... ,que est esperando
un recurso adquirido por Pm, que est esperando un recurso adquirido por P0. Esta condicin implica la condicin de
retencin y espera.

Evitando bloqueos mutuos


Los bloqueos mutuos pueden ser evitados si se sabe cierta informacin sobre los procesos antes de la asignacin de
recursos. Para cada peticin de recursos, el sistema controla si satisfaciendo el pedido entra en un estado inseguro, donde
puede producirse un bloqueo mutuo. De esta forma, el sistema satisface los pedidos de recursos solamente si se asegura que
quedar en un estado seguro. Para que el sistema sea capaz de decidir si el siguiente estado ser seguro o inseguro, debe
saber por adelantado y en cualquier momento el nmero y tipo de todos los recursos en existencia, disponibles y
requeridos. Existen varios algoritmos para evitar bloqueos mutuos:

Algoritmo del banquero, introducido por Dijkstra.

Algoritmo de grafo de asignacin de recursos.

Algoritmo de Seguridad.

Algoritmo de solicitud de recursos.

Prevencin
Los bloqueos mutuos pueden prevenirse asegurando que no suceda alguna de las condiciones necesarias vistas
anteriormente.

Eliminando la exclusin mutua: ningn proceso puede tener acceso exclusivo a un recurso. Esto es imposible para
procesos que no pueden ser encolados (puestos en un spool), e incluso con colas tambin pueden ocurrir
interbloqueos.

La condicin de posesin y espera puede ser eliminada haciendo que los procesos pidan todos los recursos que van
a necesitar antes de empezar. Este conocimiento por adelantado muchas veces es imposible nuevamente. Otra forma
es requerir a los procesos liberar todos sus recursos antes de pedir todos los recursos que necesitan. Esto tambin es
poco prctico en general.

La condicin de no expropiacin puede ser tambin imposible de eliminar dado que un proceso debe poder tener un
recurso por un cierto tiempo o el procesamiento puede quedar inconsistente.

La condicin de espera circular es la ms fcil de atacar. Se le permite a un proceso poseer slo un recurso en un
determinado momento, o una jerarqua puede ser impuesta de modo tal que los ciclos de espera no sean posibles.

Livelock
Un livelock es similar a un deadlock, excepto que el estado de los dos procesos envueltos en el livelock constantemente
cambia con respecto al otro. Livelock es una forma de inanicin y la definicin general slo dice que un proceso especfico
no est procesando.
En un ejemplo del mundo real, un livelock ocurre por ejemplo cuando dos personas, al encontrarse en un pasillo angosto
avanzando en sentidos opuestos, y cada una trata de ser amable movindose a un lado para dejar a la otra persona pasar,
pero terminan movindose de lado a lado sin tener ningn progreso, pues ambos se mueven hacia el mismo lado, al mismo
tiempo.
Livelock es un riesgo con algunos algoritmos que detectan y recuperan los interbloqueos, pues si ms de uno toma cartas en
el asunto, la deteccin del interbloqueo puede ser disparada continuamente; pudiendo ser arreglado asegurndose que slo
un proceso (escogido al azar o por prioridad) tome accin.

Bucle infinito
Bucle infinito en programacin es un error que consiste en realizar un ciclo que se repite de forma indefinida ya que su
condicin para finalizar nunca se cumple.1
Por definicin un bucle debe contener condiciones que establezcan cundo empieza y cundo acaba, de manera que,
mientras las condiciones se cumplan, ejecute una secuencia de cdigo de manera repetitiva. En el caso de ciclo infinito,
como la condicin de finalizacin no se alcanza, el bucle sigue ejecutando el segmento de cdigo indefinidamente.

Ejemplo de ciclo infinito en C (while)


#include <stdio.h>
#include <conio.h>
int main {
int x = 0;
while(x < 10) {
printf("\xNo acabar nunca!\n");
}
getch();
return 0;
}

Se observa que la sentencia printf("\xNo acabar nunca!\n"); siempre se ejecuta porque la condicin del bucle while()
siempre es cierta, no existe una condicin de salida que obligue al bucle a finalizar. Exactamente, no se alcanza la
condicin de salida. Si en el ejemplo anterior, dentro del bloque de cdigo del bucle while, se encontrase la instruccin

x++;

El bucle hubiera ejecutado 10 veces y hubiera terminado.


Tambin existe esta posibilidad con el while (true). En C:
#include <stdio.h>
#include <conio.h>
int main(void) {
while(1) {
printf("\xadNo acabar\x82 en algn momento!\n");
}
getch();
return 0; /* De todas maneras, el programa no llegar nunca hasta aqui */
}

Lo mismo en c++
#include <iostream>
using namespace std;
int main(void) {
while(true){
cout << "Se repite" << endl;
}
return 0;
}

Condicin == en for. C++


#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
for(int i=0;i==i;i++){
cout << "Se repite" << endl;
}
return 0;
}

Como siempre la variable i va a ser igual a ella misma, se incrementa e itera infinitas veces.

++ -- en for. C++
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {

int h=0;
for(int i=0;i<5;i++){
i--;
h++;
cout << "Se repitio: " << h << " Veces." << endl;
}
return 0;
}

En este caso, por cada vez que se incrementa la variable, como es menor a 5 se decrementa dentro del cuerpo del bucle.
Luego se vuelve a incrementar y de esa manera infinitas veces.

Ejemplo de ciclo infinito en C (for)


#include <stdio.h>
int main(void) {
int cont;
for (cont = 0; cont < 5; cont++) {
cont = cont%4;
printf("%d\n",cont);
}
return 0;
}

En la sentencia "printf" se muestra en pantalla 0,1,2,3,0,1,2,3,0,.... infinitamente y mientras no llegue a 5 no se cerrar el


programa.
Y tambin podemos crear un ciclo infinito con el for de esta forma:
#include <stdio.h>
int main(void) {
for (;;)
printf("Bucle infinito\n");
return 0;
}

Bucle infinito en Visual Basic (while)


Public function suma2(a, b) As Double
suma2 = a + b
While (suma2 >= 10)
suma2 = suma2 + 1
Wend

Siempre que la suma de a y b sea superior o igual a 10.

Bucle infinito en Visual Basic (do - loop)


Dim Suma
Suma = 0
Do
Suma = Suma + 1
Loop

La variable "Suma" se sumar infinitamente 1 unidad.

Bucle infinito en Pascal (repeat)


Una forma de hacer un bucle infinito en Pascal es con un ciclo repeat como se muestra a continuacin:
program HASTAELINFINITO;
begin
repeat
writeln('Nunca termina!');
until 2=3;
end.

Ya que 2 nunca es igual a 3, el cdigo se repite hasta el infinito.

Bucle infinito en Pascal (while)


program HASTAELINFINITO;
begin

end.

while 2<>3 do
writeln('Nunca termina!');
end;

Bucle infinito en Java


public void loop() {
int x = 0;
while(x<10) {
System.out.println("Esto no acaba!");
}
}

Condicin de carrera

Condicin de carrera en un circuito lgico. t1 y t2 representan el retardo de propagacin de los elementos


lgicos. Cuando el valor de entrada (A) cambia, el circuito genera en la salida un pico de duracin (t1+t2)
- t2 = t1.

Condicin de carrera (del ingls race condition) es una expresin usada en electrnica y en programacin. Mltiples
procesos se encuentran en condicin de carrera si el resultado de los mismos depende del orden de su ejecucin. Si los
procesos que estn en condicin de carrera no son correctamente sincronizados, puede producirse una corrupcin de datos,
que puede ser aprovechada por exploits locales para vulnerar los sistemas. Anlogamente, en circuitos electrnicos se da
una condicin de carrera cuando la salida de un sistema o subsistema depende del orden en que se hayan activado o
desactivado sus componentes.
Una condicin de carrera se da principalmente cuando varios procesos acceden al mismo tiempo y cambian el estado de un
recurso compartido (por ejemplo una variable), obteniendo de esta forma un valor no esperado de ese recurso.

También podría gustarte