Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс авг 19, 2018 10:56 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 6 сообщений ] 
Автор Сообщение
 Заголовок сообщения: функции 68.12 и 77.2
СообщениеДобавлено: Чт фев 08, 2018 1:19 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 117
Есть небольшие вопросы по двум системным функциям. Возможно, ответы на них следует отразить в документации.

f68.12 (mem_alloc)

Гарантируется ли обнуление выделенного блока памяти?

---------------------------------------

f77.2 (futex_wait)

Для входа в критическую секцию, поток должен выполнить два действия:
1) вызвать функцию f77.2
2) изменить значение контрольной переменной, чтобы закрыть вход для других потоков.

Может ли между первым и вторым действием произойти переключение задачи? Если да, то тогда перед вызовом f77.2 надо вызвать f68.1 (switch_task), чтобы получить новый квант времени, которого (вроде бы) гарантированно хватит для выполнения обоих действий. Но может быть функция f77.2 автоматически выделяет новый квант?


Вернуться к началу
 Заголовок сообщения: Re: функции 68.12 и 77.2
СообщениеДобавлено: Чт фев 08, 2018 7:00 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3949
akron1 писал(а):
Гарантируется ли обнуление выделенного блока памяти?
Да.
akron1 писал(а):
f77.2 (futex_wait)
Для входа в критическую секцию, поток должен выполнить два действия:
1) вызвать функцию f77.2
2) изменить значение контрольной переменной, чтобы закрыть вход для других потоков.

Не понятен пункт 2. Фьютекс/мьютекс сам по себе критическая секция, если его правильно использовать. Это не маскирование прерываний или переключения задач. Если один поток получил блокировку, остальные будут ждать, пока фьютекс не разблокируют.
akron1 писал(а):
Может ли между первым и вторым действием произойти переключение задачи? Если да, то тогда перед вызовом f77.2 надо вызвать f68.1 (switch_task), чтобы получить новый квант времени, которого (вроде бы) гарантированно хватит для выполнения обоих действий.
Но может быть функция f77.2 автоматически выделяет новый квант?
На мой взгляд вызывать switch_task перед взятием фьютекса сомнительная затея. В ядре есть потоки с большим приоритетом, поэтому нельзя гарантировать, что поток получит полный квант даже после switch_task().


Вернуться к началу
 Заголовок сообщения: Re: функции 68.12 и 77.2
СообщениеДобавлено: Чт фев 08, 2018 8:20 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 117
Serge писал(а):
Не понятен пункт 2. Фьютекс/мьютекс сам по себе критическая секция, если его правильно использовать. Это не маскирование прерываний или переключения задач. Если один поток получил блокировку, остальные будут ждать, пока фьютекс не разблокируют.


Я так использую. Может быть это в чем-то неправильно, но работает.
Псевдокод:
Код:
v = 0 //переменная -- контрольное значение фьютекса
futex = futex_create( adr(v) )


futex_wait(futex, 1, t) //если v == 1, поток ждет t сотых долей секунды, иначе выполнение продолжается
v = 1 //закрыть вход другим потокам

(* критическая секция *)

v = 0 //открыть вход (v != 1)
futex_wake(futex, 1) // разбудить не более одного потока


Если после futex_wait(futex, 1, t) написать v = 0, то следующий поток ждать не будет. То есть надо вызвать futex_wait и сразу после этого изменить значение контрольной переменной фьютекса.


Вернуться к началу
 Заголовок сообщения: Re: функции 68.12 и 77.2
СообщениеДобавлено: Чт фев 08, 2018 4:57 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3949
Код:
futex_wait(futex, 1, t) //если v == 1, поток ждет t сотых долей секунды, иначе выполнение продолжается
v = 1 //закрыть вход другим потокам
Это неправильно. У тебя между futex_wait(futex, 1, t) и v = 1 возникает race conditions. Вот код из futex_wait
Код:
        mov     ecx, [ebp+FUTEX.pointer]
        mov     eax, edx
        lock cmpxchg [ecx], edx
        je      .wait_slow

        mov     [esp+SYSCALL_STACK._eax], -2
        ret       
ecx - указатель на v, edx - контрольное значение.
cmpxchg сравнивает EAX с [ecx]. если равно, устанавливает ZF и записывает edx в [ecx]. Иначе сбрасывает ZF и загружает [ecx] в eax.
В результате у тебя на входе v = [ecx] = 0; eax = edx = 1. cmpxchg сравнивает [ecx] = 0 c eax=1, сбрасывает zf и грузит [ecx] в eax. Значение v при этом не меняется.

Вот код из SDK
Код:
static inline void mutex_lock(mutex_t *mutex)
{
    int tmp;

    if( __sync_fetch_and_add(&mutex->lock, 1) == 0)
        return;

    while (exchange_acquire (&mutex->lock, 2) != 0)
    {
        __asm__ volatile(
        "int $0x40\t\n"
        :"=a"(tmp)
        :"a"(77),"b"(FUTEX_WAIT),
        "c"(mutex->handle),"d"(2),"S"(0));
   }
};

static inline void mutex_unlock(mutex_t *mutex)
{
    int prev;

    prev = exchange_release (&mutex->lock, 0);

    if (prev != 1)
    {
        __asm__ volatile(
        "int $0x40\t"
        :"=a"(prev)
        :"a"(77),"b"(FUTEX_WAKE),
        "c"(mutex->handle),"d"(1));
    };
};
__sync_fetch_and_add это xadd, а exchange_acquire и exchange_release просто xchg


Вернуться к началу
 Заголовок сообщения: Re: функции 68.12 и 77.2
СообщениеДобавлено: Чт фев 08, 2018 5:41 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1611
futex - это системный вызов, который не стоит вызывать непосредственно никогда. Вообще никогда. Правильный способ его использования - найти нужный примитив синхронизации в какой-нибудь хорошо протестированной линуксовой библиотеке и взять его оттуда. Мьютекс из http://websvn.kolibrios.org/filedetails ... 2Fsync.inc , например, спёрт из glibc.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: функции 68.12 и 77.2
СообщениеДобавлено: Пт фев 09, 2018 11:41 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 117
Всем спасибо, теперь мне всё понятно.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 6 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB