Aplicaciones multi threads i
Download
1 / 70

Aplicaciones Multi-Threads-I - PowerPoint PPT Presentation


  • 79 Views
  • Uploaded on

Aplicaciones Multi-Threads-I. Ernesto Cuadros -V argas ecuadros@spc.org.pe Sociedad Peruana de Computación Perú. Organización de la presentación. Conceptos Básicos; Operaciones con hebras; Tipos de hebras; Comunicación entre hebras; Fibras; Otros puntos importantes; DEMOS;

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Aplicaciones Multi-Threads-I' - noma


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Aplicaciones multi threads i

Aplicaciones Multi-Threads-I

ErnestoCuadros-Vargas

ecuadros@spc.org.pe

Sociedad Peruana de Computación

Perú


Organizaci n de la presentaci n
Organización de la presentación

  • Conceptos Básicos;

  • Operaciones con hebras;

  • Tipos de hebras;

  • Comunicación entre hebras;

  • Fibras;

  • Otros puntos importantes;

  • DEMOS;

  • Sugerencias y conclusiones.

Aplicaciones Multi-Hebras


Conceptos b sicos
Conceptos básicos

  • programa

    • programa = algoritmos + ED;

  • proceso

    • abstracción de un programa en ejecución;

  • hebras o threads

    • secuencia de ejecución de un proceso;

Aplicaciones Multi-Hebras


Programa proceso hebra
Programa-Proceso-Hebra

Memoria

Aplicaciones Multi-Hebras

011011111010

cargador


Programaci n multi threads
Programación Multi-Threads

  • crear programas capaces de ejecutar más de una tarea en paralelo;

  • las hebras pueden estar en el mismo proceso;

  • estamos preparados para aprovechar mas de un procesador.

Aplicaciones Multi-Hebras


Origen de las hebras
Origen de las hebras

Proceso 1

Aplicaciones Multi-Hebras

Tiempo


Origen de las hebras cont
Origen de las hebras (cont)

Aplicaciones Multi-Hebras

P1

P2

Tiempo


Algunos ejemplos
Algunos ejemplos

  • manejadores de Bases de Datos;

  • servidores de Web;

  • servidores de FTP;

  • grabación en segundo plano (ej. Word);

  • compilación sin parar la edición, etc;

  • nuestra vida diaria (trabajo en grupo, tareas en paralelo).

Aplicaciones Multi-Hebras


Evoluci n
Evolución

  • sistemas monotareas vs.sistemas multitasking

  • programas ST vsprogramas MT

Aplicaciones Multi-Hebras


Ventajas
Ventajas

  • mayor aprovechamiento de la capacidad ociosa del procesador;

  • podemos aprovechar mas de un procesador;

  • mayor paralelismo;

  • menor tiempo de respuesta que en forma secuencial, etc.

Aplicaciones Multi-Hebras


Desventajas
Desventajas

  • mayor complejidad;

  • mayor cantidad de recursos necesarios (memoria, etc);

  • política de planificación de procesos.

Aplicaciones Multi-Hebras


Cu ndo usar mt
Cuándo usar MT ?

  • cuando mi programa presenta bloques independientes;

  • cuando tengo una pérdida de tiempo considerable por operaciones de I/O;

  • NÚMERO DE PROCESADORES.

Aplicaciones Multi-Hebras


Transicion de st a mt
Transicion de ST a MT

  • las hebras de ejecutan independientes unas de las otras  Problemas !

  • sincronización

    • en el mismo proceso (sibling Threads);

    • en procesos diferentes.

Aplicaciones Multi-Hebras


Planificador de procesos scheduler
Planificador de procesos (Scheduler)

Aplicaciones Multi-Hebras

Corriendo (Running)

3

1

2

Bloqueado (Blocked)

Listos (Ready)

4


Scheduler para 2 procesadores
Scheduler para 2 procesadores

P3

P8

Aplicaciones Multi-Hebras

Corriendo (Running)

Bloqueado (Blocked)

Listos (Ready)

P2

P1

P5

P7

P6

P4


Proceso vs hebra
Proceso vs Hebra

  • una pila (Stack);

  • entrada en el Scheduler;

  • registros de la CPU;

  • program counter, etc.

  • archivos abiertos;

  • variables globales;

  • memoria asignada dinamicamente, etc.

Aplicaciones Multi-Hebras


Necesidad de sincronizaci n
Necesidad de Sincronización

Ejemplos utilizando en la plataforma Win32

Aplicaciones Multi-Hebras


Problemas relacionados a la programaci n mt
Problemas relacionados a la programación MT

  • Atomicidad;

  • Exclusión mutua:

    • pedir un recurso,

    • liberar el recurso

  • Race Conditions:

    • Un bug que depende del orden en el que se ejecuten dos o más tareas independientes

Aplicaciones Multi-Hebras


Atomicidad y exclusi n mutua
Atomicidad y exclusión mutua

Aplicaciones Multi-Hebras


Atomicidad cont
Atomicidad (cont)

Aplicaciones Multi-Hebras

  • HANDLE hIOMutex= ::CreateMutex (NULL, FALSE, 0);

  • // Pedir acceso al recurso

  • ::WaitForSingleObject( hIOMutex, INFINITE );

  • // Realizar nuestra operación crítica

  • ::fseek( fp, desired_position, 0L );

  • ::fwrite( data, sizeof( data ), 1, fp );

  • // Liberar el acceso al recurso

  • ::ReleaseMutex(hIOMutex);


  • Race conditions
    Race Conditions

    Aplicaciones Multi-Hebras


    Problemas relacionados a programaci n mt cont
    Problemas relacionados a programación MT (cont)

    • Deadlock;

    • Diseño de clases seguras para ambientes MT;

    • Starvation (morir de hambre)

      • Threads de prioridades altas siempre ganaran el procesador.

    Aplicaciones Multi-Hebras


    Deadlock bloqueo mutuo
    Deadlock (bloqueo mutuo)

    Aplicaciones Multi-Hebras


    Clases seguras para ambientes mt
    Clases seguras para ambientes MT

    void MyClass::PrintPersonalInfo(){ m_report = Datos_Personales; Imprimir();}

    void MyClass::PrintHistorico(){ m_report = Historico; Imprimir();}

    Aplicaciones Multi-Hebras

    Thread1

    Thread2

    void MyClass::Imprimir(){ switch(m_report) { case Datos_Personales: …… break; case Datos_Personales: …… break; }}


    Mecanismos de sincronizaci n
    Mecanismos de Sincronización

    • por la cantidad de estados:

      • binarios,

      • de múltiples estados.

    • por su alcance:

      • dentro del mismo proceso,

      • entre procesos.

    Aplicaciones Multi-Hebras


    Por la cantidad de estados
    Por la cantidad de estados

    • binarios

      • Events (CEvent),

      • CriticalSection (CCriticalSection),

      • Mutex (CMutex).

    • de múltiples estados:

      • Semáforos (CSemaphore)

    Aplicaciones Multi-Hebras


    Por su alcance
    Por su alcance

    • dentro del mismo proceso:

      • CriticalSection

    • entre procesos:

      • Event, Mutex, Semáforos,

        • también sirven en el mismo proceso.

    Aplicaciones Multi-Hebras


    Entre procesos
    Entre procesos

    Aplicaciones Multi-Hebras

    Semáforo “Impresion”

    Handle(35)

    Semáforo “Impresion”

    Handle(7)

    Proceso 1

    Proceso 2

    Win32

    Semaphore “Impresion” Kernel Object

    Usage Counter=2More information ….


    Tipos de hebras
    Tipos de hebras

    • worker threads o hebras trabajadoras;

    • hebras con interface de usuario.

    Aplicaciones Multi-Hebras


    Worker thread
    Worker Thread

    • para tareas en background o en segundo plano;

    • cuando no necesitamos enviar o recibir mensajes a través de ventanas;

    • no es necesario interactuar con la hebra.

    Aplicaciones Multi-Hebras


    Pasos para crear una worker thread
    Pasos para crear una Worker Thread

    • programar una función que será al “main” de la hebra,

    • crear la hebra propiamente dicha con alguna de las funciones API (CreateThread, _beginthread)

    Aplicaciones Multi-Hebras


    Paso 1 programar una funci n que ser el main de la hebra
    Paso 1: Programar una función que será el “main” de la hebra

    DWORDWINAPI MyThreadMain(LPVOID lpParameter)

    {

    CStudent *pMyObj = (CStudent *)lpParameter;

    pMyObj->MyMethod1();

    pMyObj->MyMethod2();

    .

    .

    .

    return 0L;

    }

    Aplicaciones Multi-Hebras


    Paso 2 creaci n de una thread con createthread
    Paso 2: Creación de una Thread con CreateThread hebra

    HANDLECreateThread(

    // puntero a los atributos de securidad

    LPSECURITY_ATTRIBUTES lpThreadAttributes,

    // Tamaño inicial del Stack para esta hebra

    DWORD dwStackSize,

    // puntero a la función de la hebra

    LPTHREAD_START_ROUTINE lpStartAddress,

    // argumento para la nueva hebra

    LPVOID lpParameter,

    // atributos de creación

    DWORD dwCreationFlags,

    // puntero para recibir el ID de la hebra

    LPDWORD lpThreadId );

    Aplicaciones Multi-Hebras


    Paso 2 creaci n de una thread con createthread cont
    Paso 2: Creación de una Thread con CreateThread (cont) hebra

    CStudent *pMyObj = new CStudent;

    DWORD ThreadID;

    HANDLE myhandle = CreateThread(

    NULL, 4096,

    &MyThreadMain, (LPVOID)pMyObj,

    0, // CREATE_SUSPENDED

    &ThreadId );

    Aplicaciones Multi-Hebras


    Hebras usando c run time library
    Hebras usando C Run-Time Library hebra

    void __cdecl MyThreadMain2(void *lpParameter)

    {

    CStudent *pMyObj = (CStudent *)lpParameter;

    pMyObj->MyMethod1();

    pMyObj->MyMethod2();

    .

    .

    .

    return 0L;

    }

    Aplicaciones Multi-Hebras


    Paso 2 creaci n de una thread con beginthread cont
    Paso 2: Creación de una Thread con _beginthread (cont) hebra

    unsigned long _beginthread( // Puntero a la funcion que controlará la hebravoid( __cdecl *start_address )( void * ),// Tamaño del stack unsigned stack_size,// Lista de argumentos void *arglist );

    HANDLE handle = (HANDLE)_beginthread( & MyThreadMain2, 4096, NULL);

    Aplicaciones Multi-Hebras


    Operaciones b sicas con una hebra
    Operaciones básicas con una hebra hebra

    • ::WaitForSingleObject(hThread, 5);

    • ::WaitForSingleObject(hThread, INFINITE);

    • ::SuspendThread(hThread);

    • ::ResumeThread(hThread);

    Aplicaciones Multi-Hebras


    Prioridades de una thread setthreadpriority
    Prioridades de una Thread (SetThreadPriority) hebra

    ::SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);

    • THREAD_PRIORITY_ABOVE_NORMAL;

    • THREAD_PRIORITY_BELOW_NORMAL;

    • THREAD_PRIORITY_HIGHEST;

    • THREAD_PRIORITY_IDLE;

    • THREAD_PRIORITY_LOWEST;

    • THREAD_PRIORITY_NORMAL;

    • THREAD_PRIORITY_TIME_CRITICAL.

    Aplicaciones Multi-Hebras


    Prioridades para todo el proceso
    Prioridades para todo el proceso hebra

    ::SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);

    • HIGH_PRIORITY_CLASS;

    • IDLE_PRIORITY_CLASS;

    • NORMAL_PRIORITY_CLASS;

    • REALTIME_PRIORITY_CLASS.

    Aplicaciones Multi-Hebras


    Aplicaciones multi threads i

    Demo Worker Threads hebra

    Break !

    Aplicaciones Multi-Hebras


    Aplicaciones multi threads ii

    Aplicaciones Multi-Threads-II hebra

    ErnestoCuadros-Vargas

    ecuadros@spc.org.pe

    Sociedad Peruana de Computación

    Piura-Perú


    Hebras con interface
    Hebras con interface hebra

    • útiles cuando necesitamos enviar mensajes o interactuar a través de algún mecanismo visible al usuario (generalmente una ventana)

    • existe la clase CWinThread (MFC)

    Aplicaciones Multi-Hebras


    Secuencia de creaci n
    Secuencia de creación hebra

    • crear la clase heredada de CWinThread (inicialmente esta vacía);

      BOOL CMyThread::InitInstance()

      {

      returnTRUE;

      }

    • crear la hebra hija;

    Aplicaciones Multi-Hebras


    Crear la hebra hija
    Crear la hebra hija hebra

    void CMainFrame::OnNuevaThread()

    {

    // TODO: Add your command handler code here

    CRuntimeClass *pRuntimeClass = RUNTIME_CLASS(CMyThread);

    CMyThread *pMyThread =

    (CMyThread *)pRuntimeClass->CreateObject();

    pMyThread->CreateThread();

    }

    Aplicaciones Multi-Hebras


    Crear la hebra hija cont
    Crear la hebra hija (cont) hebra

    BOOL CMyThread::InitInstance()

    { CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(

    IDR_MAINFRAME,

    RUNTIME_CLASS(CTeste2Doc), // clase del documento

    RUNTIME_CLASS(CMainFrame), // clase del MainFrame

    RUNTIME_CLASS(CTeste2View)); // clase del área de cliente

    // Crear un nuevo documento para esta ventana

    CDocument *pDoc = pDocTemplate->CreateNewDocument();

    // Crear la ventana propiamente dicha

    m_pMainWnd = pDocTemplate->CreateNewFrame(pDoc, NULL);

    // Hacerla visible

    m_pMainWnd->ShowWindow(SW_SHOW);

    // Enviarle un mensage de actualizacion

    m_pMainWnd->UpdateWindow();

    return TRUE;

    }

    Aplicaciones Multi-Hebras


    Comunicaci n entre ventanas y o hebras
    Comunicación entre ventanas y/o hebras hebra

    • colas de mensajes

      • de tamaño fijo en Win16

      • dinámicas en Win32 (listas enlazadas)

    • SendMessage

    • PostMessage

    • PostThreadMessage

    • SendMessageTimeout

    Aplicaciones Multi-Hebras


    Postmessage
    PostMessage hebra

    • PostMessage(HWND hWnd, UINT msg, WPARAM, LPARAM);

    • coloca el mensaje en la fila de la hebra que creó hWnd y retorna.

    Aplicaciones Multi-Hebras


    Sendmessage
    SendMessage hebra

    • SendMessage(HWND hWnd, UINT msg, WPARAM, LPARAM)

    • coloca el mensaje en la fila de la hebra que creó hWnd

    • espera hasta que el mensaje sea procesado

    • retorna

    Aplicaciones Multi-Hebras


    Postthreadmessage
    PostThreadMessage hebra

    • PostThreadMessage(DWORD ThreadID,UINT msg, WPARAM, LPARAM)

    • coloca el mensaje en la fila de la hebra identificada con ThreadID

    • retorna

    Aplicaciones Multi-Hebras


    Importante sendmessage entre ventanas
    Importante: hebraSendMessage (entre ventanas)

    • una ventana procesa sus mensajes cuando la hebra que la creo esta activa!

    • un mensaje siempre va a la cola de mensajes de la hebra que la creó.

    Aplicaciones Multi-Hebras


    Creando una funci n para recibir mensajes
    Creando una función para recibir mensajes hebra

    LRESULT CMyThread::MyFuncion(LPARAM wParam, LPARAM lParam)

    {

    // Aqui debemos agregar nuestro código

    return 0L;

    }

    Aplicaciones Multi-Hebras


    Mapeando un mensaje a una funci n en la clase heredada de cwinthread
    Mapeando un mensaje a una función en la clase heredada de CWinThread

    BEGIN_MESSAGE_MAP(CMyThread, CWinThread)

    //{{AFX_MSG_MAP(CMyThread)

    ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)

    //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    // #define WM_MYMESSAGE (WM_USER+1)

    …….

    LRESULT CMyThread::MyFuncion( LPARAM wParam, LPARAM lParam){ // Aqui debemos agregar nuestro código

    return 0L;}

    Aplicaciones Multi-Hebras


    Mapeando un mensaje a una funci n de una ventana
    Mapeando un mensaje a una función de una ventana CWinThread

    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)

    //{{AFX_MSG_MAP(CMyThread)

    ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)

    //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    // #define WM_MYMESSAGE (WM_USER+1)

    …….

    LRESULT CMyThread::MyFuncion( LPARAM wParam, LPARAM lParam){ // Aqui debemos agregar nuestro código

    return 0L;}

    Aplicaciones Multi-Hebras


    Comunicaci n entre ventanas y o hebras cont
    Comunicación entre ventanas y/o hebras (cont) CWinThread

    • SendMessageCallback

      • VOIDCALLBACKSendMessageCallback(HWND hWnd, UINT uMsg,DWORD dwData,LRESULT lResult);

    Aplicaciones Multi-Hebras


    Comunicaci n entre ventanas y o hebras cont1
    Comunicación entre ventanas y/o hebras (cont) CWinThread

    • SendNotifyMessage

      • coloca el mensaje en la cabeza de la lista de la otra hebra y retorna;

      • si esta en la misma hebra se comporta igual que SendMessage.

    • MsgWaitForMultipleObjects

      • espera por mensajes en su propia fila de mensajes.

    Aplicaciones Multi-Hebras


    Otras formas de comunicaci n
    Otras formas de comunicación CWinThread

    • Memoria Compartida (Shared Memory),

    • Archivos Mapeados a memoria(Memory Mapped Files),

    • Tubos Anónimos (Anonymous Pipes),

    Aplicaciones Multi-Hebras


    Memoria compartida shared memory memory mapped files
    Memoria Compartida ( CWinThreadShared Memory & Memory Mapped Files)

    • crear el archivo (CreateFile, OpenFile)

    • CreateFileMapping

    • MapViewOfFile

    Aplicaciones Multi-Hebras


    Memoria compartida shared memory memory mapped files1
    Memoria Compartida ( CWinThreadShared Memory & Memory Mapped Files)

    HANDLE hFile, hMapping;LPVOID lpBaseAddress;// mapear el archivo …hFile = CreateFile( "somefile.dat", ...);hMapping = CreateFileMapping( hFile, ...);lpBaseAddress = MapViewOfFile( hMapping, ...);// MapViewOfFile incrementó los contadores de uso de los objetos… CloseHandle(hFile);

    CloseHandle(hMapping);

    // usar lpBaseAddress aquí ...

    UnmapViewOfFile(lpBaseAddress);

    // decrementa los contadores de uso de hFile y hMapping

    // destruyéndolos

    DEMO

    Aplicaciones Multi-Hebras


    Tubos pipes
    Tubos ( CWinThreadPipes)

    • tubos bidireccionales para pasar datos,

      • anónimos (Win95, WinNT, etc)

      • named Pipes (sólo se pueden crear desde WinNT, pero pueden ser abiertos desde Win95)

        • remotamente \\.\pipe\mi-nuevo-pipe

    Aplicaciones Multi-Hebras


    Tubos pipes cont
    Tubos ( CWinThreadPipes) (cont)

    • poseen dos conductos

      • Lectura,

      • Escritura

    • envío de datos: First In First Out (FIFO)

    Aplicaciones Multi-Hebras


    Tubos an nimos anonymous pipes
    Tubos Anónimos CWinThread(Anonymous Pipes)

    BOOLCreatePipe( // pointer to read handlePHANDLE hReadPipe, // pointer to write handlePHANDLEhWritePipe, // pointer to security attributesLPSECURITY_ATTRIBUTES lpPipeAttributes, // pipe sizeDWORD nSize);

    Aplicaciones Multi-Hebras


    Fibras
    Fibras CWinThread

    • unidad de ejecución que puede ser manualmente activada por la aplicaciones;

    • el usuario puede decidir cuando darle el procesador a otra fibra;

    • corren en el contexto de una hebra;

    • una hebra puede controlar múltiples fibras.

    Aplicaciones Multi-Hebras


    Fibras cont
    Fibras (cont) CWinThread

    • en general no ofrecen ventajas sin son comparadas con una aplicación Multi-hebras bien diseñada;

    • mejor aprender a controlas bien las hebras.

    Aplicaciones Multi-Hebras


    Fibras cont1
    Fibras (cont) CWinThread

    • ConvertThreadToFiber

    • CreateFiber

    • DeleteFiber

    • GetCurrentFiber

    • GetFiberData

    • SwitchToFiber

    Aplicaciones Multi-Hebras


    Otros puntos importantes
    Otros puntos importantes CWinThread

    • MCL (Multithreading Class Library);

    • depuración de hebras;

    • ningún depurador substituye un buen diseño previo.

    Aplicaciones Multi-Hebras


    Experimentos el problema de los fil sofos
    Experimentos: CWinThreadEl problema de los filósofos

    Aplicaciones Multi-Hebras


    Experimentos proyecto informedia cmu fastmap st vs fastmap mt 2 cpus
    Experimentos: Proyecto Informedia-CMU CWinThreadFastmap ST vs. Fastmap MT (2-CPUs)

    Aplicaciones Multi-Hebras


    Sugerencias
    Sugerencias CWinThread

    • la naturaleza del problema;

    • atomicidad del código (el Scheduler podría parar la ejecución);

    • estados de espera óptimos;

    • cantidad de hebras.

    Aplicaciones Multi-Hebras


    Conclusiones
    Conclusiones CWinThread

    • depende de la naturaleza del problema mas que del tipo de máquina,

    • los programas MT pueden correr con una CPU pero están preparados para trabajar con mas CPU,

    • el número de hebras está vinculado al número de procesadores y a la cantidad de operaciones con I/O.

    Aplicaciones Multi-Hebras


    Gracias
    GRACIAS ! CWinThread

    Ernesto Cuadros-VargasSociedad Peruana de Computación

    http://socios.spc.org.pe/ecuadros/

    ecuadros@spc.org.pe

    Aplicaciones Multi-Hebras