реклама на сайте
подробности

 
 
> Система, управляемая событиями и SST(super-simple tasker), Выделено из "ООП. Классы и динамические объекты"
brag
сообщение Sep 7 2016, 09:07
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Недавно я начал пользоваться динамической памятью. Раньше пользовался только статикой, то есть placement new. Со статикой сложно работать с такими шаблонами, как фабрика обьектов, временные задачи итд.
Программирую в основном под cortex-m3/m4
Код реализации аллокатора вышел довольно простым и быстрым, критически секции есть, но очень короткие(там прочитать/записать пару байт).
При чем я не использую этих всяких монстров под названием RTOS, у меня свой простейший асинхронный планировщик задач, занимает строк 300 кода с комментариями(погуглите запрос "super simple tasker", поймете что это).
В купе с динамическим аллокатором, variable element-size queue, новыми фишками C++ (шаблоны, лямбда-функции, auto) получается очень простой, безопасный и мощный фреймворк.
Вспоминаю работу с классическими Thread-ами(с ихними стеками - куча кода было написано для анализа программ на предмет нужного обьема стека, и теперь эта куча кода отправлена на мусорку) со всеми этими тяжеленными мютексами, семафорами, вечными циклами как страшный сон.

Если кому интересно - расскажу и покажу как это все работает.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
brag
сообщение Sep 8 2016, 19:21
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
А мы уверены, что все клиенты параллельно качают файл размером гигабайт с сервера? А некоторые при этом ждут чего-то иногда?

Ну так сервак на JS показывает количество коннектов в секунду - это количество скачанных файлов в секунду. Правда не гиговых, а нормальных. Можете сами проверить на гиговом, если есть желание.
И однопоточный JS клиент может скачать 10000 файлов в секунду, при этом система нормально работает, памяти полно свободной, торохтит только диск и нельзя создать сокет - закончились лимиты ядра. А многопоточный на С смог скачать только 600-700 файлов на том же компе - то есть в 16 раз меньше. При этом убил всю систему, остановить его можно только кнопкой reset, мышь и клава да и вся система зависает намертво.

Делаю аналогичный многопоточный сервер, посмотрим что сможет выдержать он.

Цитата
Не думаю, что стоит изобретать велосипед на Си. Достаточно испробовать что-то серийное и прверенное.

Тут даже сравнивать нечего. Сервак на NodeJS убивает любой другой многопоточный, а тормознутого Апача десять раз убивает. Он может только конкурировать с серваком на Go, при одних задачах лучше NodeJS, при других - Go. Я работал и на том и на другом.

И так, осилил сервак, отловил баги, даже отладчик пришлось запускать sad.gif Как просто на С наделать ошибок..
С серваком не все так плохо, как я думал. Хоть он потребляет и больше ресурсов(где-то на 100мб больше памяти, чем JS), чем такой сервак на JS, но и способен обрабатывать порядка 7000 коннектов(против 10-11 тыс JS) в секунду и примерно столько же сокетов, сколько и JS.

Думал почему, дебажил, и наконец понял - Коннекты принимаются в одном потоке - в самом низу функции main() в вечном цикле accept() блокирует и принимает коннекты, а их обработка происходит уже в порожденных потоках. Порожденный поток успевает быстро отдать файл и выходит, получается, одновременно создано потоков примерно штук 40.
У клиента же все по другому - коннекты происходят в потоках и там на каждый коннект создается 1 пток.

Но это простая ситуация - отдача файла, который ОС положила в кеш. Попробую на днях услижнить задачу, чтобы ос отдавала явные данные, например рандом, чтобы потоку нужно было потрудиться/подождать. Думаю тогда сервак на C станет таким же тормознутым, как и клиент и сожрет всю оперативку, в то время как JS будет запросто работать.

По количеству строк JS тоже ессно выиграл 67 строк в JS против 151 на C. Асинхронное неблокирующее программирование проще и эффективное, чем многопоточное блокирующее.
Интересно такой же многопоточный сервак реализовать на чем-то аналогичном динамическом, типа Java. Думаю он загнется при сотне клиентов. А то силы не равны получаются, быстрый С против медленного JS, но последний все равно выиграл из за своей асинхронной натуры.
CODE
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#include <netdb.h>
#include <netinet/in.h>

#include <unistd.h>
#include <pthread.h>

long n_connections = 0;
long total_connections = 0;
pthread_mutex_t g_mutex;

void* Thread_connection(void* fd1){
long sock = (long)fd1;

// work with shared vars
pthread_mutex_lock(&g_mutex);
n_connections++;
total_connections++;
pthread_mutex_unlock(&g_mutex);
// ------------------

FILE* fd = fopen("file.txt","r");
if(fd==0){
perror("fopen");
goto exit1;
}

// read and send file - blocking!
char buffer[4096];
while(1){
// read chunk
size_t r = fread(buffer, 1, sizeof(buffer), fd);
if(r<=0)break;
// buffer[r]=0;
//printf("%s\n", buffer);
// send
r = send(sock, buffer, r, 0);
if(r<=0){
perror("Thread_connection: socket error");
break;
}
};
fclose(fd);

exit1:
// fuck...
pthread_mutex_lock(&g_mutex);
n_connections--;
pthread_mutex_unlock(&g_mutex);
// ------

close(sock);
pthread_exit(NULL);
return 0;
}

void* Thread_watcher(void* thr){
double tput = 0;
const double a = 0.9;
long prev_connections = 0;

while(1){
// work with shared vars
pthread_mutex_lock(&g_mutex);
long tcon = total_connections;
total_connections = 0;
prev_connections = n_connections;
pthread_mutex_unlock(&g_mutex);
// ----------------

// low-pass filter
tput = tput*(1-a) + tcon*a;

if(tput>=1){
printf("now approx %ld clients are connected. Tput: %.1f conn/s\n",
prev_connections, tput);
}

sleep(1);
}
return 0;
}


void startWatcher(){
// create watcher thread
pthread_t thr;
int rc = pthread_create(&thr, 0, Thread_watcher, (void*)0);
if(rc){
printf("startWatcher ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}

int main(){
int port = 5555;

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}

// Initialize socket structure
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));


serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);

// Now bind the host address using bind() call.
if(bind(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}

// listen and accept connections in endless loop
listen(sockfd, 10000);

// create fucking mutexes
pthread_mutex_init(&g_mutex, NULL);
startWatcher();

// accept connections in endless loop
struct sockaddr_in cli_addr;
unsigned clilen = sizeof(cli_addr);
while(1){
// Accept actual connection from the client - blocking
long newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if(newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}

// create thread for each connection
pthread_t thr;
int rc = pthread_create(&thr, 0, Thread_connection, (void*)newsockfd);
if(rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
pthread_detach(thr);
}

return 0;
}


Цитата
Жаль, что памяти таки JS потребовалось больше даже в сравнении с апачем ))))

У меня node сожрал 160 метров. А у них 1.5 гига. Что-то у них не то с тестами. Будет время я сам прогоню апач и node, сравним с результатами, доступными в интернете.
Но все равно Node у них показал производительность в 6 раз больше апача.
Ну пусть PHP будет, так Js тоже полностью динамический и тяжелый язык, такой же тяжелый, как и PHP. Только PHP синхронный блокирующий, а Node асинхронный неблокирующий - на этом принципе и построен SST.

А если я запущу асинхронный сервак помимо сокетов линукса (есть для этого готовые библиотеки), то он уделает любой другой раз в 100-200 и даже в 1000. Посмотрите сканер портов Mass-scan - он способен "расплавить" любую сетевую карту - работает помимо сокетов, всего 2 потока(ридер и райтер) и полностью асинхронный https://github.com/robertdavidgraham/masscan

Та даже NodeJS на моем ноуте обгоняет сам линукс - у node еще куча запасов, а linux уже не тянет..
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- brag   Система, управляемая событиями и SST(super-simple tasker)   Sep 7 2016, 09:07
- - sigmaN   Ну так извините меня, классические, как вы говорит...   Sep 7 2016, 10:07
- - Serhiy_UA   Цитата(brag @ Sep 7 2016, 12:07) Не очень...   Sep 7 2016, 10:24
- - brag   ЦитатаНапример если у вас хотя-бы одна из задач бу...   Sep 7 2016, 11:56
|- - Serhiy_UA   brag, Спасибо за пояснения!   Sep 7 2016, 12:16
|- - arhiv6   Цитата(brag)Если кому интересно - расскажу и покаж...   Sep 7 2016, 12:18
- - AHTOXA   Цитата(brag @ Sep 7 2016, 14:07) Если ком...   Sep 7 2016, 12:17
- - Kabdim   Цитата(brag @ Sep 7 2016, 12:07) Если ком...   Sep 7 2016, 12:36
- - brag   ЦитатаПрисоединюсь к интересующимся. Если я правил...   Sep 7 2016, 12:47
|- - AlexandrY   Цитата(brag @ Sep 7 2016, 15:47) Я конечн...   Sep 7 2016, 13:48
- - brag   ЦитатаВытесняющая асинхронная многозадачность сейч...   Sep 7 2016, 13:57
- - sigmaN   Очень интересно. Видимо этот SST прошел мимо меня....   Sep 7 2016, 15:50
- - brag   Все, что мы теряем отказываясь от классических тре...   Sep 7 2016, 16:20
- - DASM   Что то не пойму, речь о кооперативной "оси...   Sep 7 2016, 16:43
- - sigmaN   Никто же не мешает организовать обмен ивентами и в...   Sep 7 2016, 17:04
- - brag   ЦитатаЧто то не пойму, речь о кооперативной ...   Sep 7 2016, 17:14
- - sigmaN   Наврено правильно сравнивать реализацию вещей обес...   Sep 7 2016, 18:37
|- - arhiv6   Цитата(DASM)Что то не пойму, речь о кооперативной ...   Sep 7 2016, 19:01
- - DASM   Спасибо, интересно, почитал.   Sep 7 2016, 19:37
- - brag   ЦитатаВ то время как в классической модели я могу ...   Sep 7 2016, 20:04
- - DASM   Ну я бы не стал столь восторженно писать, не могут...   Sep 7 2016, 20:43
|- - brag   Цитата(DASM @ Sep 7 2016, 23:43) Ну я бы ...   Sep 7 2016, 21:32
- - sigmaN   ЦитатаДа и PC мир уже давно переходит на event-ы.....   Sep 8 2016, 00:18
- - DASM   а что такое "императивный код"? https://...   Sep 8 2016, 00:52
- - arhiv6   Императивное программирование   Sep 8 2016, 02:23
- - DASM   "В этом случае программа представляет собой ф...   Sep 8 2016, 02:37
- - ViKo   Допустим, надо стереть flash-память, что длится д...   Sep 8 2016, 04:35
- - sigmaN   Ну почему же обязательно создавать задачу. Стирани...   Sep 8 2016, 07:03
- - ViKo   Ветвление, это что? После стирания нужно дальше р...   Sep 8 2016, 07:17
- - brag   ЦитатаНу давайте не будем путать всё в кучу. Это р...   Sep 8 2016, 07:27
- - sigmaN   ЦитатаНет, физически там один поток и один стек. Х...   Sep 8 2016, 07:31
|- - brag   Цитата(sigmaN @ Sep 8 2016, 10:31) Хотело...   Sep 8 2016, 07:38
- - ViKo   Слезть с шины, и что делать? Висеть в задаче без ...   Sep 8 2016, 07:39
|- - brag   Цитата(ViKo @ Sep 8 2016, 10:39) Слезть с...   Sep 8 2016, 08:16
- - 501-q   Приветствую! Модель SST хорошо работает до то...   Sep 8 2016, 07:55
- - sigmaN   ЦитатаКонечо. При чем написанного на языке Javascr...   Sep 8 2016, 08:19
- - brag   ЦитатаПриветствую! Модель SST хорошо работает...   Sep 8 2016, 08:25
- - sigmaN   Прям с удовольствием потестирую ))))) Особенно со...   Sep 8 2016, 08:33
- - DASM   На самом деле мы наверное действительно отстали от...   Sep 8 2016, 08:37
- - brag   ЦитатаВсе же Javascript для эмбеддед старого добро...   Sep 8 2016, 08:45
- - arhiv6   brag, на сколько я понял, в обычном SST пока задач...   Sep 8 2016, 08:47
- - brag   ЦитатаНу как бы с идеей SST крутится всякая мелкая...   Sep 8 2016, 08:48
- - sigmaN   Ладно бы товарищ просто говорил что ребят, так про...   Sep 8 2016, 08:54
|- - AHTOXA   Цитата(sigmaN @ Sep 8 2016, 13:54) Но у н...   Sep 8 2016, 09:04
- - brag   Цитатаbrag, на сколько я понял, в обычном SST пока...   Sep 8 2016, 09:11
- - sigmaN   ЦитатаПоэтому и в сях сейчас развивают асинхронное...   Sep 8 2016, 09:16
- - brag   ЦитатаЭто когда куча сокетов в массиве а потом в ц...   Sep 8 2016, 09:22
- - sigmaN   ЦитатаВы все равно ничего не поняли. Ключевое слов...   Sep 8 2016, 09:33
|- - brag   Цитата(sigmaN @ Sep 8 2016, 12:33) Могу в...   Sep 8 2016, 09:45
|- - DASM   Цитата(brag @ Sep 8 2016, 12:45) Для безо...   Sep 8 2016, 09:49
|- - brag   Цитата(DASM @ Sep 8 2016, 12:49) В случае...   Sep 8 2016, 09:58
- - DASM   а не в безопастности ли выполнения коренное различ...   Sep 8 2016, 09:39
- - sigmaN   ЦитатаWaitForMultipleObjects блокирует пользовател...   Sep 8 2016, 09:53
- - sigmaN   ЦитатаХотя даже с гиговым файлом/файлами однопоточ...   Sep 8 2016, 09:58
- - brag   ЦитатаНу во-первых там есть таймаут. Так что поток...   Sep 8 2016, 10:13
|- - arhiv6   brag, спасибо за ответ. Но всё-равно не всё понятн...   Sep 8 2016, 10:14
- - brag   arhiv6 , Вы путаете задачу и обработчик события. Э...   Sep 8 2016, 10:26
|- - arhiv6   brag, спасибо большое за разъяснение, теперь всё п...   Sep 8 2016, 10:52
|- - brag   Цитата(arhiv6 @ Sep 8 2016, 13:52) [/b]br...   Sep 8 2016, 10:57
- - sigmaN   ЦитатаНу как оно физически, да еще и под виндой я ...   Sep 8 2016, 10:34
- - brag   ЦитатаВот тут то мы и начинаем докапываться до сут...   Sep 8 2016, 10:47
- - sigmaN   Лаадно, тогда вы проводите правильный тест, выклад...   Sep 8 2016, 11:34
- - brag   Еще огромное преимущество SST-модели в том, что та...   Sep 8 2016, 11:40
|- - AlexandrY   Цитата(brag @ Sep 8 2016, 14:40) Ок, дела...   Sep 8 2016, 12:39
- - sigmaN   Вы видимо думаете, что мы тут все совсем темные, д...   Sep 8 2016, 12:34
- - brag   ЦитатаВ MQX есть в том числе и ваша гениальная иде...   Sep 8 2016, 12:42
|- - AlexandrY   Цитата(brag @ Sep 8 2016, 15:42) SST - эт...   Sep 8 2016, 13:03
|- - brag   Цитата(AlexandrY @ Sep 8 2016, 16:03) SST...   Sep 8 2016, 15:18
- - Kabdim   А топик так хорошо начинался. Тоже что ли залезт...   Sep 8 2016, 12:51
- - brag   Хух, сишный клиент осилил. То segfault схлопнешь, ...   Sep 8 2016, 17:22
|- - psL   Цитата(brag @ Sep 8 2016, 20:22) 1000 пот...   Sep 9 2016, 20:59
- - sigmaN   Интересный способ проверить сколько потоков может ...   Sep 8 2016, 17:44
- - Herz   Поступило предложение тему разделить и основное об...   Sep 8 2016, 19:38
|- - AHTOXA   Цитата(Herz @ Sep 9 2016, 00:38) Поступил...   Sep 8 2016, 21:03
|- - Serhiy_UA   Цитата(Herz @ Sep 8 2016, 22:38) Поступил...   Sep 9 2016, 04:53
- - brag   Возражений нет, но я не автор. Про аллокатор у мен...   Sep 8 2016, 20:04
- - sigmaN   Как весело мы ушли в сторону от обсуждения планиро...   Sep 8 2016, 20:43
- - brag   NodeJS свободно может работать без ОС и потоков во...   Sep 8 2016, 21:10
- - shreck   2brag В приведенном вами коде проскакивает Кодdel...   Sep 9 2016, 02:16
- - brag   ЦитатаХотя интересно было узнать то, что помимо ст...   Sep 9 2016, 06:12
|- - Serhiy_UA   Цитата(brag @ Sep 9 2016, 09:12) dew/dele...   Sep 9 2016, 07:23
|- - brag   ЦитатаОчень бы хотелось увидеть как бы вы обслужив...   Sep 9 2016, 07:47
- - sigmaN   Очень бы хотелось увидеть как бы вы обслуживали мн...   Sep 9 2016, 07:36
- - sigmaN   Всё всё, хватит, мы уже поняли что на Node.js можн...   Sep 9 2016, 07:52
|- - alexunder   Цитата(sigmaN @ Sep 9 2016, 09:52) Всё вс...   Sep 9 2016, 07:57
|- - brag   Цитата(alexunder @ Sep 9 2016, 10:57) Вер...   Sep 9 2016, 08:00
|- - alexunder   Цитата(brag @ Sep 9 2016, 10:00) Естестве...   Sep 9 2016, 08:16
- - brag   Так я уже показал, как я работаю с Датафлеш. Приве...   Sep 9 2016, 07:57
- - brag   Сделал сервер сишный блокирующий многопоточний. Ка...   Sep 9 2016, 08:26
- - Сергей Борщ   Почерпнул много интересного из этого обсуждения. П...   Sep 9 2016, 09:36
- - brag   Сергей Борщ, это называется Partial Template Speci...   Sep 9 2016, 09:58
- - sigmaN   Да, я тоже могу сказать, что узнал что-то новое из...   Sep 9 2016, 10:42
- - brag   ЦитатаДля начала давайте определимся, что любой об...   Sep 9 2016, 11:55
- - sigmaN   Кстати справедливости ради надо добавить, что идея...   Sep 9 2016, 19:24
- - brag   Smalltalk прикольная штука, но не прижилась. Но та...   Sep 9 2016, 20:04
- - sigmaN   Цитатавсе - вы программируете асинхронно, пора вык...   Sep 9 2016, 20:21
- - brag   Ок, с фанатичностью убавим Мне тоже лень было, но...   Sep 9 2016, 20:51
- - sigmaN   ЦитатаВидимо гуру не знает, что "Сервак на No...   Sep 9 2016, 22:16
- - brag   ЦитатаКаждый поток в линукс создается со стеком ~8...   Sep 10 2016, 05:21
3 страниц V   1 2 3 >


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 16:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016