Реализация Сетей Петри (потоки)

Тема в разделе "WASM.UNIX", создана пользователем zukalo, 5 окт 2009.

  1. zukalo

    zukalo New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2008
    Сообщения:
    20
    Собираюсь писать защиту на основе сетей Петри под linux (as). Возникла проблема, как создавать и главное как обеспечивать взаимодействие между потоками, которые осуществляют запуск переходов. Glibc функции не хочется юзать по идейным соображениям, так что pthread отпадает, а IPC-механизмы это как-то уже слишком.
    Как можно обеспечить многопоточность используя только сисколы, причём потоки должны уметь получать/изменять информацию о позициях в главном процессе? clone не подходит под вышеперечисленные требования.
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Неохота вникать в то, что такое сети Петри.
    Два вопроса:
    Что за позиции?
    Можно ещё раз перечислить вышеперечисленные требования, под которые не подходит clone? clone не имеет никакого отношения к glibc и pthreads, и не является IPC механизмом. Какие из требований я пропустил?

    Вообще есть два способа создать задачу -- fork и clone. Если не устраивает clone, то остаётся fork. Используя же fork, и желая взаимодействия между процессами не удастся обойтись без IPC. По-определению не удастся, ибо IPC -- это Inter-Process Communication во всех его проявлениях, начиная с пайпа и заканчивая ptrace. Вопрос какого типа IPC использовать. Но это уже зависит от того, какого типа взаимодействие нужно.
     
  3. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    clone это ничто иное как системный вызов как и fork
    более того fork часный случай от clone

    так же есть системный вызов pipe для обмена между двумя процессами

    впринцие только этих 2х функций достаточно для реализации процессов и взаимодействия между ними
     
  4. zukalo

    zukalo New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2008
    Сообщения:
    20
    Я в курсе что такое IPC, fork, pthread.
    Вот про Clone не дочитал немного, что у него есть флаг CLONE_VM для разделения памяти с парентом. В манах написано, что надо для стека call'a нужно выделить память malloc'ом.
    А будет ли работать, если сделать что то вроде sub esp, <n> и передать в clone esp как адрес? И так для каждого потока. Просто потом всё это дело прийдётся восстанавливать.
     
  5. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    можно.
    например так

    выделяем память
    Код (Text):
    1. movl %esp,%eax
    2. subl $n,%esp
    3. push %esp
    и для освобождаем память
    Код (Text):
    1. popl %esp
    можео выделить память из .bss
    Код (Text):
    1. .section .bss
    2. ptr:
    3.         .lcomm buff, 32
    а самый правильный способ это выделить память через системный вызов brk или mmap
     
  6. xssww2

    xssww2 New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    84
    _MemoryAllocate:
    ;Allocate a memory block
    ;Input:
    ; eax - the size of memory for the allocation
    ;Ouput:
    ; eax - the handle of an allocated block of memory
    ; eax = 0ffffffffh - a error

    ;Save registers
    sub esp,(4+4*10)
    mov [esp+4*10],ebx

    ;Allocate a memory block
    mov dword [esp],0
    mov dword [esp+4],eax
    mov dword [esp+8],3
    mov dword [esp+0ch],21h
    mov ebx,esp
    mov dword [esp+10h],0ffffffffh
    mov dword [esp+14h],0
    mov eax,5ah
    int 80h

    ;Process a error
    mov ebx,eax
    and ebx,0ffffff00h
    cmp ebx,0ffffff00h
    cmove eax,[esp+10h]

    ;Restore registers
    mov ebx,[esp+4*10]
    add esp,(4+4*10)
    ret

    _MemoryFree:
    ;Free a memory block
    ;Input:
    ; eax - a handle of an allocated block of memory to free
    ; [esp+4] - the size of memory

    ;Save registers
    sub esp,4*2
    mov [esp],ebx
    mov [esp+4],ecx
    mov ebx,eax

    ;Free a memory block
    mov ecx,[esp+4+4*2] ;Size of memory to free
    mov eax,5bh
    int 80h

    ;Restore registers
    mov ebx,[esp]
    mov ecx,[esp+4]
    add esp,4*2
    ret 4