Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мощные сервера 
:(
    Опции темы
reCoder
  Дата 19.10.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Здраствуйте.

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

Интересует как win32 так и unix-подобные. 

Windows
   Например как лучше работать с потоками, может запустить сразу n-нное количество (помоему так apache делает), или создавать по сокету на подключение.

Unix
   На счет этих систем что лучше использовать ? Процессы или потоки ? 

Буду рад любой информации, спасибо за внимание !

 smile 
PM MAIL   Вверх
Romikgy
Дата 19.10.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(reCoder @  19.10.2006,  12:28 Найти цитируемый пост)
как лучше работать с потоками

Многопоточность - как это делается в Дельфи.
хоть на дельфи но расписано очень хорошо
Цитата(reCoder @  19.10.2006,  12:28 Найти цитируемый пост)
может запустить сразу n-нное количество

имхо это хорошо для большого кол-ва подключений
Цитата(reCoder @  19.10.2006,  12:28 Найти цитируемый пост)
или создавать по сокету на подключение.

дык по любэ надо создавать на каждый коннект сокет


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
reCoder
Дата 19.10.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Цитата

дык по любэ надо создавать на каждый коннект сокет 


я ошибся. имел ввиду не сокет, а поток =)

Что еще ?
PM MAIL   Вверх
sergejzr
Дата 19.10.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(reCoder @  19.10.2006,  12:28 Найти цитируемый пост)
   Например как лучше работать с потоками, может запустить сразу n-нное количество (помоему так apache делает), или создавать по сокету на подключение.

Как правило у тебя динамический pool из N потоков. Количество регулируется в зависимости от нагрузки сервера.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
reCoder
Дата 19.10.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Можно чтото поконкретней ? Статьи, исходники, книги ?
PM MAIL   Вверх
sergejzr
Дата 19.10.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Поищи, где нибудь должны быть...
Я лично несколько реализаций серверов так видел, но не скажу точно где (искать тоже надо).

Например у тебя всегда минимум 10 (N) потоков. Если соеденений становится больше, создаёшь новые, как утихнет, убиваешь "лишние" опять до N.

Само число N зависит от среднестатистической загрузки твоего сервера.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
reCoder
Дата 19.10.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Ясно. Буду искать. Спасибо ;)
PM MAIL   Вверх
Romikgy
Дата 19.10.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



посмотри как сделаны Indy


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
reCoder
Дата 19.10.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Где ? И это Delphi ?
PM MAIL   Вверх
Romikgy
Дата 19.10.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(reCoder @  19.10.2006,  19:13 Найти цитируемый пост)
И это Delphi

да из дельфи , но смысл многопоточности и создания пулов с сокетами можно подсмотреть у них


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
reCoder
Дата 19.10.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



А где можно посмотреть это ? У меня Delphi 7 записан !
PM MAIL   Вверх
Romikgy
Дата 19.10.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



в нем и можешь


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
reCoder
Дата 19.10.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Спасибо. Что еще ?
PM MAIL   Вверх
_hunter
Дата 20.10.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



а еще можно посмотреть исходники апача...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
jnb
Дата 20.10.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.10.2006

Репутация: нет
Всего: 1



Вот почитай здесь (я эту ссылку где-то на форуме откапал):

http://www.microsoft.com/Rus/Msdn/Magazine...08/Winsock.mspx

Написано интересно и доходчиво, правда там дядя C# для реализации использует. Но думаю, если почитаешь во вред не пойдет.
PM MAIL   Вверх
SergeCpp
Дата 20.10.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Джеффри РИХТЕР. Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows

Пулы Потоков (сам текст главы там ниже оглавления)

И купите эту книгу!

PM MAIL WWW ICQ   Вверх
reCoder
Дата 20.10.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Мне желательно чтото крос-платформенное, а не API под Windows. 
PM MAIL   Вверх
bsa
Дата 21.10.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(reCoder @ 20.10.2006,  17:37)
Мне желательно чтото крос-платформенное, а не API под Windows.

Скорей всего тебе придется написать свое API, которое будет подменяться в зависимости от платформы.
Если я не ошибаюсь, работа с сокетами в Windows и *nix очень похожа. А вот с потоками придется сложнее, хотя можно испольовать boost, если тебе не исключительно Си нужен.
PM   Вверх
En_t_end
Дата 21.10.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Цитата(bsa @  21.10.2006,  15:34 Найти цитируемый пост)
 А вот с потоками придется сложнее,

Самое простое:
Код

/*****************************************************************************
*                                    usync.h                                      *
*******************************************************************************
*    Wrapper under mutex,threads create-destroy system calls                      *
*    Cross-platform!(Linux-Windows)                                              *
*    Author: Paul Nujdin aka En_t_end. Barnaul 2006(Russia)                      *
*    e-mail: [email protected]                                              *
*    USE THIS SOURCE OR PART OF THIS ONLY IN FREE PROJECT OR IN OPENSOURCE      *
*    OR WITH SPECIAL ALLOWING BY PAUL NUJDIN.                                  *
******************************************************************************/

#ifndef __USYNC_H__
#define __USYNC_H__

//Special defined options for other platform and compiler.
#define PLFRM_CMPL_NIX_G//*nix-system with g++ compiler.
#define PLFRM_CMPL_WINNT_VS6_7//windows nt-system with IDE VISUAL STUDIO 6-7.
//*****************************************************************************

#undef PLFRM_CMPL_NIX_G
//#undef PLFRM_CMPL_WINNT_VS6_7

#ifdef PLFRM_CMPL_NIX_G
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <pthread.h>
/*
For information:
For unix-base system you must linked APP with -lpthread directive,
for example: g++ file.cpp -lpthread -o
*/
#endif //PLFRM_CMPL_NIX_G

#ifdef PLFRM_CMPL_WINNT_VS6_7
#include <windows.h>
#endif //PLFRM_CMPL_WINNT_VS6_7

#ifdef PLFRM_CMPL_WINNT_VS6_7
#define USLEEP(milsec)    Sleep(milsec)
#define SLEEP(sec)        Sleep(sec*1000)
#endif //PLFRM_CMPL_WINNT_VS6_7
#ifdef PLFRM_CMPL_NIX_G
#define USLEEP(milsec)    usleep(milsec*1000)//milsec to micsec(10^-6 to 10^-3)
#define SLEEP(sec)        sleep(sec)
#endif //PLFRM_CMPL_NIX_G

#define TIME_SYNC        50
//[milsec]. Time for switch other threads    

namespace usync
{
    namespace threads
    {
        #ifdef PLFRM_CMPL_WINNT_VS6_7
        typedef HANDLE _hndle_;
        #endif //PLFRM_CMPL_WINNT_VS6_7
        #ifdef PLFRM_CMPL_NIX_G
        typedef pthread_t* _hndle_;
        #endif //PLFRM_CMPL_NIX_G

        typedef void* (*LPTHRD_PROC_ADDR)(void*);
        bool CreateThrd(_hndle_&,LPTHRD_PROC_ADDR,void*);
        bool CloseHndle(_hndle_);//free mem,don't close thread proc
//        void SuspendThrd(_hndle_);
//        void TerminateThrd(_hndle_);
    }
    namespace mutex
    {
        #ifdef PLFRM_CMPL_NIX_G
        typedef pthread_mutex_t _mutex_;
        #endif //PLFRM_CMPL_NIX_G
        #ifdef PLFRM_CMPL_WINNT_VS6_7
        typedef CRITICAL_SECTION _mutex_;
        #endif //PLFRM_CMPL_WINNT_VS6_7

        bool InitializeMutex(_mutex_*);
        void DestroyMutex(_mutex_*);
        void LockMutex(_mutex_*);
        void UnLockMutex(_mutex_*);

        //TryLockMutex:
        #ifdef PLFRM_CMPL_NIX_G
        bool TryLockMutex(_mutex_*);
        #endif //PLFRM_CMPL_NIX_G
        #ifdef PLFRM_CMPL_WINNT_VS6_7
        #ifdef _WIN32_WINNT
        //Windows version will work only, if windows libs compiled with _WIN32_WINNT 0x0400 constant
        bool TryLockMutex(_mutex_*);
        #endif //_WIN32_WINNT 0x0400
        #endif //PLFRM_CMPL_WINNT_VS6_7
    }
}

#endif //__USYNC_H__

Код

/******************************************************************************
*                                    usync.cpp                                  *
*******************************************************************************
*    Wrapper under mutex,threads create-destroy system calls                      *
*    Cross-platform!(Linux-Windows)                                              *
*    Author: Paul Nujdin aka En_t_end. Barnaul 2006(Russia)                      *
*    e-mail: [email protected]                                              *
*    USE THIS SOURCE OR PART OF THIS ONLY IN FREE PROJECT OR IN OPENSOURCE      *
*    OR WITH SPECIAL ALLOWING BY PAUL NUJDIN.                                  *
******************************************************************************/

#include "usync.h"

bool usync::threads::CreateThrd(
    usync::threads::_hndle_ &hndle,
    usync::threads::LPTHRD_PROC_ADDR proc,
    void* param)
{
    #ifdef PLFRM_CMPL_NIX_G
    return (pthread_create(hndle,NULL,proc,param)==0);
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    hndle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,param,0,NULL);
    return(hndle!=NULL);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

bool usync::threads::CloseHndle(
    usync::threads::_hndle_ hndle)
{
    #ifdef PLFRM_CMPL_NIX_G
    pthread_detach(*hndle);
    return true;
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    return (CloseHandle(hndle)!=0);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

bool usync::mutex::InitializeMutex(
    usync::mutex::_mutex_* mutex)
{
    #ifdef PLFRM_CMPL_NIX_G
    return pthread_mutex_init(mutex,NULL)==0?true:false;
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    try{InitializeCriticalSection(mutex);}
    catch(...){return false;}
    return true;
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

void usync::mutex::DestroyMutex(
    usync::mutex::_mutex_* mutex)
{
    #ifdef PLFRM_CMPL_NIX_G
    //multithread::multithread_mutex::UnLockMutex(mutex);
    //caution!!!in LinuxThread mutex must be unlocked before destroy
    pthread_mutex_destroy(mutex);
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    DeleteCriticalSection(mutex);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

void usync::mutex::LockMutex(
    usync::mutex::_mutex_* mutex)
{
    #ifdef PLFRM_CMPL_NIX_G
    pthread_mutex_lock(mutex);
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    EnterCriticalSection(mutex);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

void usync::mutex::UnLockMutex(
    usync::mutex::_mutex_* mutex)
{
    #ifdef PLFRM_CMPL_NIX_G
    pthread_mutex_unlock(mutex);
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    LeaveCriticalSection(mutex);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}

#ifdef PLFRM_CMPL_NIX_G
bool usync::mutex::TryLockMutex(
    usync::mutex::_mutex_* mutex)
{return (pthread_mutex_trylock(mutex)!=EBUSY);}
#endif //PLFRM_CMPL_NIX_G
#ifdef PLFRM_CMPL_WINNT_VS6_7
#ifdef _WIN32_WINNT
//Windows version will work only, if windows lib's compiled with _WIN32_WINNT 0x0400 constant
bool usync::mutex::TryLockMutex(
    usync::mutex::_mutex_* mutex)
{return (TryEnterCriticalSection(mutex)!=0);}
#endif //_WIN32_WINNT 0x0400
#endif //PLFRM_CMPL_WINNT_VS6_7


Приминение:
Код

#include "usync.h"
#include <iostream>

using std::cout;
using std::endl;

using namespace usync::threads;
using namespace usync::mutex;

_mutex_ MutexFor_M;//
//_mutex_ MutexFor_M = PTHREAD_MUTEX_INITIALIZER; //for LinuxThread(only statically).
int g_M;

void *Thread1(void* pParam) //
{
/*    while(true)
    {*/
//        USLEEP(20);
//        LockMutex(&MutexFor_M);//Ждём освобождения мутекса, занимаем мутекс...
        g_M = 0xDEAD;//:----)
        cout << "Thread1 is locked mutex, g_M = " << g_M << endl;
//        UnLockMutex(&MutexFor_M);//Освобождаем мутекс...
//    }
        return NULL;
}

void *Thread2(void* pParam)
{
/*    while(true)
    {*/
//        USLEEP(30);
//        LockMutex(&MutexFor_M);
        g_M = 0xBEEF;//:----)
        cout << "Thread2 is locked mutex, g_M = " << g_M << endl;
//        UnLockMutex(&MutexFor_M);
//    }
        return NULL;
}

void main()
{
    g_M = 0;
//    cout << std::boolalpha;
    cout << "InitializeMutex -" << InitializeMutex(&MutexFor_M) << endl; //
    _hndle_ Hndl1,Hndl2;
    //Test Start-Close:
    cout << "Start Thread1 -" << CreateThrd(Hndl1,Thread1,NULL) << ". Close handle -" << CloseHndle(Hndl1) << endl; //
    cout << "Start Thread2 -" << CreateThrd(Hndl2,Thread2,NULL) << ". Close handle -" << CloseHndle(Hndl2) << endl;
    cout << std::hex;//for dead-beef output...
    //Agressive test:
    while(true)// ;-)
    {
        CreateThrd(Hndl1,Thread1,NULL);CloseHndle(Hndl1);
        CreateThrd(Hndl2,Thread2,NULL);CloseHndle(Hndl2);
        USLEEP(17);//
    }
}

Код

кроссплатформенный враппер над системными вызовами
mutex,thread -create-destroy

Может кому пригодиться...
Чтобы включить опции для нужной платформы комментим
следующее в usync.h:(хотя наверное лучше, наоборот,включать это при компиляции)
#undef PLFRM_CMPL_NIX_G //для никсов с g++'ом
#undef PLFRM_CMPL_WINNT_VS6_7
//для windows 9x-NT VS6-7, но скорее всего и для более старых версий
Под mac я не программировал, но скорее всего при минимальных усилиях можно добавить в оболочку и его системные вызовы.

Сам враппер sync.h и sync.cpp
Состоит из одного namespace, в который вложенно ещё два. Один для потоков, другой для мутексов. В каждом namespac'е включены нужные функции и процедуры. Также, есть два типа процедуры усыпления текущего потока: USLEEP - послать поток в анабиоз на milsec миллисекунд;SLEEP - на sec секунд.

В примере, как пользоваться оболочкой(пример для VISUAL STUDIO 7 2003 NET).
Поясню, в примере крутятся два типа потоков, каждый, получив доступ к области(global integer variable), защищенной мутексом, пишет туда либо 0xDEAD, либо 0xBEEF. Там ясно видно, как инициализировать мутекс, как его запустить, как запустить поток и освободить ресурсы. В примере, также, показан стресс-тест оболочки(super long loop).
Есть также TryLockMutex - но она доступна(для win-base system) лишь при включении _WIN32_WINNT 0x0400(и выше) перед включением windows.h, то есть для старых "окон" заюзать её не получиться.


PS лень комменты в примере убирать... не помню уже и зачем коментил, но логика должна быть понятна... извините за мусор в коде smile

Добавлено @ 18:47 
Цитата(bsa @  21.10.2006,  15:34 Найти цитируемый пост)
Если я не ошибаюсь, работа с сокетами в Windows и *nix очень похожа.

Схожа да не очень, насколько я могу судить(у меня есть, хоть и скудный, опыт работы и в *nix и в windows) чтобы голова постоянна не болела придется писать универсальную библиотеку над сокетами(я поступил именно так).
PM MAIL ICQ Skype GTalk Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.