Многопоточное приложение

Тема в разделе "WASM.BEGINNERS", создана пользователем SystemX86, 26 май 2011.

  1. SystemX86

    SystemX86 New Member

    Публикаций:
    0
    Регистрация:
    26 май 2011
    Сообщения:
    4
    Всем привет! Задали мне курсовую, тема: "Реализация многопоточности в реальном режиме работы микропроцессора". В АСМе я не силен, и написать такое приложение явно не смогу. Может есть у кого-то такое приложение? Это может быть что-то вроде змеек, но желательно не они. Заранее благодарен.
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Под какую ось?
     
  3. SystemX86

    SystemX86 New Member

    Публикаций:
    0
    Регистрация:
    26 май 2011
    Сообщения:
    4
    Можно как под ДОС так и под Виндовс.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Цикл: Туториалы Iczelion'а о Win32 API
    Win32 API. Урок 15. Треды (ветви) http://wasm.ru/article.php?article=1001015
    Почитай, все просто. Тем более такой ник себе выбрал.
     
  5. SystemX86

    SystemX86 New Member

    Публикаций:
    0
    Регистрация:
    26 май 2011
    Сообщения:
    4
    Читал, для меня это темень, А может есть у кого-то исходник чего-то на подобии змейки? А ник надо заранее забивать, потом не будет:)
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    НУ может это ...
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\masm32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\masm32.lib
    9.  
    10. ThreadProc  PROTO :DWORD
    11. ;-----------------------------------
    12. .data
    13.     hThreadProc dd 0
    14.     dwtid       dd 0
    15.     szMessage_frMain    db 13,10,'<> From Main here ...',13,10,0
    16.     szMessage_frThread  db '    > From Thread here ...',13,10,0
    17.     szMessage_prEnter   db '[Enter]',13,10,0   
    18.     input_buffer    db 1 dup(0)
    19. ;-----------------------------------
    20. .code
    21. main:
    22.     invoke  StdOut, addr szMessage_frMain
    23.     invoke  CreateThread,NULL,0,addr ThreadProc,NULL,0,addr dwtid
    24.     mov hThreadProc, eax
    25.     invoke  Sleep, 3000
    26.     invoke  TerminateThread,hThreadProc,0
    27.     invoke  CloseHandle,hThreadProc
    28.     invoke  StdOut, addr szMessage_frMain
    29.     invoke  StdOut, addr szMessage_prEnter
    30.     invoke  StdIn, addr input_buffer, 1
    31.     invoke  ExitProcess,0
    32. ;-----------------------------------
    33. ThreadProc PROC  hInst:DWORD
    34.     .while  1
    35.         invoke  Sleep, 1000
    36.         invoke  StdOut, addr szMessage_frThread
    37.     .endw
    38.     ret
    39. ThreadProc ENDP
    40. end main
    ???!!!
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    SystemX86
    читаете про нити и кооперативную многозадачность. исходники берете из какой нибудь простой малоразмерной или учебной оси. желательно, с описанием получше. вас будет интересовать планировщик.
    даже не знаю что вам посоветовать если вы 0 и желаете 0 оставаться.

    классика - миникс. видел описания с кусками кода для линя и для плана. неплохо расписан кнх в книгах кёртена. но все это сложно (может, кроме миникса). даже не знаю что сказать.. с таким желанием ничего не знать, может вам покинуть ваш ин? все равно работать по специальности не сможете. будете барыжить если не сможете пролезть бумажки перекладывать. а так, хоть времени не потеряете?
     
  8. SystemX86

    SystemX86 New Member

    Публикаций:
    0
    Регистрация:
    26 май 2011
    Сообщения:
    4
    Дело не в том что не хочу, а в том что времени сутки, а такие вещи не делаются с 0 за 24 часа...
     
  9. Xml

    Xml New Member

    Публикаций:
    0
    Регистрация:
    18 май 2011
    Сообщения:
    54
  10. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Тогда вам однозначно в COMMERCE.
     
  11. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    На С есть, на asm-е неудобно писать такое.
     
  12. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    В реальном режиме? Какая винда, она в PM, да про нити уже рассказали.
    Если писать под RM с 0 то это дело не слишком сложно.
    Вот открываем интеловский ман, смотрим что такое TSS, так вот. Делаем структуру, наподобие TSS (они в PM), потом разделяем место под адресное пространство задач. При тике таймера сохраняем текущий контекст и переключаемся на следующий. Словами долго описывать.
     
  13. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    SystemX86, пишите в ЛС. Подробнее расскажу.
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    простейшая реализация кооперативной многозадачности на колене. набросок без каких либо проверок на ошибки (стало быть, они там имеются). но достаточно чтоб уловить идею и, возможно, даже представить как набросок вашему учителю завтра.

    Код (Text):
    1. ////////////////////////////////////
    2. // хидер
    3. #define TASK_HEAP_SIZE 0x1000
    4.  
    5.  
    6. typedef struct { ... } Context;
    7.  
    8. typedef void (*Task)(Context *ctxt);
    9.  
    10. typedef struct {
    11.   unsigned flags;
    12.   unsigned ax;
    13.   unsigned bx;
    14.  // ......
    15.   unsigned sp;
    16.   unsigned ip;
    17.  
    18.   void* stack_base;
    19. } Registers;
    20.  
    21. typedef struct {
    22.   Task task;
    23.   Context *ctxt;
    24.   Registers regs;
    25. } Fiber;
    26.  
    27.  
    28. ///////////////////////////////////
    29. // очередь задач
    30. Fiber queue[] = {
    31.    {null, null, {0}},   // 0 используется для сохранения стартовых значений
    32.    {&task1, &ctxt1, {0}},
    33.    {&task2, &ctxt2, {0}},
    34.    {&task3, &ctxt3, {0}}
    35. };
    36.  
    37. int queue_len = 3;
    38.  
    39. int cur_task = 0;
    40.  
    41.  
    42. /////////////////////////////////
    43. // задачи
    44. //-- 1-вая -----------
    45. Context ctxt1 = { ... };
    46.  
    47. void task1(Context *ctxt){
    48.  ...
    49. }
    50.  
    51. //-- 2-рая ----------
    52. Context ctxt2 = { ... };
    53.  
    54. void task2(Context *ctxt){
    55.  ...
    56. }
    57.  
    58. //-- 3-тья ----------
    59. Context ctxt3 = { ... };
    60.  
    61. void task3(Context *ctxt){
    62.  ...
    63. }
    64.  
    65.  
    66.  
    67. /////////////////////////////////////
    68. // служебные функции
    69.  
    70. // выход из программы
    71. void exit(){
    72.     for(; queue_len > 0; queue_len--){
    73.         if(queue[queue_len].regs.stack_base != 0)
    74.             free(queue[queue_len].regs.stack_base);
    75.             queue[queue_len].regs.stack_base = 0;
    76.     }
    77.    
    78.     cur_task = -1;
    79.    
    80.     queue_len = queue[0].regs.sp;
    81.    
    82.     _asm{
    83.         push queue_len
    84.         pop sp
    85.        
    86.         jmp shedule
    87.     }
    88. }
    89.  
    90. // вызов stop удаляет текущую нить из планировщика
    91. void stop(){
    92.     free(queue[cur_task].regs.stack_base);
    93.     queue[cur_task].regs.stack_base = 0;
    94.     queue[cur_task].task = 0;
    95.  
    96.     shedule();
    97. }
    98.  
    99.  
    100. Fiber *cur_fiber;
    101. Registers *cur_regs;
    102.  
    103. // вызов shedule передает управление следующей нити.
    104. void shedule(){
    105.     if(cur_task != -1){
    106.         cur_fiber = &queue[cur_task];
    107.         cur_regs = &cur_fiber->regs;
    108.        
    109.         _asm{
    110.             pushf
    111.             push ax
    112.             ; ...
    113.             call M
    114.            
    115.             jmp Exit
    116.         }
    117.         M:
    118.         _asm{
    119.             mov ax,cur_regs
    120.            
    121.             pop [ax + Registers.ip]
    122.             ; ...
    123.             pop [ax + Registers.ax]
    124.             pop [ax + Registers.flags]
    125.         }
    126.        
    127.         do{
    128.             cur_task++;
    129.             if(cur_task > queue_len)
    130.                 cur_task = 1;
    131.         }until(queue[cur_task].task == 0);
    132.     }else{
    133.         cur_task = 0;
    134.     }
    135.     cur_fiber = &queue[cur_task];
    136.     cur_regs = &cur_fiber->regs;
    137.    
    138.     // если очередная нить еще не запускалась - инициализируем ее
    139.     if(cur_regs->ip == 0)
    140.         cur_regs->ip = cur_fiber->task;
    141.  
    142.     if(cur_regs->sp == 0){
    143.         cur_regs->stack_base = malloc(TASK_HEAP_SIZE);
    144.         cur_regs->sp = (unsigned)cur_regs->stack_base + TASK_HEAP_SIZE - sizeof(void*);
    145.         *(Context**)cur_regs->sp = cur_fiber->ctxt;
    146.         cur_regs->sp -= sizeof(void*);
    147.         *(void**)cur_regs->sp = (void*)&stop;
    148.     }
    149.    
    150.     _asm{          
    151.                 ; эта часть была изменена.
    152.                 ; предыдущая схема восстановления состояния нити
    153.                 ; была неработоспособна
    154.         mov ax,cur_regs
    155.        
    156.         mov sp,[ax + Registers.sp]
    157.         ; ...
    158.         mov bx,[ax + Registers.bx]
    159.  
    160.         push [ax + Registers.flags]
    161.         popf
    162.  
    163.         push [ax + Registers.ip]
    164.  
    165.         mov ax,[ax + Registers.ax]
    166.  
    167.         ret
    168.     }
    169.  
    170.     Exit:
    171. }
    172.  
    173.  
    174. int main(){
    175.   shedule();
    176.  
    177.   return 0;
    178. }
    вытесняющая многозадачность в самом простейшем случае отличается от кооперативной только тем, что шедулер в ней вызывается принудительно по таймеру (из прерывания таймера).

    ADD
    исправил ошибку в схеме восстановления состояния нити. снова ничего не проверял.
     
  15. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    NT в протектед моде выполняется. Какие есчо CreateThread() в реалмоде :lol:

    Таймерами рулите, либо делайте как в нт - для всех прерываний общий диспетчер, из него переключайте задачи.