LINUX.ORG.RU

Сообщения hlamotron

 

std::atomic — откуда он знает по выровненому адресу он лежит или нет?

Форум — Development

На x86 MOV атомарен для слова по выровненному адресу. Если не по выровненому, то надо LOCK MOV. Или я гоню? Если не гоню, то как будет выкручиваться std::atomic<uint32_t>, созданный по кривому невыровненному адресу?

 

hlamotron
()

Где в СПБ купить набор отвёрток для разбирания HDD?

Форум — Talks

Таких, которые не источатся очень долго. Что за металл должен быть? А лучше сразу производителя в студию и адрес лавки.

 

hlamotron
()

Зачем нужны IBM z System всякие?

Форум — Talks

В чём смысл кому-то покупать мейнфреймы IBM? Что нельзя запилить на куче обычных дешёвых серваков, что требует именно шкаф IBM?

 

hlamotron
()

Посоветуйте полочные 2-полосные «типа мониторные» колонки за 35 тыр.

Форум — Talks

Сабж.

Вот авторитет рекомендуэ: https://youtu.be/FtK1urikwAc

EVE CS207

Но это уже 50 тыр.

 

hlamotron
()

Посоветуйте бесплатное Android приложение «камера», которое пишет видео и имеет ручную регулировку фокуса с отключением автофокуса.

Форум — Talks

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

 

hlamotron
()

Алгоритм поиска сразу кучи подстрок в потоке.

Форум — Development

Понимаю как это реализуется - сначала по куче искомых строк строится конечный автомат с множеством одновременных состояний. И эти состояния потенциально сдвигаются «к успеху» на каждый входной символ или убиваются или заводятся новые «процессы прохода». Состояние (процесс), которое дошло до своего успеха сигнализирует о появлении слова (N шагов назад его начало).

Как называется это по-умному? Чё за алгоритм?

 

hlamotron
()

Объясните для тупых дебилов, как устроен LDAP на пальцах?

Форум — Talks

Я себе представляю, что это БД юзеров с хешами их паролей и всякими атрибутами, которые могут читать-записывать разные клиенты этого LDAP.

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

А расскажите как внутри LDAP устроен, какие атрибуты там бывают, как он физически хранит данные (это реляционные таблицы или файлы или K=V storage) и т.п.

 

hlamotron
()

Дам денег железячнику, который сделает мне LAN-мерялку температуры и углекислого газа.

Форум — Job

Хочется железку, которая умеет DHCP, а потом по http://addr/t возвращает температуру и по http://addr/oxy данные по воздуху - содержание углекислого газа. Главное требование - мегастабильность и светодиод, который мигает показывая, что процесс живой. Внутри желательно линукс, чтобы потом я мог обучиться у этого разраба и унаследовать разработку )

Перемещено leave из talks

 

hlamotron
()

Тупые вопросы по pure C.

Форум — Development

Вот есть функция типа clock_gettime() или open(). Я правильно понимаю, что это то, что называется «стандартная библиотека C» - libc или glibc, существующее на linux, windows, freebsd, но внутри юзающее платформ-специфик системные вызовы?

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

Перемещено mono из talks

 

hlamotron
()

CLOCKS_PER_SEC = 128. Это нормально?

Форум — Development

Собрал софтину clang-ом на FreeBSD-серваке. std::cout << CLOCKS_PER_SEC << "\n"; вывело 128. На десктопном линуксе было что-то типа 1000000. Как жить дальше?

Хочу получать число микросекунд, которые проведены в моём коде, а не вообще. Для этого набыдлокодил такой код: (double там появились после того, как integer-деление 128 на 1000000 стало давать 0. Короче, чё делать-то с этим 128? Как так может быть?

    double raw = clock();
    double result = raw / ( ((double)CLOCKS_PER_SEC) / ((double)1000000l));
    return result;

Спасибо.

 ,

hlamotron
()

Покритикуйте арендодателя выделенных серваков.

Форум — Talks

http://rackstore.ru/arenda-servera.html#fizser-tab

Покритикуйте.

Интересует такое:

2xIntel Xeon E5530 2.40 Ггц (4 ядра)	8Гб DDR3 ECC	2x1000Гб SATA	∞	3720 руб./мес.	
Может есть что за те же деньги, допустим, понадёжнее, типа там поуважаемее, поавторитетнее? Или сойдёт?

 

hlamotron
()

Сколько можно хранить системник без включения без вреда?

Форум — Talks

Пару лет назад собрал современный комп из хорошего железа, потом так сложилось, что отвёз его на склад и там он в плёнках завёрнутый лежит 2 года. Физически он может так сдохнуть, если вокруг сухо и перепадов температуры нет? Ну там конденсаторы от старости потекут, диски размагнитятся... Ну батарейка в биосе сядет, ясно дело. Или он быстрее морально устареет, чем помрёт? Т.е. лет через 5 он будет включаться после 7 лет лежания? Есть у кого опыт, типа уехал в америку, закрыл квартиру, приехал через 10 лет - что с техникой стало?

 

hlamotron
()

Как получилось connect() к самому себе по TCP/IP, если я не слушал порт? И при этом совпали SRC и DST порты. Странный ESTABLISHED. Что это?

Форум — Development

Короче, софтина «server» слушала 127.0.0.1:44112. На неё был коннект от софтины «client». По этому коннекту гонялось много данных. Потом софтину «server» убили, а на клиент пришёл дисконнект. На этот случай у «client» есть адский цикл, в котором он очень часто пытается коннектиться к «server» (connect()). Потом решили запустить «server» обратно. Но при попытке запустить «server» обнаружилось, что «server» не может забиндить себе свой порт 44112.

ERROR -1 == bind(), errno 98, "Address already in use"

И тут выяснилось, что существует странный коннект:

> netstat -natp | grep 44112
tcp        0      0 127.0.0.1:44112         127.0.0.1:44112         ESTABLISHED 10038/client    
К самому себе? «client» не слушал 44112. Или куда? Что это вообще такое? Этот коннект пропадает при убийстве «client».

Жесть какая-то: http://stackoverflow.com/questions/4021271/socket-getting-created-with-same-i...

 

hlamotron
()

А объясните разницу для дебилов между VPS и VDS? А просто железку в аренду дают?

Форум — Talks

Когда спрашиваю про аренду целого сервака, мне говорят «гугли VDS». Но это же виртуалка. А я хочу голую железяку для минимальных задержек и т.п.

Правильно я понимаю, что VDS - это когда на 24-ядерном серваке запускают 24 1-ядерные VDS и не больше, а VPS - это когда на 24-ядерном серваке толчётся 1000 VPS-ок с говносайтами и яростно толкаются? Или какая-то другая разница?

А нормальный-то дедик - это какое название услуги? Я не хочу виртуальный, например, ибо не хочу ни с кем толкаться. Как называется услуга, где я ни с кем не толкаюсь?

А если свою железку иметь и привозить хостеру на хостинг? А если моя железка устроит пожар, меня засудят и я попаду на бабло?

 

hlamotron
()

std::mutex пытались захватить целых 28 мс. Почему так долго?

Форум — Development

Первый поток захватывает мьютекс 512 раз подряд, потом спит. Второй просыпается по сигналам из сети 15K раз в секунду, пытается взять мьютекс. Обычно это взятие длится 6000...7000 наносек (6.5 мкс). Но измерялка может сказать иногда 18560639 наносек (18.5 мс!). Чем это объяснить?

Поменял mutex на самодельный CAS на базе std::atomic<uint32_t> - среднее время захвата такого мьютекса стало 66 наносек вместо 6500.

P.S. Убрал текстовые логи. Всё стало летать. Я дебил.

Движок:

struct Task {
    some_t *ptr;
    int code;
};

std::mutex mutex_;
std::queue< Task > queue_;

// для замера времени
inline uint64_t curr_nanosec_monotonic() {
    timespec ts;
    if ( 0 == clock_gettime(CLOCK_MONOTONIC, &ts) ) {
        return ts.tv_sec * 1000000000 + ts.tv_nsec;
    }
    return 0;
}

void put()
{
    std::lock_guard<std::mutex> lock(mutex_);
    
    // да, оно может пойти выделять память
    // хорошо бы это замерить, ага... щас пойду замерю.
    queue_.puch_back( Task() );
}

void get()
{
    auto t1 = curr_nanosec_monotonic();
    std::lock_guard<std::mutex> lock(mutex_);
    auto t2 = curr_nanosec_monotonic();
    
    PRINT("mutex get time ns " << (t2 - t1));
    queue_.pop();
}

Поток 1:

for(;;) {
    
    for( int i = 0; i < 512; ++i ) {
        put();
    }
    usleep( 1000 * 30 ); // 30 ms
}

Поток 2:

for(;;) {
    // ждём событие из сети: их частота 15K в секунду, но неравномерно, а разными пачками. Одно соединение, по которому валятся события. Событие - это TCP-пакет из 5 байт полезной нагрузки.
    epoll_wait(); 
    get();
}

 

hlamotron
()

А давно дескрипторы сокетов стали рандомно выделяться?

Форум — Development

Я всегда думал, что они от нуля вверх растут, но откуда-то взялся fd=228184560 сразу и, что характерно, работает. Это у меня бесконечный цикл скорее всего, создающий много сокетов, или это нормальное поведение линукса?

Вопрос снимается, я сам дебил. Выделяются от 0 в сторону увеличения нормально.

 

hlamotron
()

Сгенерить и скомпилить кусок C++ кода в рантайме. Какие есть фреймворки?

Форум — Development

Я слышал, llvm юзают в какой-то СУБД для омтимизации запросов - запрос компилится в бинарный код и т.п.

А у меня сейчас есть схема данных (ну типа перечисление типов и имён полей). Эти поля приходят в засериализованном виде. Вот хочется на лету скомпилить бинарный код десериализации потока заданного в конфиге формата. Поток жирный, не хочется кусок динамически типизируемой хрени в рантайме исполнять типа:

if(type[i] == INT) deserializeInt();
else if ( type[i] == STRING ) deserializeString();

а хочется скомпилить по конфигу такой код:

deserializeInt();
deserializeInt();
deserializeString();
deserializeString();
deserializeInt();
deserializeInt();

Не буду скорее всего я ничего такого сейчас делать, просто интересно насколько это дико. Щас времена такие, что многое дикое становится недиким...

 

hlamotron
()

Разбудить epoll_wait() раньше времени.

Форум — Development

Есть объект Connection, представляющий соединение. Соединение менеджится epoll-ом. На всякие события, происходит вызов Connection::eventRead() или там Connection::eventWrite().

Connection персистентный, т.е. существует вечно. Что будет если его дропнут - рассмотрено и обработано.

И вот из другого потока я хочу через этот Connection() отправить данные. Для этого в другом потоке надо запихнуть пачку данных в Connection() (в его буфер), перевести состояние Connection в «посылай запрос» и пнуть Connection::eventWrite() - тогда оно эту пачку упихает в дескриптор в один или несколько приёмов (уже по дальнейшим событиям от epoll). Ну там внутри Connection пачка данных ещё и оформляется по нужному протоколу, но это уже не суть, это происходит в момент запихивания.

Казалось бы, всё ништяк. Но я не хочу трогать Connection() из разных потоков. Можно добавить межпоточную синхронизацию в Connection(), но можно ли обойтись?

Хочется epoll-потоку сказать «проснись из epoll_wait() и сделай такую-то хрень». Он должен проснуться из epoll_wait() и найти специальный флаг «сделать хрень» во взведённом состоянии и хрень осуществить. В хрени будет подготовка Connection() к отправке данных и поток снова уйдёт в epoll_wait(). Короче, работа с Connection будет вестись всегда в одном потоке: epoll-потоке.

Как будить epoll_wait()? Ну например можно завести pipe, добавить его в этот же epoll и пихать туда байт 1, а реакцей на побудку epoll_wait() от дескриптора этого pipe и будет моя хрень. А какие ещё существуют способы? Какие есть механизмы IPC, выразимые в (int) дескрипторах и отслеживаемые epoll? И какой из всех 100 вариантов самый быстрый?

P.S.

Вариант с eventfd:

Постинг задачи

// можно и не атомик, а сырой поинтер
std::atomic<T_TASK*> task_;


// Этикетка метода: !!! WARNING !!!
// Запрещено постить 2 раза подряд, очереди нет!
// Запостил - жди исполнения, иначе жопа.
bool exec_task(T_TASK *_task) {
    task_ = _task;

    LOG_PURE("... ... post task");

    uint64_t add = 1;
    ::write(fd_event_, &add, sizeof(uint64_t));

    return true;
}

Исполнение задачи:

// цикл разгребания пачки событий от epoll
...
if ( events[i].data.fd == fd_event_ ) {
    if (events[i].events & EPOLLIN) {
        uint64_t val;
        // TODO: check read() return value.
        // TODO: check val's value.
	read(fd_event_, &val, sizeof(uint64_t));

	(*task_)();
    }
    continue;
}
...

 

hlamotron
()

Посоветуйте хостинг: аренда целой железки или хостинг своей.

Форум — Talks

Нужна «аренда железки» - пару ядер, 4 ГиБ ОЗУ, 20 гигов HDD (не SDD), безлимитный не толстый трафик. Главное - стабильно низкий пинг до Москвы и прочая стабильность и низколатентность — для игрового сервера. Т.е. не виртуалка, а «сырая» железка с интернетом. Железка должна быть с каким-нибудь дебианом сразу и чтобы в случае чего можно было попросить хостера накатить его заново, а не ездить в серверную.

Железка нужна слабее, чем обычные предложения на рынке — т.е. 32 гига ОЗУ, два проца и большой SSD - не надо.

Посоветуйте контору и название услуги. Желательно в Питере, но можно в Москве.

Также скажите:
- как называется такая услуга в принципе
- дешевле купить себе сервак и привозить его в аренду или найти такой сервак готовый у хостера? Минусы у собственного сервака?
- на что ещё обратить внимание (всякие там Tier и т.п.), чтобы не лохануться полностью?

 

hlamotron
()

GDB не прерывает софтину CTRL+C, а кидает ей SIGTERM.

Форум — Development
(gdb) handle SIGTERM ignore
Signal        Stop	Print	Pass to program	Description
SIGTERM       Yes	Yes	No		Terminated

Несмотря на что по CTRL+C под gdb софтина пишет:

...SIGTERM recieved, exiting...

И идёт на выход. Никогда такого не было и вот опять! Что делать?

P.S.

GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1

 

hlamotron
()

RSS подписка на новые темы