Board.KolibriOS.org

Official KolibriOS board
It is currently Thu Aug 22, 2019 9:11 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 15 posts ] 
Author Message
 Post subject: TLS в Колибри
PostPosted: Sun Oct 18, 2009 3:07 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Собираюсь сделать Thread-local storage aka TLS.

Размер область 4Кб - на 1024 указателя. Данные будут адресоваться через селектор fs. Есть два варианта реализации.

1) добавление одного dword к заголовку программы и увеличение версии до '02'.
2) Функция ядра создающая tls. Этот способ мне нравится меньше потому что придётся учитывать вариант при котором сначала будут созданы потоки а потом tls.


Top
   
PostPosted: Sun Oct 18, 2009 4:20 pm 
Serge
Первый вариант (MENUET02?, а может пора уже в заголовке использовать слово KOLIBRI, никакой совместимости с М32 и М64 ведь не предвидится?) более предпочтителен, разумеется если по прежнему приложения MENUET01 будут функционировать.

А можно подробнее?
1) Правка и перекомпиляция приложения MENUET01 потребуется?
1) TLS как и обычные потоки смогут создавать окна в оконном стеке?
2) Какие-либо меры по синхронизации и контролю со стороны ядра, или все по прежнему остается на усмотрение программиста?
3) Реализация TLS наследует текущий способ подключения библиотек?


Top
   
PostPosted: Sun Oct 18, 2009 5:22 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario

Один dword на целую KOLIBRI не тянет. Он и не очень нужен.

Вся фича предназначена исключительно для новых многопоточных приложений. На старые программы, dll и окна это никак не влияет. Вся синхронизация на совести программиста. Всё ошибки будут локальны для многопоточного приложения и не затронут другие приложения.

Примерная реализация:
для каждого потока ядро выделит одну страницу в адресном пространстве приложения и настроит дескриптор для доступа через селектор fs. При переключении потока база сегмента в gdt будет меняться а селектор останется тем же (разумеется ядро будет перегружать fs чтобы обновить теневые регистры). Функции tls_alloc tls_free в виде макросов будут выделять память в области tls. При желании программист сможет распределять эту память самостоятельно.


Top
   
PostPosted: Sun Oct 18, 2009 5:54 pm 
А как с распределением квантов времени? Время основного потока делится между всеми нитями присутствующими в данном адресном пространстве?


Top
   
PostPosted: Sun Oct 18, 2009 6:30 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario

А причём здесь планировщик ? Это же совсем другая тема. Место для хранения локальных для каждого потока данных. Например у тебя приложение запускает несколько потоков. Каждый поток создаёт своё окно. Где хранить данные потока и как потоку быстро получить к ним доступ ? C помощью tls. По ссылке в заголовке подробно расписано зачем и как используется.


Top
   
PostPosted: Sun Oct 18, 2009 8:57 pm 
Offline
User avatar

Joined: Mon Apr 16, 2007 6:38 pm
Posts: 1222
О! класс!

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Top
   
PostPosted: Tue Oct 20, 2009 12:40 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Залил код на SVN. В многопоточных приложениях с заголовком MENUET02 каждый поток получает персональные 4 Кб fs:0x000 - fs:0xFFF. Лимит сегмента tls установлен в 0xFFF. Превышение вызовет исключение #gpf.
Баги эмуляторов.
Quemu игнорирует лимит сегмента. Превышение вызовет страничную ошибку.
В VirtualBox tls не работает. Вероятно эмулятор не обновляет теневые регистры если селектор fs не изменился.


Top
   
PostPosted: Tue Oct 20, 2009 12:58 am 
Serge
Я туплю, можешь ты для любителей на простом русском языке разжевать подробнее?
Чем эта реализация отличается от функции 51? В чем преимущество? Потоки по прежнему запускаются функцией 51 или как? Эти 4 Кб они для хранения указателей на выделенные области памяти? У каждого потока теперь свои области не доступные и не разделяемые с другими потоками этого процесса могут быть? Я реально не соображу. Я честно читал ту статью.


Top
   
PostPosted: Tue Oct 20, 2009 3:03 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Quote:
У каждого потока теперь свои области не доступные и не разделяемые с другими потоками этого процесса могут быть ?
Совершенно верно. Если быть совсем точным у каждого потока теперь есть одна область не разделяемая с другими потоками.
Quote:
Чем эта реализация отличается от функции 51 ? В чем преимущество? Потоки по прежнему запускаются функцией 51 или как?
Никаких изменений в системных вызовах нет. Потоки как и раньше создаются ф.51. Единственное отличие - у программ со старыми заголовками нет tls.
Quote:
Эти 4 Кб они для хранения указателей на выделенные области памяти?
Обычно tls используется так. Но в Колибри каждый программист может распоряжаться tls по своему усмотрению. Например хранить там pid для быстрого доступа. Только не забывайте адресовать данные через селектор fs.


Top
   
PostPosted: Tue Oct 20, 2009 11:20 am 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Mario wrote:
Я туплю, можешь ты для любителей на простом русском языке разжевать подробнее?

Попробую разжевать поподробнее. Если var1 - обычная глобальная переменная, то код типа
Code:
mov [var1], eax
...
mov ecx, [var1]

для всех потоков одного процесса будет обращаться к этой глобальной переменной.
А код типа
Code:
mov [fs:0], eax
...
mov ecx, [fs:0]

будет в каждом потоке обращаться к своей собственной переменной. Например, если в начале деятельности каждого потока получать текущий PID и записывать его в [fs:0], то потом обращение к [fs:0] будет всегда возвращать PID текущего потока (очевидно, если таким же способом записывать PID в глобальную переменную, то она будет хранить последнее записанное туда значение).

_________________
Ушёл к умным, знающим и культурным людям.


Top
   
PostPosted: Tue Oct 20, 2009 11:31 am 
Все, теперь понял. Я думал что-то кардинально новое, оказалось только для удобного хранения данных. ИМХО то же самое можно делать и обычным способом разграничив логически области - программист ведь и сам знает что и где хранится и зачем.


Top
   
PostPosted: Tue Oct 20, 2009 11:56 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Quote:
ИМХО то же самое можно делать и обычным способом разграничив логически области
Это не всегда легко сделать. Особенно в библиотеках с неизвестным числом потоков и в сложных приложениях. Достаточно сравнить относительно простой Icon и многопоточный декодер х264.


Top
   
PostPosted: Tue Nov 24, 2009 11:58 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Serge wrote:
В VirtualBox tls не работает. Вероятно эмулятор не обновляет теневые регистры если селектор fs не изменился.

А можно с этого места поподробнее? Попробовал пару простых тестов, вроде под VirtualBox нормально сработали.

_________________
Ушёл к умным, знающим и культурным людям.


Top
   
PostPosted: Wed Nov 25, 2009 9:50 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Точнее не работало под Windows через fs. С gs всё работало правильно. В Linux не проверял. Надо проверить последнюю Win версию.


Top
   
PostPosted: Wed Dec 02, 2009 7:03 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Сделал три функции для работы с 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'
dd 1
dd start
dd i_end
dd mem
dd mem
dd 0       ; cmdline
dd 0       ; path
dd 0       ; tls data


Attachments:
tls.txt [1.66 KiB]
Downloaded 176 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 15 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited