<commit_before>{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.2 Sistemas de memoria compartida o shared memory systems"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"https://dl.dropboxusercontent.com/s/ao3if8tzwsvzfi7/shared_memory_sistems.png?dl=0\" heigth=\"500\" width=\"500\">\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Características:**\n",
    "\n",
    "* El dibujo anterior es un sistema de memoria compartida con acceso uniforme a la memoria (UMA), esto es, cada procesador o core acceden con las mismas velocidades a la memoria.\n",
    "\n",
    "* Cada proceso o thread generado en este tipo de sistemas tienen acceso a la memoria principal (RAM). \n",
    "\n",
    "* Trabajar sobre este tipo de sistemas tiene ventajas y desventajas. Por ejemplo, crear variables globales o que pueden ser accesadas por todos los threads (variable compartida) facilita la comunicación. Una desventaja es la coordinación para ejecutar instrucciones pues al tener una variable compartida o global debemos crear candados, *locks*, ya que si un thread por ejemplo con etiqueta $1$ accede a ella, otro thread por ejemplo con etiqueta $2$, no pueda utilizarla hasta que finalice el thread $1$ de usarla. Ver [Thread Safety](https://en.wikipedia.org/wiki/Thread_safety)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Nota:**\n",
    "\n",
    "* Para generar procesos o threads en los lenguajes de programación de C, Python o R, utilizamos las librerías, API's o extensiones vía paquetes a tales lenguajes pues tanto C, Python como R en sus implementaciones* más utilizadas, fueron diseñados con el propósito de utilizarse sobre sistemas con un sólo procesador.\n",
    "\n",
    "\n",
    "\\* En distintas implementaciones hay soporte para sistemas de memoria compartida. La implementación más utilizada por ejemplo de Python es *CPython*, pero hay otras más, ver [liga](https://stackoverflow.com/questions/17130975/python-vs-cpython) para explicación de implementaciones de Python. Ver [Alternative R implementations](http://adv-r.had.co.nz/Performance.html#faster-r) y [liga](https://en.wikipedia.org/wiki/R_(programming_language)#Implementations) para otras implementaciones de R. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",<commit_msg>removing last line and adding info<commit_after>{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.2 Sistemas de memoria compartida o shared memory systems"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"https://dl.dropboxusercontent.com/s/ao3if8tzwsvzfi7/shared_memory_sistems.png?dl=0\" heigth=\"500\" width=\"500\">\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Características:**\n",
    "\n",
    "* El dibujo anterior es un sistema de memoria compartida con acceso uniforme a la memoria (UMA), esto es, cada procesador o core acceden con las mismas velocidades a la memoria.\n",
    "\n",
    "* Cada proceso o thread generado en este tipo de sistemas tienen acceso a la memoria principal (RAM). \n",
    "\n",
    "* Trabajar sobre este tipo de sistemas tiene ventajas y desventajas. Por ejemplo, crear variables globales o que pueden ser accesadas por todos los threads (variable compartida) facilita la comunicación. Una desventaja es la coordinación para ejecutar instrucciones pues al tener una variable compartida o global debemos crear candados, *locks*, ya que si un thread por ejemplo con etiqueta $1$ accede a ella, otro thread por ejemplo con etiqueta $2$, no pueda utilizarla hasta que finalice el thread $1$ de usarla. Ver [Thread Safety](https://en.wikipedia.org/wiki/Thread_safety)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Nota:**\n",
    "\n",
    "* Para generar procesos o threads en los lenguajes de programación de C, Python o R, utilizamos las librerías, API's o extensiones vía paquetes a tales lenguajes pues tanto C, Python como R en sus implementaciones* más utilizadas, fueron diseñados con el propósito de utilizarse sobre sistemas con un sólo procesador.\n",
    "\n",
    "\n",
    "\\* En distintas implementaciones hay soporte para sistemas de memoria compartida. La implementación más utilizada por ejemplo de Python es *CPython*, pero hay otras más, ver [liga](https://stackoverflow.com/questions/17130975/python-vs-cpython) para explicación de implementaciones de Python. Ver [Alternative R implementations](http://adv-r.had.co.nz/Performance.html#faster-r) y [liga](https://en.wikipedia.org/wiki/R_(programming_language)#Implementations) para otras implementaciones de R. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Revisaremos en los siguientes lenguajes librerías, paquetes y API's para cómputo en sistemas de memoria compartida:\n",
    "\n",
    "* Python: [multiprocessing](https://docs.python.org/3.1/library/multiprocessing.html), [dask](https://docs.dask.org/en/latest/).\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
{'fraction_non_alphanumeric': 0.1313224204524554, 'fraction_numerical': 0.009196247930844215, 'mean_word_length': 3.7743634767339773, 'pattern_counts': {'":': 42, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 10, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '138871', 'n_tokens_mistral': 1835, 'n_tokens_neox': 1788, 'n_words': 578}