Posted tagged ‘UNIX’

Android como Sistema Operativo

23 abril, 2019

Hola a todos,

Continuando con el curso de Android, les comparto ahora un material que nos habla de las características de Android como sistema operativo. Un sistema operativo es un software bastante grande, que se encarga de administrar todos los recursos del sistema, atender las ordenes del usuario y mantener sus aplicaciones en ejecución.

¿qué mecanismos usa Android para realizar administrar la ejecución de un dispositivo móvil?

Aquí el enlace a las notas: http://www.nachintoch.mx/teaching/mobile_dev/android-OS.pdf

Memory Rhapsody: un tributo a la nerdancia

30 marzo, 2017

Hola a todos!

En un intento más por parecer divertido; hace ya un año o más, escribí después de una noche de insomnio forzado (que casi no me tocan) esta adaptación del eterno clásico de Queen “Bohemian Rhapsody”; donde el personaje le anuncia a su madre que debe huir y esconderse por haber asesinado a alguien de un disparo y comienza a suplicara por su libertad mientras expresa su miseria y arrepentimiento.

Aquella noche de insomnio forzado, trabajaba en un programa en C que resolvía el problema del consenso para dos procesos (procesos de UNIX reales y no nada más los que se pueden modelar con hilos o procesos ligeros). Aprendí varias cosas aquella noche; cómo porqué no siempre es buena idea permitir que el compilador optimice ciertas variables o que usar registros como memoria compartida es mala idea. Pueden ver el post que publiqué en su momento aquí.

A la mañana siguiente; iba con el miedo de quedarme dormido en el metro y darle varias vuelta a la ciudad, cuando debería de haber estado en el trabajo. Así que tenía que mantener la mente suficientemente ocupada como para no dormirme sin un expendio de café a la redonda. No podía dejar de pensar en lo que había estado haciendo durante la noche mientras escuchaba música. En eso, escuché Bohemian Rhapsody y no pude evitar imaginar que el personaje era un proceso pidiendo clemencia al sistema operativo por haber efectuado una operación ilegal; y después empieza a expresara que su miseria se origina en sus “errores de programación”… Y así fue, como escribí esta burda adaptación “Memory Rhapsody”.

Espero les guste y les cause una sonrisa; como a mi siempre me la causa la oración al C.

Is this a real space? Or is just a null pointer? Caught in a bus flow, No escape from user misspells.

Open a file, Look for a EOF, And read…

I’m just a user process, I need no privileges.

Because I easy fork, Easy goto, Little time, Little address.

Any way the scheduler works, Doesn’t really bother to me, To me.

Papa, Just kill a child, Call a kill against his will, System accepted, now its dead.

Papa, Processor time had just begun, But now I’ve created a system inconsistency.

Papa… Oh… Didn’t meant to SEGFAULT, If I’m not responsive again next round.

Carry on, carry on, As if were hosted by Windows…

Too late, The ticks are gone, SYSTERM returned successful, Messages run down through my pipe.

Goodbye whole system, I’ve goto, Gotta leave behind a corrupted memory.

Papa… Oh… I don’t want to die, Sometimes I wish I’ve never been forked at all…

I see a little siluetto of a thread, Scaramouche Scaramouche will you do the system call?

5 to 0 V very very frightening me! Dennis Ritchie! Dennis Ritchie! Dennis Ritchie let me go! Magnifico!!

I’m just just a user process, No body loves me, He’s just a user process, from a user application, Spared from the system by his coding errors!

Easy goto Easy return, Will you let me go?

Bismillah no! Do you think this’ NT? Let me go! Bismillah no!

Kernel’ll no let you go! Bismillah no! Kernel’ll no let you go! Let me go… No! No! No! No! No! No! No!

Oh papa mio papa mio, Papa mio let me go…

Beelzelebub has a loader aside for me, For me, for me, for me!

So you think you can block me and change my stats?

So you think you can instance me and let me to die?

Oh! System! Can you do this to me system?

I just wanna get out I just wanna get messaged remotely

Oh… Oh yeah! Oh yeah!

Nothing really bothered me… Any one can read.

Nothing really matters, Nothing really matters to me…

Any way the scheduler works…

Cómputo concurrente: Ejemplos de solución al problema del consenso en Java y C (Uso de las herramientas de concurrencia)

28 noviembre, 2015

Hola a todos!

Cerrando con broche de oro las clases de ayudatía que di este semestre, veremos a continuación algunos ejemplos para resolver problemas de concurrencia y en general de cómputo paralelo.

Les presento a continuación las notas, donde les explico las herramientas. Los ejemplos en C, pueden usarse en proyectos C++, y con algunas modificaciones, también puede usarse con varios sistemas basados en UNIX (incluyendo Mac OS X) y con la WinApi para su uso con Windows.

En el programa en C, se ilustra también cómo capturar una señal, por ejemplo la que se dispara cuando el usuario da la orden de interrumpir el comando actual usando ctrl +C (SIGINT).

En las notas encontrará más información al respecto:
http://nachintoch.mx/teaching/texts/23_nov%20-%20Ejemplos%20en%20Java%20y%20C%20soluci%C3%B3n%20al%20problema%20del%20consenso.pdf

El código de los ejemplos, puede encontrarlo en el siguiente repositorio en GitHub:
https://github.com/Nachintoch/ejemplos-concurrencia


 

Antes de terminar, quiero comentar algunos detalles sobre los ejemplos.

Primero que nada, la sección del makefile para compilar la implementación en C carece de las banderas para GCC mencionadas en las notas -ffixed-reg. Esto es porque (y lo aprendí a la mala), es mala idea usar registros cómo “variables globales compartidas” de un programa en C.

¿Porqué?

Al declarar la variable compartida, lo que tenemos es básicamente acceso a algún registro que nosotros hayamos elegido. Luego, como es compartida, usamos mmap para solicitar dicho espacio de memoria compartida y alojamos el apuntador que refiere al valor almacenado en el registro seleccionado. Esto suena a trabalenguas y es el punto clave, así que lo explicaré con calma.

register int *var asm(“%eax”);

Lo anterior declara una variable de C llamada “var”. Es de tipo apuntador a un entero de registro del procesador. Y además, solicitamos un registro estático para toda la vida del programa: el registro de procesador eax (en sintaxis para ensamblador de x86, x86_64 y amd64).

Entonces, tenemos un apuntador a un entero de registro. Queremos que este se convierta en una memoria compartida entre el proceso padre que ha hecho esta declaración y sus hijos que instancie de alguna manera más adelante en el flujo del programa.

Sería entonces lo esperado hacer algo como lo siguiente:

var = mmap(NULL, sizeof(*var), PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);

mmap básicamente está solicitando al SO que nos de un espacio de memoria compartida y nos devuelve la dirección de memoria en la que el SO nos dió dicho espacio de memoria (o NULL (0) si el sistema no tiene suficiente memoria o por alguna otra razón rechaza la petición).

Cómo var es un apuntador, felizmente almacenamos la dirección de memoria retornada por mmap en var directamente y así tenemos un registro cuya dirección de memoria es compartida entre todos los procesos hijos y este padre. Genial ¿no?

Pues no mucho… ¿Qué pasa si el sistema interrumpe al proceso padre y lo envía a memoria? Uno esperaría que nada y que los hijos puedan seguir manipulando a donde apunta var felizmente, ya que es un espacio de memoria compartida ¿cierto?

Pero, var apunta a un registro de procesador, que además está en el contexto de ejecución del proceso padre que por el momento no está en ejecución, por lo que su contexto no está en el procesador, si no en memoria… Empieza a sonar feo ¿no?

Con el proceso padre sin tiempo de procesador, si un hijo intenta acceder a donde apunta var, accederá a una dirección del memoria -por el momento inválida- y normalmente el SO terminará matando al proceso hijo que hizo dicho intento.

Bajo nuestra aplicación anterior, esto es muy malo, ya que si justo ese era el proceso que debía hacer la llamada sem_post para permitir el progreso del otro proceso distinguido, esta condición habrá causado un deadlock.


 

Entonces, ¿usar variables registros o no usar variables registros? Esa es la cuestión.

La respuesta es la misma que si preguntamos cuando conviene usar un unsigned short int o un long long int: cuándo sea necesario y conveniente. La conveniencia de usar una variable registro, dependerá del problema a resolver y será necesario, en principio cuándo necesitemos usar una variable atómica por un muy breve periodo de tiempo y que además no necesitará ser una variable compartida.


 

Tomando en cuenta estas observaciones, podemos usar lo aprendido en estos ejemplo y algunas notas anteriores, para desarrollar aplicaciones concurrentes en distintas plataformas y al menos usando Java y C.

¡espero les sea de utilidad!

Saludos a todos!


A %d blogueros les gusta esto: