Está en la página 1de 20

UNIVERSIDAD TECNOLÓGICA DE SANTIAGO

(UTESA)

ASIGNATURA: ALGORITMO PARALELO

TEMA: Investigación sobre los Algoritmos

NOMBRES Y MATRICULAS: Abraham Gonzalez 3-16-3502

PROFESOR: EDUARDO ARVELO PAULINO

Santo Domingo RD.


1. Papel e Importancia de los algoritmos en el mundo informático, incluir
ejemplos 

Los algoritmos son muy importantes en el mundo de la informática ya que


permiten al programador resolver el problema antes de escribirlo en un
lenguaje de programación que entienda la máquina u ordenador. Antes de
escribir el código de un programa hay que resolver con un algoritmo el
problema que se nos plantea.

Esta herramienta es muy importante, puesto que sirve para preparar nuestra
cabeza como programadores y nos permite, además, enfrentarnos a
cualquier tipo de problema para plantear una solución óptima. Un algoritmo
es una secuencia ordenada y finita de pasos que permite resolver un
problema.

2. Historia del algoritmo

La palabra algoritmo proviene del sobrenombre de un matemático árabe del siglo


IX, Al-Khwarizmi, que fue reconocido por enunciar paso a paso las reglas para las
operaciones matemáticas básicas con decimales (suma, resta, multiplicación y
división).

Vemos definición de algoritmo como un grupo de órdenes consecutivas que


presentan una solución a un problema o tarea. Algunos ejemplos de algoritmos los
podemos encontrar en las matemáticas (como el algoritmo para resolver una
multiplicación) y en los manuales de usuario de un aparato (como una lavadora o
una impresora).

Sin embargo, hoy en día se relaciona la palabra algoritmo con el mundo de la


informática, más concretamente en la programación; los conocidos como
algoritmos informáticos.
Un programa informático no es otra cosa que una serie compleja de algoritmos
escritos en un lenguaje de programación que pueden ser ejecutados en un
ordenador. Por lo tanto, el conocimiento de algoritmos en programación es
esencial, por lo que es muy útil realizar un curso de introducción a la programación
que incluya formación en algoritmos. Esta formación incluye conocimientos de
pseudocódigo, que será un lenguaje escrito para representar los algoritmos antes
de programarlos y de diagrama de flujos, que representa de manera simbólica los
distintos pasos del algoritmo.

3. Algoritmo: Definición

En matemáticas, lógica, ciencias de la computación y disciplinas


relacionadas, un algoritmo (del latín algorithmus y este del griego arithmos,
que significa número, quizá también con influencia del nombre del
matemático persa Al-Juarismi) es un conjunto de instrucciones o reglas
definidas y no-ambiguas, ordenadas y finitas que permite, típicamente,
solucionar un problema, realizar un cómputo, procesar datos y llevar a cabo
otras tareas o actividades.2 Dado un estado inicial y una entrada, siguiendo
los pasos sucesivos se llega a un estado final y se obtiene una solución. Los
algoritmos son el objeto de estudio de la algoritmia.

En la vida cotidiana, se emplean algoritmos frecuentemente para resolver


problemas determinados. Algunos ejemplos son los manuales de usuario,
que muestran algoritmos para usar un aparato, o las instrucciones que
recibe un trabajador de su patrón. Algunos ejemplos en matemática son el
algoritmo de multiplicación, para calcular el producto, el algoritmo de la
división para calcular el cociente de dos números, el algoritmo de Euclides
para obtener el máximo común divisor de dos enteros positivos, o el
método de Gauss para resolver un sistema de ecuaciones lineales.

En general, no existe ningún consenso definitivo en cuanto a la definición


formal de algoritmo. Muchos autores los señalan como listas de
instrucciones para resolver un cálculo o un problema abstracto, es decir, que
un número finito de pasos convierten los datos de un problema (entrada) en
una solución (salida).123456 Sin embargo, cabe notar que algunos
algoritmos no tienen necesariamente que terminar o resolver un problema
en particular. Por ejemplo, una versión modificada de la criba de
Eratóstenes, que nunca termine de calcular números primos, no deja de ser
un algoritmo.7

A lo largo de la historia, varios autores han tratado de definir formalmente a


los algoritmos utilizando modelos matemáticos. Esto lo hizo Alonzo Church
en 1936 con el concepto de "calculabilidad efectiva" basada en su cálculo
lambda y por Alan Turing basándose en la máquina de Turing. Los dos
enfoques son equivalentes, en el sentido de que se pueden resolver
exactamente los mismos problemas con ambos enfoques. No obstante,
estos modelos están sujetos a un tipo particular de datos, como son
números, símbolos o gráficas mientras que, en general, los algoritmos
funcionan sobre una vasta cantidad de estructuras de datos. En general, la
parte común en todas las definiciones se puede resumir en las siguientes
tres propiedades, siempre y cuando no consideremos algoritmos paralelos:

Tiempo secuencial. Un algoritmo funciona en tiempo discretizado paso a


paso, definiendo así una secuencia de estados computacionales por cada
entrada válida (la entrada son los datos que se le suministran al algoritmo
antes de comenzar).

Estado abstracto. Cada estado computacional puede ser descrito


formalmente utilizando una estructura de primer orden y cada algoritmo es
independiente de su implementación (los algoritmos son objetos
abstractos), de manera que en un algoritmo las estructuras de primer orden
son invariantes bajo isomorfismo.

Exploración acotada. La transición de un estado al siguiente queda


completamente determinada por una descripción fija y finita; es decir, entre
cada estado y el siguiente solamente se puede tomar en cuenta una
cantidad fija y limitada de términos del estado actual.

En resumen, un algoritmo es cualquier cosa que funcione paso a paso,


donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a
una computadora en particular, y además tiene un límite fijo en cuanto a la
cantidad de datos que se pueden leer/escribir en un solo paso.

Esta amplia definición abarca tanto a algoritmos prácticos como aquellos


que solo funcionan en teoría, por ejemplo, el método de Newton y la
eliminación de Gauss-Jordan funcionan, al menos en principio, con números
de precisión infinita; sin embargo, no es posible programar la precisión
infinita en una computadora, y no por ello dejan de ser algoritmos. En
particular es posible considerar una cuarta propiedad que puede usarse para
validar la tesis de Church-Turing, de que toda función calculable se puede
programar en una máquina de Turing (o equivalentemente, en un lenguaje
de programación suficientemente general)

Aritmetizabilidad. Solamente operaciones innegablemente calculables están


disponibles en el paso inicial.

4. Elementos básicos de los algoritmos 

Las tres partes de un algoritmo son:

 Input (entrada). Información que damos al algoritmo con la que va a trabajar


para ofrecer la solución esperada.

 Proceso. Conjunto de pasos para que, a partir de los datos de entrada,


llegue a la solución de la situación.

 Output (salida). Resultados, a partir de la transformación de los valores de


entrada durante el proceso.
5. Las diferentes formas que existen para escribir un algoritmo, incluir
ejemplos 

Los diferentes tipos de algoritmos son un elemento fundamental en el


desarrollo de software, ya que permiten dar solución a cualquier problema.
Estos se componen de una serie de instrucciones lógicas que los
desarrolladores utilizan a la hora de darle forma a cualquier programa. De
esta forma, un ordenador puede leer estas instrucciones y realizar las tareas
indicadas.

Aunque en la actualidad existen muchísimos lenguajes de programación,


entre ellos Java, Python o C#, los diferentes tipos de algoritmos de
programación suelen ser similares. Es decir, una vez se comprende cómo
funcionan, es posible utilizarlos en cualquier lenguaje, aunque la sintaxis
utilizada sí que puede ser diferente.

Normalmente, un algoritmo se compone de tres partes: la entrada de datos,


el procesamiento y la salida de datos. A partir de un conjunto de diferentes
tipos de algoritmos se va desarrollando el aplicativo hasta obtener el
resultado deseado.

6. Algoritmo y su escritura en un idioma natural determinado (inglés o


español), incluir ejemplos

Algoritmo y su escritura en un idioma natural determinado (inglés o


español) Son aquellas lenguas que han sido generadas espontáneamente en
un grupo de hablantes con propósito de comunicarse, a diferencias de otras
lenguas, como puedan ser una lengua construida, los lenguajes de
programación o los lenguajes formales usados en el estudio de la lógica
formal, especialmente la lógica matemática. La primera y más sencilla forma
de describir un algoritmo es empleado el lenguaje natural: por ejemplo, el
algoritmo para sumar 2 números. Inicio suma Ingresar primer número
Guardar número en variable a Ingresar segundo número Guardar número
en variable b Sumar a y b Guardar resultado en R Mostrar R Fin.

7. Algoritmo diagrama de flujo, incluir ejemplos 

Página 14 de 23 Algoritmo diagrama de flujo & Ejemplos Los diagramas de


flujo emplean rectángulos, óvalos, diamantes y otras numerosas figuras para
definir el tipo de paso, junto con flechas conectoras que establecen el flujo y
la secuencia. Pueden variar desde diagramas simples y dibujados a mano
hasta diagramas exhaustivos creados por computadora que describen
múltiples pasos y rutas. Si tomamos en cuenta todas las diversas figuras de
los diagramas de flujo, son uno de los diagramas más comunes del mundo,
usados por personas con y sin conocimiento técnico en una variedad de
campos. Un diagrama de flujo es un diagrama que describe un proceso,
sistema o algoritmo informático. Se usan ampliamente en numerosos
campos para documentar, estudiar, planificar, mejorar y comunicar procesos
que suelen ser complejos en diagramas claros y fáciles de comprender. Los
diagramas de flujo a veces se denominan con nombres más especializados,
como "diagrama de flujo de procesos", "mapa de procesos", "diagrama de
flujo funcional", "mapa de procesos de negocios", "notación y modelado de
procesos de negocio (BPMN)" o "diagrama de flujo de procesos (PFD)".
Están relacionados con otros diagramas populares, como los diagramas de
flujo de datos (DFD) y los diagramas de actividad de lenguaje unificado de
modelado (UML). Son la representación gráfica de un algoritmo o proceso.
Se utiliza en disciplinas como programación, economía, procesos
industriales y psicología cognitiva. En Lenguaje Unificado de Modelado
(UML), es un diagrama de actividades que representa los flujos de trabajo
paso a paso. Un diagrama de actividades muestra el flujo de control general.

Página 15 de 23 En SysML el diagrama ha sido extendido para indicar flujos


entre pasos que mueven elementos físicos (p. ej., gasolina) o energía (p. ej.,
presión). Los cambios adicionales permiten al diagrama soportar mejores
flujos de comportamiento y datos continuos.

8. Algoritmo pseudocódigo, incluir ejemplos

Utiliza las convenciones estructurales de un lenguaje de programación real,


pero está diseñado para la lectura humana en lugar de la lectura mediante
máquina, y con independencia de cualquier otro lenguaje de programación.
Es una descripción de alto nivel compacta e informal del principio operativo
de un programa informático u otro algoritmo.

Por ejemplo, si queremos escribir algo en pantalla, en pseudocódigo


podríamos poner:

Escribir "Hola, Escribir 20 o Escribir Variable

OJO escribir 20 y escribir "20" son dos cosas diferentes. Lo que sea texto
siempre se pone entre comillas, los números NO. Entonces escribir 20, es
mostrar en pantalla el número 20 y escribir "20" es mostrar en pantalla 20.

Puede parecer lo mismo, pero no lo es, en una 20 es un texto y en otro un


número.

También podemos usar, en lugar de escribir:

mostrar por pantalla "Hola"


Recuerda: Realmente el pseudocódigo lo podríamos escribir como nosotros
quisiéramos, ya que realmente no es el programa en sí, solo es una ayuda
para posteriormente realizar el programa mediante el lenguaje de
programación que utilicemos.

Eso sí, el pseudocódigo es de gran ayuda. por no decir imprescindible. Si


sabes hacer el pseudocódigo del programa, pasarlo a cualquier lenguaje de
programación es muy sencillo, solo tendrás que aprender los comandos
equivalentes a las instrucciones en pseudocódigo, normalmente muy
parecidas, pero en inglés.

Además, la mayoría de los lenguajes utilizan prácticamente los mismos


comandos en su lenguaje.

Eso sí, repetimos, tendrás que aprender los fundamentos de programación


antes de seguir si no los sabes.

9. Algoritmo y los lenguajes de programación, incluir ejemplos

Un algoritmo informático es un conjunto de instrucciones definidas,


ordenadas y acotadas para resolver un problema, realizar un cálculo o
desarrollar una tarea. Es decir, un algoritmo es un procedimiento paso a
paso para conseguir un fin. A partir de un estado e información iniciales, se
siguen una serie de pasos ordenados para llegar a la solución de una
situación.

En programación, un algoritmo supone el paso previo a ponerse a escribir el


código. Primero debemos encontrar la forma de obtener la solución al
problema (definir el algoritmo informático), para luego, a través del código,
poder indicarle a la máquina qué acciones queremos que lleve a cabo. De
este modo, un programa informático no sería más que un conjunto de
algoritmos ordenados y codificados en un lenguaje de programación para
poder ser ejecutados en un ordenador.

Ejemplos de algoritmos de búsqueda

Existen diversos tipos de búsquedas, entre las que sobresalen:

Búsqueda secuencial. En la que se compara el elemento a localizar con


cada elemento del conjunto hasta encontrarlo o hasta que hayamos
comparado todos.
Búsqueda binaria. En un conjunto de elementos ordenados, hace una
comparación con el elemento ubicado en el medio y, si no son iguales,
continúa la búsqueda en la mitad donde puede estar. Y así sucesivamente
en intervalos cada vez más pequeños de elementos.

Algoritmos de ordenamiento

Reorganizan los elementos de un listado según una relación de orden. Las


más habituales son el orden numérico y el orden lexicográfico. Un orden
eficiente optimiza el uso de algoritmos como los de búsqueda y facilitan la
consecución de resultados legibles por personas y no solo máquinas.

Ejemplos de algoritmos de ordenamiento Algunos algoritmos de


ordenamiento son:

Ordenamiento de burbuja. Compara cada elemento de la lista a ordenar


con el siguiente e intercambia su posición si no están en el orden adecuado.
Se revisa varias veces toda la lista hasta que no se necesiten más
intercambios.

Ordenamiento por selección. Vamos colocando el elemento más pequeño


disponible en cada una de las posiciones de la lista de forma consecutiva.

Ordenamiento rápido. Elegimos un elemento del conjunto (pivote) y


reubicamos el resto a cada uno de sus lados, en función de si son mayores o
menores que el elemento que estamos tomando como referencia.
Repetimos el procedimiento en cada subconjunto.

10. Algoritmo y la estructura de datos de los lenguajes de programación, incluir


ejemplos

Un algoritmo informático es un conjunto de instrucciones definidas,


ordenadas y acotadas para resolver un problema, realizar un cálculo o
desarrollar una tarea. Es decir, un algoritmo es un procedimiento paso a
paso para conseguir un fin. A partir de un estado e información iniciales, se
siguen una serie de pasos ordenados para llegar a la solución de una
situación.

En programación, un algoritmo supone el paso previo a ponerse a escribir el


código. Primero debemos encontrar la forma de obtener la solución al
problema (definir el algoritmo informático), para luego, a través del código,
poder indicarle a la máquina qué acciones queremos que lleve a cabo.
De este modo, un programa informático no sería más que un conjunto de
algoritmos ordenados y codificados en un lenguaje de programación para
poder ser ejecutados en un ordenador.

No obstante, los algoritmos no son algo exclusivo de los ámbitos de las


matemáticas, la lógica y la computación. Utilizamos numerosos algoritmos
para resolver problemas en nuestra vida cotidiana. Algunos de los ejemplos
más habituales son los manuales de instrucciones o las recetas de cocina.

Partes de un algoritmo informático

Las tres partes de un algoritmo son:

Input (entrada). Información que damos al algoritmo con la que va a trabajar


para ofrecer la solución esperada.

Proceso. Conjunto de pasos para que, a partir de los datos de entrada,


llegue a la solución de la situación.

Output (salida). Resultados, a partir de la transformación de los valores de


entrada durante el proceso.

De este modo, un algoritmo informático parte de un estado inicial y de unos


valores de entrada, sigue una serie de pasos sucesivos y llega a un estado
final en el que ha obtenido una solución.

Características de los algoritmos

Asimismo, los algoritmos presentan una serie de características comunes.


Son:

Precisos. Objetivos, sin ambigüedad.

Ordenados. Presentan una secuencia clara y precisa para poder llegar a la


solución.

Finitos. Contienen un número determinado de pasos.

Concretos. Ofrecen una solución determinada para la situación o problema


planteados.

Definidos. El mismo algoritmo debe dar el mismo resultado al recibir la


misma entrada.

Tipos de algoritmos y ejemplos


Existen diversas clasificaciones de algoritmos, en función de diferentes
criterios. Según su sistema de signos (cómo describen los pasos a seguir), se
distingue entre algoritmos cuantitativos y cualitativos, si lo hacen a través de
cálculos matemáticos o secuencias lógicas. Asimismo, si requieren o no el
empleo de un ordenador para su resolución, se clasifican en
computacionales y no computacionales.

11. Algoritmo y las técnicas de dividir y conquistar, incluir ejemplos

En la cultura popular, divide y vencerás hace referencia a un refrán que


implica resolver un problema difícil, dividiéndolo en partes más simples
tantas veces como sea necesario, hasta que la resolución de las partes se
torna obvia. La solución del problema principal se construye con las
soluciones encontradas.

En las ciencias de la computación, el término divide y vencerás (DYV) hace


referencia a uno de los más importantes paradigmas de diseño algorítmico.
El método está basado en la resolución recursiva de un problema
dividiéndolo en dos o más subproblemas de igual tipo o similar. El proceso
continúa hasta que éstos llegan a ser lo suficientemente sencillos como para
que se resuelvan directamente. Al final, las soluciones a cada uno de los
subproblemas se combinan para dar una solución al problema original.

Esta técnica es la base de los algoritmos eficientes para casi cualquier tipo
de problema como, por ejemplo, algoritmos de ordenamiento (quicksort,
mergesort, entre muchos otros), multiplicar números grandes (Karatsuba),
análisis sintácticos (análisis sintáctico top-down) y la transformada discreta
de Fourier.

Por otra parte, analizar y diseñar algoritmos de DyV son tareas que lleva
tiempo dominar. Al igual que en la inducción, a veces es necesario sustituir
el problema original por uno más complejo para conseguir realizar la
recursión, y no hay un método sistemático de generalización.

El nombre divide y vencerás también se aplica a veces a algoritmos que


reducen cada problema a un único subproblema, como la búsqueda binaria
para encontrar un elemento en una lista ordenada (o su equivalente en
computación numérica, el algoritmo de bisección para búsqueda de raíces).
Estos algoritmos pueden ser implementados más eficientemente que los
algoritmos generales de “divide y vencerás”; en particular, si es usando una
serie de recursiones que lo convierten en simples bucles. Bajo esta amplia
definición, sin embargo, cada algoritmo que usa recursión o bucles puede
ser tomado como un algoritmo de “divide y vencerás”. El nombre
decrementa y vencerás ha sido propuesta para la subclase simple de
problemas.
12. Algoritmo en la programaciones secuencial, concurrente y paralela, incluir
ejemplos.

A menudo se asume que Dijkstra instigó el estudio de la programación


concurrente en su ahora clásico artículo "Procesos secuenciales de
cooperación", publicado en 1967. Ciertamente, en ese artículo vemos la
introducción de algunos problemas ahora bien conocidos como "The Dining
Philosophers "," The Sleeping Barber "y" The Dutch Flag Problem ", y quizás
lo más importante, el problema de la sección crítica y su solución utilizando
semáforos. Este artículo fue, de hecho, el primero en tener una visión de alto
nivel de la programación concurrente. Como nota aparte, es interesante
observar que el mismo artículo introduce la noción de interbloqueo y
presenta un algoritmo que puede detectar la posible presencia de bloqueos.
Sin embargo, a principios de la década de 1960, primero se presentó
Conway y luego Dennis y Van Horn. La idea de múltiples hilos de control se
introdujo en este momento, y es interesante observar que algunos de los
problemas de acceso a recursos compartidos, como la memoria, también se
abordaron en ese momento. Al igual que en el desarrollo de lenguajes de
programación [secuencial] de alto nivel, los investigadores se dieron cuenta
de los problemas asociados con el uso de estas construcciones de bajo nivel,
principalmente en el área de tratar de escribir programas de manera
correcta y rápida. y como resultado se inventaron construcciones de más
alto nivel y más restrictivas. Por lo tanto, ahora vemos una plétora de
diferentes técnicas para proporcionar programación concurrente controlada,
muchas de las cuales examinaremos con mayor detalle en los últimos
capítulos de este libro

La computación concurrente se desarrolló a partir de trabajos anteriores


sobre ferrocarriles y telegrafía, del siglo XIX y principios del XX, y algunos
términos datan de este período, como semáforos. Estos surgieron para
abordar la cuestión de cómo manejar múltiples trenes en el mismo sistema
ferroviario (evitando colisiones y maximizando la eficiencia) y cómo manejar
múltiples transmisiones a través de un conjunto determinado de cables
(mejorando la eficiencia), como a través de multiplexación por división de
tiempo (década de 1870).
Filosofía Es la división de un problema en subproblemas que se solucionan
de forma individual, para crear un programa o aplicación que no se vea
afectada en tiempo real.

Las dificultades de la concurrencia:

¿Cómo mantener el acceso a recursos compartidos correcto y eficiente?

¿Cómo permitir a los programadores razonar sobre un programa


concurrente?

¿Cómo modelar la composición de tareas concurrentes?

¿Cuál es la abstracción más ergonómica para escribir programas


concurrentes?

Modelos de concurrencia

La solución general en el mundo de la computación viene a apoyarnos en la


solución a estos problemas: la abstracción.

Definición

Hace referencia a las técnicas de programación que son utilizadas para


expresar la concurrencia entre tareas y solución de los problemas de
comunicación y sincronización entre procesos. La programación concurrente
es la ejecución simultánea de múltiples tareas interactivamente. Estas tareas
pueden ser un conjunto de procesos o hilos de ejecución creados por un
único programa. Las tareas se pueden ejecutar en una sola CPU
(multiprogramación), en varios procesadores, o en una red de computadores
distribuidos.

La programación concurrente no es más que la forma en la cual podemos


resolver ciertas problemáticas de forma concurrente, es decir, ejecutando
múltiples tareas a la misma vez y no de forma secuencial. En un programa
concurrente las tareas puede continuar sin la necesidad que otras
comiencen o finalicen.

Si bien es cierto que la programación concurrente acarrea ciertos problemas,


principalmente al momento de compartir información entre tareas, también
es cierto que, si se implementa de forma correcta, podremos, en casos
puntuales, mejorar significativamente el performance de nuestras
aplicaciones.

Concurrencia VS Paralelismo
Este puede llegar a ser uno de los puntos que más interés puede llegar a
causar en los programadores y con justa razón, ya que son términos que
pueden llegar a confundirse fácilmente, es por ello que es necesario
aprender a diferenciarlos.

La concurrencia es una forma de estructurar una solución que puede ser


paralelizadle (Aunque no siempre)

 Concurrencia

 Soporta dos o más acciones en progreso

 Procesos que se ejecutan de manera independiente

 Lidiar con muchas cosas al tiempo

 Sobre la estructura

 Paralelismo

 Soporta dos o más acciones ejecutándose simultáneamente

 Procesos que se ejecutan Simultáneamente (tal vez relacionados)

 Hacer muchas cosas al tiempo

 Sobre la ejecución

Proceso

Un proceso no solamente es el código de un programa, un proceso tiene un


contador de programa el cual es un registro del computador que indica la
dirección de la siguiente instrucción que será ejecutada por el proceso, Pila
de proceso Esta contiene datos temporales tales como: Los parámetros de
las funciones, direcciones de retorno, variables locales , … , Sección de datos
la cual contiene datos tales como las variables locales, Heap: Cúmulo de
memoria que es la memoria que se asigna dinámicamente al proceso n
tiempo de ejecución

Note que un programa por sí sólo no es un proceso, ya que este es una


entidad pasiva que contiene una lista de instrucciones almacenadas en disco
(archivo ejecutable), mientras que un proceso es una entidad activa, el cual
cumple todas las características descritas anteriormente.

Estados del proceso

Cuando un proceso es ejecutado este cambia de estados, los estados que


todo proceso tiene por lo general son:

Nuevo: El proceso se está creando.

Corriendo: Se están ejecutando las instrucciones.

Espera: El proceso está esperando que algún evento ocurra.

Preparado: El proceso está esperando ser asignado al procesador

Terminado: El proceso ha terminado la ejecución.

PCB (Bloque de control de proceso)

Cada proceso se representa en el sistema operativo mediante el PCB, entre


los elementos de información que este contiene se encuentran:

Estado del proceso: New, ready, running, waiting, halted,

Contador del programa:

Registros de la CPU: Estos varían en cuanto a número y tipo dependiendo de


la arquitectura del procesador.

Información de planificación de la CPU: Parámetros de planificación como


prioridad de procesos, punteros a las colas de planificación.

Información de gestión de memoria: Tablas de páginas, tablas de


segmentos, dependiendo los mecanismos de gestión del S.O

Hilo

Se puede definir como una unidad básica de ejecución del Sistema


Operativo para la utilización del CPU. Este es quien va al procesador y realiza
todos los cálculos para que el programa se pueda ejecutar. Es necesario, ya
que debe contar con al menos un hilo para que cualquier programa sea
ejecutado. Cada hilo tiene: id de hilo, contador de programa, registros, stack.
Dentro de las características que se encuentran se tiene que cada hilo tiene
información del código de máquina que se va a ejecutar en el procesador,
sus respectivos datos, el acceso a los archivos, el registro y su respectivo
stack en donde se guarda toda la información necesaria del hilo como son
las variables locales, variables de retorno o algo a lo que se acceda en
tiempo de ejecución. Los hilos que pertenecen a un mismo proceso
comparten: sección de código, sección de datos, entre otros recursos del
sistema. El multithreading es la capacidad para poder proporcionar múltiples
hilos de ejecución al mismo tiempo. Una aplicación por lo general es
implementada como un proceso separado con muchos hilos de control.
Dentro de las semejanzas de hilo y multihilo es que poseen un solo bloque
de control de proceso (PCB) y un solo espacio de direcciones de proceso.
Por el contrario, en las diferencias es que mientras un hilo tiene una pila
para sus registros y stack, el multihilo tiene una pila para cada hilo con su
bloques de control internos, incluyendo la pila de registros y sus respectivos
stacks. Se dice que los hilos de ejecución que comparten recursos
agregando estos recursos da como resultado el proceso.

Caracteristicas:

Modelo apropiativo: Los hilos deben operar bajo la suposición de que su


ejecución puede verse interrumpida por el sistema operativo en cualquier
momento.

Posibilidad de recursos compartidos: Diferentes hilos en un proceso pueden


acceder a la misma región de memoria, o descriptores de archivos comunes
(entre otros).

Soporte directo al paralelismo: Se puede asumir con confianza que usar


hilos en un sistema multiprocesador lleva a una mayor utilización de esta
característica.

Diseño:

Creación de un hilo: La abstracción básica es la ejecución de una función


como punto de entrada para un hilo individual, y la obtención de un recurso
vinculado a dicha ejecución. Un hilo puede comenzar con:

 Un puntero a una función


 Una clausura

 Un método en un objeto

Un hilo se puede monitorear con:

 Un identificador en una tabla

 Un objeto nuevo

 El estado del objeto que la crea

Comunicación: Los hilos se pueden comunicar por medio de memoria


compartida. Para asegurar que esta memoria es accedida de manera
correcta, se provee al programador con primitivas de sincronización:
semáforos, exclusiones mutuas, tipos atómicos.

Multiprogramación

Es una técnica de multiplexación que permite de múltiples procesos en un


único procesador. Es importante resaltar que los procesos nunca corren en
paralelo en el procesador, ya que en cada instante de tiempo solo se ejecuta
un proceso en el procesador.

Multiproceso

Es una técnica en la cual se hace uso de dos o más procesadores en una


computadora para ejecutar uno o varios procesos.

Corrutinas

Características:

Modelo cooperativo: Las corrutinas tienen que ser programadas de manera


que cedan la ejecución en momentos apropiados, y eviten acaparar
recursos.

Contextos ligeros: Las corrutinas requieren un uso de memoria


considerablemente menor, gracias a que no definen el contexto completo:
un solo hilo de S.O. puede aprovisionar múltiples corrutinas.

Soporte opcional de paralelismo: Las corrutinas suelen modelar la


concurrencia como un cambio de contexto dentro de un mismo hilo, sin
embargo, es probable que un runtime moderno permita configurar para
usar múltiples hilos.
Diseño:

Cooperación Deben existir constructos en el lenguaje (palabras clave,


interfaces, u otros) que permitan señalizar el punto en el que una corrutina
cede la ejecución.

Algunas formas de sintaxis que pueden permitir esto:

Funciones que retornan handles, con métodos adecuados.Objetos


compartidos que monitorean el estado de cada subrutinaPalabras claves
que indican la oportunidad para cambiar de contexto, como yield o await.

13. Especificar las características particulares de los algoritmos paralelos, incluir


ejemplos. Programación Paralela

La necesidad que surge para resolver problemas que requieren tiempo elevado de
cómputo origina lo que hoy se conoce como computación paralela. Mediante el
uso concurrente de varios procesadores se resuelven problemas de manera más
rápida que lo que se puede realizar con un solo procesador.

Una computadora paralela es un conjunto de procesadores que son capaces de


trabajar cooperativamente para solucionar un problema computacional. Esta
definición es muy extensa e incluye supercomputadoras que tienen cientos o miles
de procesadores, redes de estaciones de trabajo o estaciones de trabajo con
múltiples procesadores.

Diseño de algoritmos paralelos

Los algoritmos paralelos son extremadamente importantes para solucionar


problemas grandes para muchos campos de aplicación. En esta sección se
describen las etapas típicas para el diseño de los algoritmos paralelos:

Particionamiento. Los cálculos se descomponen en pequeñas tareas. Usualmente


es independiente de la arquitectura o del modelo de programación. Un buen
particionamiento divide tanto los cálculos asociados con el problema como los
datos sobre los cuales opera.

Comunicación. Las tareas generadas por una partición están propuestas para
ejecutarse concurrentemente pero no pueden, en general, ejecutarse
independientemente. Los cálculos en la ejecución de una tarea normalmente
requerirán de datos asociados con otras tareas.
Los datos deben transferirse entre las tareas y así permitir que los cálculos
procedan. Este flujo de información se especifica en esta fase.

Aglomeración.

Las tareas y las estructuras de comunicación definidas en las dos primeras etapas
del diseño son evaluadas con respecto a los requerimientos de ejecución y costos
de implementación. Si es necesario, las tareas son combinadas en tareas más
grandes para mejorar la ejecución o para reducir los costos de comunicación y
sincronización.

Mapeo. Cada tarea es asignada a un procesador de tal modo que intente satisfacer
las metas de competencia al maximizar la utilización del procesador y minimizar los
costos de comunicación.

metodología de diseño para programas paralelos. Iniciando con la especificación


de un problema, desarrollando una partición, determinando los requerimientos de
comunicación, las tareas aglomeradas, y finalmente el mapeo de tareas a
procesadores.

También podría gustarte