Size: a a a

2020 November 24

p

pragus in SPb Python
Sergio Keler
aio - в итоге заканчивается на аппаратной фиче. Просто она давно везде есть.
select появился тогда, когда стало возможно не ждать окончание ввода-вывода. В 1983 он появился в языке C. До того аналоги мб были на других платформах, докуда С не добрался.
сам селект не просто костыль, а древний костыль. Можно вместо него использовать современные аналоги или прямо системные вызовы. суть от этого не меняется.
так а о какой аппаратной фиче речь?
источник

nx

neumond x in SPb Python
А почему select это костыль? Ну не было сначала осознания что надо сначала залить все 10к сокетов в ядро, а потом бахнуть epoll без параметров, вот и вливали весь список сокетов на каждый вызов select. Раньше были другие реалии, и до epoll просто не доросли. Это как с трёхмерной графикой, сначала OpenGL стал революцией, а теперь надо вулкан, потому что опенгл прибит гвоздями к определённому классу задач и делает много чего такого чего не очень нужно, точнее нужно но только ради этого самого опенгла. Аналогичная история, поняли что надо чуть иначе и запилили вулкан. Как во времена select никто не предвидел нужность epoll, так и во времена опенгл никто не предвидел вулкан. То же самое с железом, сейчас ни одна микросхема там не работает синхронно, есть входной поток, есть выходной, и они не синхронизируются для большого thoroughput, как бы обходя стороной большой latency.
источник

nx

neumond x in SPb Python
Кто ж мог подумать в эпоху 6502 и Z80 что запросы в память нужно наваливать не дожидаясь ответа? Как-то сложно, глупо и неоправданно. И да, для 8 битных процов того времени это было не нужно. А для последующих стало нужно.
источник

nx

neumond x in SPb Python
Ну то есть костыль это скорее что-то такое, что имеет правильную альтернативу. Знаешь как правильно, понимаешь что слишком дорого, и возможно оно и не нужно будет, делаешь костыль. Не уверен что select сделали кое-как на коленке, на выброс, имея в загашнике правильный вариант.
источник

p

pragus in SPb Python
neumond x
А почему select это костыль? Ну не было сначала осознания что надо сначала залить все 10к сокетов в ядро, а потом бахнуть epoll без параметров, вот и вливали весь список сокетов на каждый вызов select. Раньше были другие реалии, и до epoll просто не доросли. Это как с трёхмерной графикой, сначала OpenGL стал революцией, а теперь надо вулкан, потому что опенгл прибит гвоздями к определённому классу задач и делает много чего такого чего не очень нужно, точнее нужно но только ради этого самого опенгла. Аналогичная история, поняли что надо чуть иначе и запилили вулкан. Как во времена select никто не предвидел нужность epoll, так и во времена опенгл никто не предвидел вулкан. То же самое с железом, сейчас ни одна микросхема там не работает синхронно, есть входной поток, есть выходной, и они не синхронизируются для большого thoroughput, как бы обходя стороной большой latency.
Костыль с точки зрения реализации. Номера файловых дескрипторов процессу выдаются простым инкрементом.
У select FD_SET - это просто массив, в котором индекс - это номер fd. Что может пойти не так?

А достаточно появится номеру fd > 1023 и будет выход за границы массива и последующий сегфолт.
источник

SK

Sergio Keler in SPb Python
pragus
так а о какой аппаратной фиче речь?
нуу... например DMA.
источник

SK

Sergio Keler in SPb Python
pragus
Костыль с точки зрения реализации. Номера файловых дескрипторов процессу выдаются простым инкрементом.
У select FD_SET - это просто массив, в котором индекс - это номер fd. Что может пойти не так?

А достаточно появится номеру fd > 1023 и будет выход за границы массива и последующий сегфолт.
не < 1023, а FD_SETSIZE и проверить на это можно.
опять же, существуют посиксные оси, которые... не линух! и там слегка иначе.
на PDP-11 помнится была битовая карта, хотя и ограниченного размера. на унихе ещё ладно, но в не особо посиксном rsx-11 там с дексрипторами был туман и они эмулировалист исполняющей системой
источник

p

pragus in SPb Python
Sergio Keler
не < 1023, а FD_SETSIZE и проверить на это можно.
опять же, существуют посиксные оси, которые... не линух! и там слегка иначе.
на PDP-11 помнится была битовая карта, хотя и ограниченного размера. на унихе ещё ладно, но в не особо посиксном rsx-11 там с дексрипторами был туман и они эмулировалист исполняющей системой
ну вот на linux оно hardcoded в 1024, а других ОС у нас нет :)
источник

p

pragus in SPb Python
Sergio Keler
нуу... например DMA.
Я думал о нём, но нет. I/o multiplexing чисто софтовая вещь и аффектит только процессы в юзерленде, а dma - он управляется ядром.
источник

SK

Sergio Keler in SPb Python
pragus
Я думал о нём, но нет. I/o multiplexing чисто софтовая вещь и аффектит только процессы в юзерленде, а dma - он управляется ядром.
ядро конфигурит дму типа "давай" и продолжает что-то делать, например, передаёт управление в другое приложение или блокирует текущее или не блокирует и просто передаёт туда код "ничего нет", а когда дма дёргает ядро "готово, шеу", на следующий вызов селекта выставляет биты соответствующих дескрипторов.
дма работает без процессора, самостоятельно. в это её прелесть и почему это мега фича в аппаратуре.
источник

SK

Sergio Keler in SPb Python
Рома, а ты в ардуину не играл? Лучше в stm32 хотя бы, там дма во всей красе есть, а многозадачности и ОС нет.
источник

p

pragus in SPb Python
Sergio Keler
ядро конфигурит дму типа "давай" и продолжает что-то делать, например, передаёт управление в другое приложение или блокирует текущее или не блокирует и просто передаёт туда код "ничего нет", а когда дма дёргает ядро "готово, шеу", на следующий вызов селекта выставляет биты соответствующих дескрипторов.
дма работает без процессора, самостоятельно. в это её прелесть и почему это мега фича в аппаратуре.
При всей полезности dma, более реалистичной выглядит версия про bsd sockets, например :)

stm32 у меня есть в 2 видах: оригинальный и клон из страны короновируса
источник

SK

Sergio Keler in SPb Python
вот! хорошая вещь!
источник

SK

Sergio Keler in SPb Python
pragus
При всей полезности dma, более реалистичной выглядит версия про bsd sockets, например :)

stm32 у меня есть в 2 видах: оригинальный и клон из страны короновируса
Bsd sockets отношение к аппаратуре имеет?
источник
2020 November 25

b

bitbot in SPb Python
А что митапа не будет в этом месяце??
источник

p

pragus in SPb Python
Sergio Keler
Bsd sockets отношение к аппаратуре имеет?
вообще никакого, кстати
источник

nx

neumond x in SPb Python
А как сегфолт случается в сисколле? Может это косяк libc?
источник

nx

neumond x in SPb Python
> The Linux kernel imposes no fixed limit, but the glibc implementation makes fd_set a fixed-size type, with FD_SETSIZE defined as 1024, and the FD_*() macros operating according to that limit.  To monitor file descriptors greater than 1023, use poll(2) or epoll(7) instead.
источник

nx

neumond x in SPb Python
> An fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET() with a value of fd that is negative or is equal to or larger than FD_SETSIZE will result in undefined behavior.
Причём это вообще макросы из libc, которые полностью в юзерспейсе работают.
источник

nx

neumond x in SPb Python
Говорят лимит ввели нарочно чтобы пересадить всех на epoll/kqueue.
> Root Cause: It's the responsibility of application vendors to make sure alternatives are available in their code (such as using epoll/libevents) to select() what's limited by the FD_SETSIZE in order to make their application more flexible and robust.

При этом реализация представляет из себя массив бит, в который всё пишется по индексу, который и есть номер fd
https://github.com/bminor/glibc/blob/5f72f9800b250410cad3abfeeb09469ef12b2438/bits/select.h#L25-L37
https://github.com/bminor/glibc/blob/5f72f9800b250410cad3abfeeb09469ef12b2438/misc/sys/select.h#L51-L56

Я кажется понял где он сломан. Реально, достаточно номеру fd выйти за пределы положенного, как всё свалится. Я-то думал там поиск и вставки с линейной сложностью.

> select() call can only listen 1024 file descriptor at the same time and all of the file descriptor number must be less than 1024

Треш какой, хех.
источник