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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача управления следующему потоку FreeBSD 
V
    Опции темы
Wolf
Дата 28.8.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



Доброго времени суток! Каким образом во FreeBSD управление можно передать другому (следующиму) потоку?

Вот скажем есть у меня бесконечный цикл:

Код

while (true) {
     ...
    
     //Вот тут требуется вставить вункцию, которая
     //дала операционной системе понять, что
     //нужно обслуживать следующий поток, а
     //этот подождёт.
}

PM MAIL ICQ   Вверх
boostcoder
Дата 28.8.2010, 16:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(Wolf @  28.8.2010,  15:02 Найти цитируемый пост)
передать другому (следующиму) потоку?

не уверен что правильно понял вас...

вам нужно выполнение какой-то функции распределять между потоками?

если да, то так:
Код

#include <iostream>
#include <boost/thread.hpp>

void somefunction(int arg) {
   std::cout << "somefunction(" << arg << ")" << std::endl;
}

int main() {
   const size_t cores = 4;
   boost::thread_group threads;
   
   for ( size_t idx = 0; idx < cores; ++idx ) {
      threads.create_thread(boost::bind(somefunction, rand()));
   }
   
   threads.join_all();
   
   return 0;
}

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

правильный вариант - использовать boost::asio::io_service в связке с boost::thread_group.

Это сообщение отредактировал(а) boostcoder - 28.8.2010, 16:14
PM WWW   Вверх
MAKCim
Дата 28.8.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
sched_yield

Добавлено через 1 минуту и 25 секунд
boostcoder
я вообще не понимаю, зачем приводить такие примеры?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 28.8.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(MAKCim @  28.8.2010,  16:34 Найти цитируемый пост)
такие

какие?
PM WWW   Вверх
MAKCim
Дата 28.8.2010, 23:05 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



boostcoder
у автора даже намека нет на использование boost'а
это раз (да и вообще, в этом разделе форума советовать boost как-то не кошерно, имхо)
во-вторых, если не поняли вопрос, уточните
смысл телепатии с не имеющим отношения к сути вопроса кодом?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 28.8.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
у автора даже намека нет на использование boost'а

а это что ,что-то из ряда вон выходящее?

Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
во-вторых, если не поняли вопрос, уточните

я и предположил, что возможно не верно понял задачу..
Цитата(boostcoder @  28.8.2010,  16:04 Найти цитируемый пост)
не уверен что правильно понял вас...



Цитата(MAKCim @  28.8.2010,  23:05 Найти цитируемый пост)
смысл телепатии с не имеющим отношения к сути вопроса кодом?

как минимум, никому от этого не хуже.

Это сообщение отредактировал(а) boostcoder - 28.8.2010, 23:16
PM WWW   Вверх
MAKCim
Дата 29.8.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



boostcoder
Нет, это не что-то из ряда вон выходящее
просто boost это не та либа, которую в принципе можно сувать (ака предлагать) куда/где попало: есть куча всяких задач, начиная с использования только С и заканчивая специфическими окружениями, где boost не применим

Короче, считаю пример бессмысленным в плане пользы автору от него...проехали в общем


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



Пример номер два. С ним, я думаю, будет яснее.

Код

#include <iostream>

using namespace std;

int main()
{
    int i = 0;

    while (true) {
        i++;
    }

    return 0;
}


В любой операционной системе данный код приведёт к 100% загрузке процессора (или ядра на котором код выполняется) (пример - прикреплённый рисунок). Мне нужно избавиться от 100% загрузки процессора. И так, что можно для этого вставить в цикл while (true) {} ?

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  FreeBSD_8.1_2010_08_29_15_25_03.png 91,40 Kb
PM MAIL ICQ   Вверх
MAKCim
Дата 29.8.2010, 13:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



я же сказал, sched_yield
Код

#include <iostream>
using namespace std;
int main()
{
    int i = 0;
    while (true) {
        i++;
       sched_yield();
    }
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, большое спасибо! Не заметил сразу.
PM MAIL ICQ   Вверх
Wolf
Дата 31.8.2010, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



Что-то это не помогает. В top смотрю, разница лишь в том, что с sched_yield система грузит проц под 100%, а без sched_yield, приложение. А как можно на очень короткое время переводить процесс или поток в ожидание?
PM MAIL ICQ   Вверх
REZiaMIX
Дата 31.8.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wolf @ 31.8.2010,  05:44)
Что-то это не помогает. В top смотрю, разница лишь в том, что с sched_yield система грузит проц под 100%, а без sched_yield, приложение. А как можно на очень короткое время переводить процесс или поток в ожидание?

Ожидание: nanosleep.
Вы что то не правильно делаете, такой цикл вообще использовать не стоит. Думаю тут надо думать другим путем, ошибка в архитектуре.


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 31.8.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
это поможет если большинство процессов не ограничены вводом-выводом
в противном случае просто некому грубо говоря передать управление и оно переходит обратно к вызывающему потоку


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Wolf
Дата 1.9.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



У меня не while(true), а примерно такое в потоках, занимающихся IO сокета:

Код

bool TermFlag;

//это функция потока
void *ThreadProc(void *Param)
{
     while (!TermFlag) {
          //Здесь распологаются функции обработки сокетов
          //как по другому, если не циклом, опрашивать их
          //состояние?
     }

     TermFlag = false;
}

//эта функция вызывается из управляющего потока
//для завершения потока
void Terminate()
{
     TermFlag = true;

     //Ждём окончания цикла функции потока
     while (TermFlag) ;
}


Скорее всего я не правильно понимаю работу планировщика. В общем если в цикле ваил тру есть, что считать, например i++, и процессор свободен, то вот, собственно говоря он и считает на 100% ресурса процессора. Как то так, видимо.
PM MAIL ICQ   Вверх
djamshud
Дата 1.9.2010, 15:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Wolf, man select, man epoll, man poll.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Wolf
Дата 1.9.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



djamshud, это то тут причём? Разумеется этим мультиплексируется обработка клиентов.

Вопрос в другом. Прочтите 1 пост.
PM MAIL ICQ   Вверх
djamshud
Дата 1.9.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Wolf,

Цитата

          //Здесь распологаются функции обработки сокетов
          //как по другому, если не циклом, опрашивать их
          //состояние?


Загнать их в селект?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Wolf
Дата 1.9.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



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

Это сообщение отредактировал(а) Wolf - 1.9.2010, 15:44
PM MAIL ICQ   Вверх
djamshud
Дата 1.9.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Wolf, извините, если я что-то не понимаю, но...

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

Добавлено через 57 секунд
Собственно, даже если состояние их не изменилось, управление вернется через указанный таймаут.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Wolf
Дата 2.9.2010, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



djamshud, Вы не понимаете, что речь не о сокетах и методах мультиплексирования.

Ну и чтобы вам было яснее. Клиентов более 2000. Потоков в зависимости от настройки от 1 до какого либо разумного предела (пул потоков). Потоки тормозить нельзя (тем же самым блокирующим режимом select). По этому таймаут 0. Что можно читать - читаем, что можно отослать - отсылаем (опять же чётко и без блокировок). Далее берём новую группу сокетов и обрабатываем. Непрерывно.

Это сообщение отредактировал(а) Wolf - 2.9.2010, 06:58
PM MAIL ICQ   Вверх
MAKCim
Дата 2.9.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



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

Добавлено через 2 минуты и 17 секунд
ну и по архитектуре
у каждого потока должно быть свое множество сокетов, с которым он может работать неконкурентно с другими потоками



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, пока что архитектура такова, что действительно существует конкуренция. Общий список клиентов к нему обращаются потоки для получения группы сокетов. Сокеты не закреплены за какими либо потоками. И скорее всего действительно придётся переписать механизм обработки сокетов. Вы меня заставили задуматься. Мои радужные представления о текущей архитектуре могут рухнуть  smile 

А что посоветуете? По идее должен быть нагруженный сервер с множеством клиентов. Клиенты обмениваются между собой данными и между базами сервера. Скажем сервер видео конференций + сервер какого либо контента.
PM MAIL ICQ   Вверх
MAKCim
Дата 2.9.2010, 21:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



какой бы не был нагруженный сервер, всегда существует лимит одновременно обрабатываемых соединений
обусловленный производительностью системы и толщиной канала
обозначим лимит через L, а число ядер/процессоров - через N
каждому ядру/процессору соответствует поток/процесс
максимальное число соединений для него L/N
итого имеем матрицу размером L*N
каждый элемент - дескриптор (указатель, структура, ...) соединения
есть один поток, постоянно вызывающий accept()
полученный сокет диспетчеризируется одному из N потоков/процессов
каждый из N потоков/процессов циклично выполняет 3 действия
1) опрос новых соединений и добавление их в select/poll/epoll/kqueue/...
2) мультиплексирование
3) обработка
в 1) нет блокировки, т. к. у каждого потока/процесса своя часть матрицы, а доступность
нового соединения определяется флагом дескриптора
чтение и установка флага могут осуществляться параллельно без лока


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, а что насчёт общих данных и обмена сообщениями между клиентов? Тут то тоже блокировка.
PM MAIL ICQ   Вверх
MAKCim
Дата 3.9.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
добавить в каждый дескриптор очередь
сообщение кидаем в очередь
соответственно добавляем пункт 4) - проверка очереди на предмет новых сообщений
очередь защищается спин-локом
чтение очереди у меня всегда выглядит след. образом
Код

lock(l);
list_replace_init(queue, temp);
unlock(l);
// обрабатываем temp без лока

list_replace_init имеет сложность O(1)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Wolf
Дата 3.9.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, тут опять же возникает множество вопросов. Как поток которому нужно передать от клиента А клиенту Б сообщение узнает в каком потоке находится его клиент? Если не будет общего списка. Второй вопрос, кто удаляет клиентов из списка? Логично, что  поток, обрабатывающий клиента. Но удалив его дескриптор, может возникнуть такая ситуация, когда кто-то пытается в удалённый из памяти дескриптор (и, соответственно, его очередь) добавить сообщение.

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

Это сообщение отредактировал(а) Wolf - 3.9.2010, 14:05
PM MAIL ICQ   Вверх
MAKCim
Дата 3.9.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Wolf @  3.9.2010,  11:47 Найти цитируемый пост)
Как поток которому нужно передать от клиента А клиенту Б сообщение узнает в каком потоке находится его клиент?

просто ;)

поток, дергающий accept(), поддерживает map адресов клиентов и перед диспетчеризацией соединения одному из потоков добавляет {ip, id} в map
ip - адрес клиента
id - номер потока
соответственно, каждый из потоков, например через пайп, связан с ним
все пайпы мультиплексируются им равно как и listen-сокет

когда i-ый поток хочет получить номер потока, он пишет в пайп запрос и получает результат

в принципе эта же схема работает и для взаимодействия между потоками (вместо очередей)
но скорость может быть ниже
Цитата(Wolf @  3.9.2010,  11:47 Найти цитируемый пост)
Второй вопрос, кто удаляет клиентов из списка? Логично, что  поток, обрабатывающий клиента. Но удалив его дескриптор, может возникнуть такая ситуация, когда кто-то пытается в удалённый из памяти дескриптор (и, соответственно, его очередь) добавить сообщение.

матрица _не удаляется_, она статична
когда, соединение закрывается, поток достает его из select/poll/epoll/kqueue..., освобождает ресурсы и устанавливает флаг FREE в дескрипторе

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Wolf
Дата 11.9.2010, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, спасибо, теперь многие моменты прояснились smile А что можно почитать по сетевой архитектуре?
PM MAIL ICQ   Вверх
MAKCim
Дата 11.9.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Wolf
боюсь только практика ну и плюс примеры реальных приложений
в книгах описание подобного рода вещей я как-то не встречал
но Стивенс в любом случае не повредит ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



MAKCim, да я вот тоже понимаю, что лучше всего было бы работать по этому направлению в организации какой нибудь, и лучше не какой нибуть. К сожалению на данный момент нет такой возможности. У нас в городе это не востребовано. Нужно переезжать smile
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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