Board.KolibriOS.org http://board.kolibrios.org/ |
|
TLS в Колибри http://board.kolibrios.org/viewtopic.php?f=1&t=1340 |
Page 1 of 1 |
Author: | Serge [ Sun Oct 18, 2009 3:07 pm ] |
Post subject: | TLS в Колибри |
Собираюсь сделать Thread-local storage aka TLS. Размер область 4Кб - на 1024 указателя. Данные будут адресоваться через селектор fs. Есть два варианта реализации. 1) добавление одного dword к заголовку программы и увеличение версии до '02'. 2) Функция ядра создающая tls. Этот способ мне нравится меньше потому что придётся учитывать вариант при котором сначала будут созданы потоки а потом tls. |
Author: | Mario [ Sun Oct 18, 2009 4:20 pm ] |
Post subject: | Re: TLS в Колибри |
Serge Первый вариант (MENUET02?, а может пора уже в заголовке использовать слово KOLIBRI, никакой совместимости с М32 и М64 ведь не предвидится?) более предпочтителен, разумеется если по прежнему приложения MENUET01 будут функционировать. А можно подробнее? 1) Правка и перекомпиляция приложения MENUET01 потребуется? 1) TLS как и обычные потоки смогут создавать окна в оконном стеке? 2) Какие-либо меры по синхронизации и контролю со стороны ядра, или все по прежнему остается на усмотрение программиста? 3) Реализация TLS наследует текущий способ подключения библиотек? |
Author: | Serge [ Sun Oct 18, 2009 5:22 pm ] |
Post subject: | Re: TLS в Колибри |
Mario Один dword на целую KOLIBRI не тянет. Он и не очень нужен. Вся фича предназначена исключительно для новых многопоточных приложений. На старые программы, dll и окна это никак не влияет. Вся синхронизация на совести программиста. Всё ошибки будут локальны для многопоточного приложения и не затронут другие приложения. Примерная реализация: для каждого потока ядро выделит одну страницу в адресном пространстве приложения и настроит дескриптор для доступа через селектор fs. При переключении потока база сегмента в gdt будет меняться а селектор останется тем же (разумеется ядро будет перегружать fs чтобы обновить теневые регистры). Функции tls_alloc tls_free в виде макросов будут выделять память в области tls. При желании программист сможет распределять эту память самостоятельно. |
Author: | Mario [ Sun Oct 18, 2009 5:54 pm ] |
Post subject: | Re: TLS в Колибри |
А как с распределением квантов времени? Время основного потока делится между всеми нитями присутствующими в данном адресном пространстве? |
Author: | Serge [ Sun Oct 18, 2009 6:30 pm ] |
Post subject: | Re: TLS в Колибри |
Mario А причём здесь планировщик ? Это же совсем другая тема. Место для хранения локальных для каждого потока данных. Например у тебя приложение запускает несколько потоков. Каждый поток создаёт своё окно. Где хранить данные потока и как потоку быстро получить к ним доступ ? C помощью tls. По ссылке в заголовке подробно расписано зачем и как используется. |
Author: | Gluk [ Sun Oct 18, 2009 8:57 pm ] |
Post subject: | Re: TLS в Колибри |
О! класс! |
Author: | Serge [ Tue Oct 20, 2009 12:40 am ] |
Post subject: | Re: TLS в Колибри |
Залил код на SVN. В многопоточных приложениях с заголовком MENUET02 каждый поток получает персональные 4 Кб fs:0x000 - fs:0xFFF. Лимит сегмента tls установлен в 0xFFF. Превышение вызовет исключение #gpf. Баги эмуляторов. Quemu игнорирует лимит сегмента. Превышение вызовет страничную ошибку. В VirtualBox tls не работает. Вероятно эмулятор не обновляет теневые регистры если селектор fs не изменился. |
Author: | Mario [ Tue Oct 20, 2009 12:58 am ] |
Post subject: | Re: TLS в Колибри |
Serge Я туплю, можешь ты для любителей на простом русском языке разжевать подробнее? Чем эта реализация отличается от функции 51? В чем преимущество? Потоки по прежнему запускаются функцией 51 или как? Эти 4 Кб они для хранения указателей на выделенные области памяти? У каждого потока теперь свои области не доступные и не разделяемые с другими потоками этого процесса могут быть? Я реально не соображу. Я честно читал ту статью. |
Author: | Serge [ Tue Oct 20, 2009 3:03 am ] |
Post subject: | Re: TLS в Колибри |
Quote: У каждого потока теперь свои области не доступные и не разделяемые с другими потоками этого процесса могут быть ? Совершенно верно. Если быть совсем точным у каждого потока теперь есть одна область не разделяемая с другими потоками.Quote: Чем эта реализация отличается от функции 51 ? В чем преимущество? Потоки по прежнему запускаются функцией 51 или как? Никаких изменений в системных вызовах нет. Потоки как и раньше создаются ф.51. Единственное отличие - у программ со старыми заголовками нет tls.Quote: Эти 4 Кб они для хранения указателей на выделенные области памяти? Обычно tls используется так. Но в Колибри каждый программист может распоряжаться tls по своему усмотрению. Например хранить там pid для быстрого доступа. Только не забывайте адресовать данные через селектор fs.
|
Author: | diamond [ Tue Oct 20, 2009 11:20 am ] |
Post subject: | Re: TLS в Колибри |
Mario wrote: Я туплю, можешь ты для любителей на простом русском языке разжевать подробнее? Попробую разжевать поподробнее. Если var1 - обычная глобальная переменная, то код типа Code: mov [var1], eax для всех потоков одного процесса будет обращаться к этой глобальной переменной. А код типа Code: mov [fs:0], eax будет в каждом потоке обращаться к своей собственной переменной. Например, если в начале деятельности каждого потока получать текущий PID и записывать его в [fs:0], то потом обращение к [fs:0] будет всегда возвращать PID текущего потока (очевидно, если таким же способом записывать PID в глобальную переменную, то она будет хранить последнее записанное туда значение). |
Author: | Mario [ Tue Oct 20, 2009 11:31 am ] |
Post subject: | Re: TLS в Колибри |
Все, теперь понял. Я думал что-то кардинально новое, оказалось только для удобного хранения данных. ИМХО то же самое можно делать и обычным способом разграничив логически области - программист ведь и сам знает что и где хранится и зачем. |
Author: | Serge [ Tue Oct 20, 2009 11:56 am ] |
Post subject: | Re: TLS в Колибри |
Quote: ИМХО то же самое можно делать и обычным способом разграничив логически области Это не всегда легко сделать. Особенно в библиотеках с неизвестным числом потоков и в сложных приложениях. Достаточно сравнить относительно простой Icon и многопоточный декодер х264.
|
Author: | diamond [ Tue Nov 24, 2009 11:58 pm ] |
Post subject: | Re: TLS в Колибри |
Serge wrote: В VirtualBox tls не работает. Вероятно эмулятор не обновляет теневые регистры если селектор fs не изменился. А можно с этого места поподробнее? Попробовал пару простых тестов, вроде под VirtualBox нормально сработали. |
Author: | Serge [ Wed Nov 25, 2009 9:50 am ] |
Post subject: | Re: TLS в Колибри |
Точнее не работало под Windows через fs. С gs всё работало правильно. В Linux не проверял. Надо проверить последнюю Win версию. |
Author: | Serge [ Wed Dec 02, 2009 7:03 pm ] | ||
Post subject: | Re: TLS в Колибри | ||
Сделал три функции для работы с tls. void __fastcall tls_init(void *mem); Настраивает данные для работы с tls. Обязательно вызывается один раз в родительском потоке. mem - указатель на массив в 136 байт void** tls_alloc(void); Выделяет переменную в массиве tls. Возвращаемое значение адрес переменной или 0 в случае неудачи. void __fastcall tls_free(void **p); Освобождает память в массиве tls. p - адрес переменной в массиве tls [fs:0] зарезервировано. Предложения по использованию принимаются. Дополнение. Функции рассчитаны на расширенный заголовок. Не забывайте добавлять dword для tls_data. Code: db 'MENUET02'
|
Page 1 of 1 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |