Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Kak sinhronizirowat prozessi?  (Прочитано 23016 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 28-05-2004 15:44 » 

Ljudi, podelites znanijami na etu temu  Я шокирован!

Situazija sledujushaja : moj exe moget bit zapushen bolee 1 raza, prichem wse kopii dolgni rabotat parallelno.
W programme nado blokirowat zeluju seriju funkzij plus peredawat nowim prozessam informaziju i wot pochemu.

Ispolzuetsja soft tretjej firmi, w kotorom net poddergki mnogopotochnosti. A tam w swoju ochered proishodit sledujushee - est fail, ispolzuemij kak db, pri starte on zagrugaetsja w operatiwnuju pamjat dlja uskorenija dostupa i wigrugaetsja tolko pri okonchanii programmi. W faile proishodit ne tolko poisk, no i zapis. Pri etom oni pri zagruzke wozwrashajut handle na tablizu, t.e. ,kak ja ponimaju, eto ptosto ukazatel na pamajat,  w kotoroj wse razmestili. Zatem wse obrashenija wipolnjajutsja s pomoshju etogo handle.
Pri rabote wiziwaetsja zelaja serija funkzij etogo softa dlja poluchenija nugnogo rezultata.

posemu mne nado blokirowat zeluju seriju funkzij ili na krajnij sluchaj kak-to sdelat etot handle dostupnim dlja drugih kopij programm.
prichem eto dolgno bit dlja winda i dlja linuxa(i emu podobnih).

obichnij semaphore(dlja linuxa) / mutex (wind) podhodit dlja blokirowanija serii funkzij, no ne spaset ot problemi s zagruzkoj faila w pamjat po wtoromu razu.

Podskagite, pogalujsta, kak iz etogo wibiratjsja!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-05-2004 16:08 » 

Malaja, насколько я понимаю, софт третьей партии реализован в виде библиотеки.  Может ли этот софт использоваться для обрабатки нескольких файлов одновременно?

Если да, то можно предложить такое решение -- написать клиент-серверное приложение.  Код третьей партии работает только в сервере, соответственно все файлы грузятся в память ровно столько раз, сколько это нужно серверу.

Клиенты -- твои программы.  При запуске они коннектятся к серверу и просят его загрузить файл.  На сервере ведётся статистика обращений к файлам -- если файл уже загружен, повторно не грузить, увеличить счётчик на единицу.  При отсоединении клиента или явном обращении о закрытии счётчик уменьшить на 1.  Когда счётчик обнулится -- файл закрыть.

Далее клиенты запрашивают операции, сервер их обрабатывает и возвращает результаты.

В винде сервер можно сделать сервисом, или загружать через dll (вставить код запуска сервера в процедуру DllMain, повесить на событие DLL_PROCESS_ATTACH).  Аналогично в линухе -- сделать демоном (возможно, зарезервировать TCP порт и в inetd.conf прописать соответствующую строчку) или грузить из shared library (но в Линухе так не принято Улыбаюсь )

Для межпроцессного взаимодействия можно воспользоваться голым tcp/ip, но придётся попотеть над многопотоковым сервером, протоколом обмена данными и маршализацией.  Можно построить на базе некоей платформы, такой как rpc (Remote Procedure Call) или CORBA.

RPC есть как в линухе, так и в винде.  Может быть, даже получится переносимый код Улыбаюсь
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Anonymous
Гость
« Ответ #2 : 30-05-2004 11:12 » 

npak,

spasibo za ideju, nado podumt, kak eto sdelat.
Para woprosow (prosti za tupost  :oops: ):
1) chto oznachaet
Цитата

вставить код запуска сервера в процедуру DllMain, повесить на событие DLL_PROCESS_ATTACH


i pochemu eto neobhodimo.
Wtoroe sjuda ge - kak zagruzit dll tolko odin raz (t.e. kak pri starte wtorogo exe prowerit, chto dll uge zagrugena i ispolzowat ee handle), ili eto kak raz dlja etogo i delaetsja?
2) pochemu eto newerno?
Цитата

грузить из shared library (но в Линухе так не принято

?
Wtoroj wopros zses analogichen woprosu iz 1) - kak gruzit w pamjat etu libu tolko odin raz?

3)
Цитата

RPC есть как в линухе, так и в винде


esli mogesh, podskagi, pogalujsta, gde mogno ob etom pochitat, ja etogo woobshe ne znaju. Nu a esli est primerchik - prishli, pogalujsta.
Ja ispolzuju rfc megdu moej exe i SAP, no w etom sluchae rfc wstroena w SAP.
Naskolko ja ponimaju, eto SAP - spezificheskaja liba, k tomu, o chem ti goworish, nikak ne otnositsja.

Delo w tom, chto s mnogo- ili meg-prozessornim wzaimodejstwiem ja nikogda ne rabotala, posemu eto dlja menja sejchas sowsem "chernij jashik", a wremeni na pokopatjsja net, plus k etomu linux - spezifiku ja woobshe nikogda ne znala, a tut nado wse srazu (kak obichno, wse dolgno bilo bit sdelano eshe wchera   Ха-ха-ха )

Poetomu esli est kakie-to primeri, ja budu ochen blagodarna.
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 30-05-2004 11:15 » 

Pardon, menja pochemu-to wikinulo bez moego razreshenija, posemu ja okazalas gostem  Показываю язык
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-05-2004 17:38 » 

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

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

У тебя стоит задача загружать отдельные файлы не более одного раза.  То есть
должно быть состояние, общее для всех процессов, которые пользуются данной
фичей/библиотекой.  Более того, возвращаемый хэндл уникален для процесса, в
котором был создан, и для других процессов не имеет смысла.

По этим причинам я предложил вынести работу с запросами в отдельный процесс --
серверное приложение.

Только сервер линкуется с библиотекой, а предложения запросы передают к
серверу.

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

-  Cокеты.

-  средства построения распределенных
   приложений (RPC, Corba, COM/DCOM, .NET, Java RMI)

-  Shared Memory

У каждого из предложенных методов есть свои плюсы и минусы.

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

Способ запуска зависит от способа передачи данных между клиентом/сервером.

Если ты предоставишь описание интерфейса библиотеки (хотя бы имена функций с
параметрами, семантика) можно будет предложить какой-то определённый дизайн.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 30-05-2004 22:37 » 

npak,

sejchas poprobuju opisat hotja bi priblizitelno, tochnee ne mogu - wes doc wed na rabote Улыбаюсь

Perwoe, u menja uge eta problema plawno pererosla w 2, t.e. s odnoj storoni, eto samoe chugoe obespechenie, a s frugoj, liba po prowerke lizensij. Posemu po ocheredi :
1) chugoj soft - podkluchaesja dinamicheski w silu otsutstwija .lib - faila (nam otkazalis ego predostawit, sekretnost, blin  Ха-ха-ха )

Funkzii priblizitelno takie :

short loadDB(long* pHandle, const char* pDbName);
short closeDB(long* pHandle, const char* pDbName);
short saveDB(long* pHandle, const char* pDbName);
short setFieldCount(long* pHandle, const char* pDbName, const long nFieldCount);
short seekStr(long* pHandle, const char* pStr, long* pCount);
short getRes(long* pHandle, const char* pDbName, long* pResCount, char* pResString);

i t.d.
Smisl takoj - naprimer, po zaprosu zagrugaem fail s pomoshju openDB, ishem tam zadannuju stroku simwolow (seekStr()),  a zatem shitiwaem resultati (getRes()) w strukturu, kotoruju zatem po RFC kidaem SAPu nazad.

Problema zakljuchaetsja w tom, chto
- wo -perwih, etot fail razmerow beshenih, posemu bistrodejstwija radi dolgen bit tolko odin raz zagrugen w pamjat pri perwom wizowe, a wigrugen tolko pri ostanowke programmi (programma dolgna bit wse wremja w rabochem sostojanii). Pri etom esli kagdij raz pri starte ocherednogo .exe w pamjat budet zagrugatjsja ocherednaja kopija etogo faila, to resursi ochen bistro ujdut (a dolgno bit parallelno do 10 prozessow...)
- Wtoraja problema zakljuchaetsja w tom, chto tam osushestwljaetsja ne tolko poisk, no i izmenenija.  Posemu esli w pamjati nahodjatsja bolee odnoj kopii, to resultat plachewen.
Posemu mne nado napisat server, kotorij zagrugalsja bi w pamjat tolko odin raz pri starte perwogo .exe iz wsej serii (do 10 shtuk), a pri popitke wtorogo .exe zagruzit etot server etot samij wtoroj .exe poluchal bi uge gotowij handle toj samoj sushestwujushej instanzii.


2) Lizensii :

Situazija sledujushaja : user hochet wipolnit kakie-to dejstwija i posilaet zapros, popadajushij w moji programmu. Ja snachala dolgna prowerit sostojanie lizenzij (t.e. est li etot user w faile, esli da - izmenit wremja poslednego loga na segodnjashnjuju datu i dalee wipolnit ego zapros, esli net - prowerit, est li eshe swobodnie lizensii, esli da - wnesti etogo usera w fail, esli net - widat sootwetstwujushee soobshenie i prerwat wipolnenie zaprosa). prinzip takow - est fail, w kotorom stoit info o kolichestwe lizensij i t.d. w zashifrowannom wide, est fail, w kotorom stojat useri, zahodiwshie w sistemu, i dati ih poslednego zahoda(toge w zashifrowannom wide). T e. mne nado otkriwat eti faili, shitiwat iz nih sodergimoe, analizirowat i pri neobhodimosti izmenjat.

W dll est odna osnownaja funkzija, widnaja snarugi, ostalnoe proishodit wnutri liba (dll). prichem w etom sluchae blokirowka fajlow menja ne spasaet, t.k. ja snachala shitiwaju dannie, zatem zakriwaju fajli, zatem analiziruju informaziju, po neobhodimosti korrektiruju fajl, w kotorom nahodjatsja dannie o userah, i lish zatem posilaju rezulzat wizwawshemu ee .exe-shniku.
Prichem w swjazi s shifrowaniem woznikli problemi s postrochnim shitiwaniem, ibo pri shifrowke inogda generirujutsja simwoli perehoda na nowuju stroku. Prishlos wsju infu hranit w wide struktur, prichem esli nado chto-to izmenit, to nado snachala udalit staroe sodergimoe, a zatem zapisat nowoe. Posemu zablokirowan dolgen bit wes prozess prowerki. Dlja multithreading podojdet mutex7semaphore, a wot chto delat s multiprocessing???
Poluchaetsja, opjat nado pisat server, kotorij budet zagrugat lizens - libu. Znachit, etot server opjat ge nado imet w pamjati tolko odin raz.

Osnownaja funkzija imeet priblizitelno takoj wid :

short checkLicense(const char* pName, const char* pDate, const char* pLicFileName, char* pErr, long* pLicCount, long* pCurLicCount);

Wot tak eto wigljadit.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 31-05-2004 07:39 » 

Malaja, есть несколько вопросов:
1) как связаны задачи 1 и 2?
2) в задаче 1 ты говоришь о чужом ПО. Это ПО состоит из dll, или dll+exe?
3) в задаче 2: почему нельзя удерживать блокировку на все время проверки? Она интерактивная?

Однопоточный сервер - хороший выход - весь контроль в одних руках.
Может стоит использовать СУБД?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 31-05-2004 08:16 » 

Трудно читать - но непонятно в чем проблема - две разные проги работают отдельно в разных виртуальных пространствах памяти.
Пересекать их можно либо спецом либо по недосмотру (что много сложнее Улыбаюсь ).

БД - как и файлы имеет свои функции блокировки - надо их использовать.
Работа с файлами блокируется при эксклюзивной работе без разрешения оверлеппед...

Что-то не пойму я проблему.
Записан

А птичку нашу прошу не обижать!!!
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 31-05-2004 12:21 » 

Perwoe, struktura takowa :

est moj .exe, kotorij wipolnjaet zaprosi, poslannie iz SAP - sistemi.
Pri popadanii zaprosa w moj .exe on, w swoju ochered, dolgen snachala prowerit lizensii (oni hranjatsja w obichnih fajlah). Wsja prowerka nahoditsja w napisannoj mnoju .dll (ili .so). Esli prowerka wozwrashaet pologitelnij rezultat, to nastupaet sledujushij etap - wipolnenie zaprosow.
Dlja wipolnenija zaprosow moj .exe wiziwaet to samoe chugoe PO (.dll dlja winda i .so dlja lin). Pri etom w nem tak naziwaemaja DB organizowana kak obichnij textowij fail, kotorij dlja uwelichenija bistrodejstwija wse wremja nahoditsja w rabochej pamjati.

Ja sdelala oba bloka (kotorie tolko chto opisala) threadsafe, t.k. iznachalno dolgen bil startowat tolko odin edinstwennij .exe.
Teper zadacha izmenilas - dolgna bit wozmognost startowat do 10 moih .exe srazu (t.e. 10 kopij odnoj programmi w pamjati), chto oznachaet, chto kagdaja zagrugaet swoju kopiju t.n. DB - faila (chugoe PO) plus swoju kopiju moej dll dlja prowerki lizensij. I imenno eto i newerno, t.e. u menja dolgna bit wozmognost kak-to eto organizowat tak, chtobi moja i chugaja dll-li bili zagrugeni tolko odin raz.
A wot akk eto sdelat - ja ne znaju Я шокирован!

Esli eshe est woprosi- zadawajite, postarajus otwetit.
Zaranee wsem spasibo.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 31-05-2004 16:14 » 

Malaja, сегодня не могу развёрнуто отвечать, мы переезжаем из одной части здания в другую, бардак, то и дело валится сеть Улыбаюсь

Вкратце -- обе задачи можно решить средствами клиент-сервеной архитектуры.

Пусть лицензиями заправляет сервер лицензий (например, так устроены лицензии для Rational Suite).  Существующего кода для проверки достаточно, надо только предоставить удалённый доступ/вызов.

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

PS: ты пишешь в постах rfc, но rfc != RPC Улыбаюсь rfc -- это совсем другое.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 31-05-2004 20:05 » 

npak,

perwoe - udachi w pereezde, eto wsegda bardak.
Wtoroe - izwini, s rpc nedogljadela  :oops:  Prosto u menja uge RFC kak strashnij son - snachala tolkom nikakoj dokumentazii net, poka razobralas, dumala, poubiwaju wseh, kto eto pridumal. teper wijasnjaetsja, chto eta chertowshina tolko w simhronnom wariante rabotaet, posemu i muchajus ja teper etoj mnogoprozessornoj durju  :twisted:

ja popitajus poiskat infu o rpc, a esli u tebja poluchitsja chto-to na etu temu w wide primera najti - budu shastliwa i ochen blagodarna.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 31-05-2004 20:19 » 

Malaja, опять мало времени -- деньги заканчиваются из дома выходить Жаль

RFC связаны с той программой, которой ты занимаешься?  Если да, то скажи номера, можно будет посмотреть, попробовать разобраться и помочь.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #12 : 31-05-2004 20:27 » 

npak,

da, eto swjazano smoej programmoj - opjat ge problema zakljuchaetsja w tom, kak sdelat tak, ctobi napisannij mnoj server dlja uprawlenija lizensijami ili dlja uprawlenija chugim PO startowal tolko odin raz.

Izwini, ja ne ponajla, o kakih nomerah ti goworish?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Anonymous
Гость
« Ответ #13 : 31-05-2004 22:16 » 

npak описал в общем что надо делать.
я лишь чуточку конкретизирую Улыбаюсь

Блокировка доступа к базе
Нужно создать приложение-сервер.
Его задача принимать от клиента запросы на выполнение определённых ф-ций, а именно ф-ций которые предоставляет "чужая" библиотека.
Если нужна синхронизация на уровне отдельных вызовов функций, т.е. не может одновременно вызываться из двух процесов\потоков функции библиотеки (бывают варианты, когда, например, между вызовами функций а1 и а2, нельзя вызывать никаких функций, потому что либа хранит какую-то информацию которая нужна для корректного вызова а2. В этом случае, описаный ниже простой подход не пройдёт), то его можно сделать однопоточным, приблизительный код

class Request
{
type // тип запроса (по одному на функцию "чужой" либы)
client // id клиента
params // параметры вызова
};

Request request;

while(!stop)
{
   request = getRequestFromClient();
   switch(request.type)
   {
       loadDB:
             if (!isDBLoaded())
                    LoadDB();
             clientCount++;
       closeDB:
              if (!--clientCount)
                     CloseDB(params.handle,params.name);
        saveDB:
              saveDB();
          etc...
         тут формируется ответ
   }
   ResponseToClient(response);
}

теперь ф-ции getRequestFromClient и ResponseToClient
их можно реализовать с помощью очереди сообщений.
в юниксе см. функции msgrcv http://www.rt.com/man/msgrcv.2.html
т.е. огранизовываешь очередь - клиенты посылают запросы, сервер по одному их обрабатывает.
Аналогично для ответов клиенту создаешь другую очередь. НО!
для передачи больших объёмов данных очередь не годиться. Надо использовать разделяемуюю память.
Код приблизительно такой.

struct msgparams
{
  int shared_memory_id;
  int message_length;
};

struct MsgStruct
{
  long mtype;
  union {
  char mtext[n];
  mgsparams params;
  }
};

getRequestFromClient()
{
  MsgStruct msg;
  msgrcv(incoming_message_queue_id, &msg,...);
  pmsg = shmat(msg.params.shared_memory_id,...)
  Request request = parseRequest(pmsg, msg.params.message_length);
  shmdt(pmsg);
  return request;
}

ResponseToClient(Response response)
{
  MsgStruct msg;
  msg.params.message_length = response.messageLength();
  msg.params.shared_memory_id = shmget(...);
  char* pmsg = shmat(msg.params.shared_memory_id,...);// в pmsg
   //запаковываются данные которые необходимо передать клиенту
  request.serialize(pmsg);
  shmdt(pmsg);
  msgsnd(outcoming_message_queue_id);
}

На стороне клиента надо сделать заглушки для функций, которые предоставляет чужая либа.

например
short seekStr_proxy(long* pHandle, const char* pStr, long* pCount);
{
  // сначала запаковываем в сообщение параметры
  MsgStruct msg;
  msg.params.shared_memory_id = shmget(...);
  char* pmsg = shmat(msg.params.shared_memory_id,...);
  (*(long*)pmsg) = pHandle;
  (*((long*)pmsg+1)) = *pCount;
   ...
   shmdt(pmsg);
   msg.params.message_length(2+strlen(pStr));
   msgsnd(incoming_message_queue_id,&msg,...)
   msgrcv(outcoming_message_queue_id,&msg,...)
   //тут достаём идентификатор разделяемой памяти
    получаем к ней доступ и достаём результат
    который и возвращаем
   pmsg =  shmat(msg.shared_memory_id,...)
   res = *pmsg;
   return res;
}

Писал-писал и теперь только заметил, что таки блокировка на уровне отдельных вызовов не катит Жаль. Ведь сначала надо сделать запрос  seekStr а потом взять ответ getRes.
В таком случае надо блокировать остальных клиентов пока тот кто сделал seekStr не заберёт свои данные с помощью getRes.
Подробно напишу завтра Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 01-06-2004 09:38 » 

Malaja, npak говорил о номерах RFC. RFC - это документы, описывающие сетевые стандарты в интернете.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #15 : 01-06-2004 11:14 » 

Narod, pogodite, ja sowsem zaputalas, izwinite menja, duru  :oops:

Problemi po ocheredi :

1) kak sdelat tak, chtobi tot server, kotorij ja napishu, bil zagrugen w pamjat tolko odin raz (dlja win i linux) ? t.e. pered ego zagruzkoj nado prowerit, a wdrug on uge giwet i w etom sluchae tolko poluchit handle, a ne sozdawat nowuju instanzij etogo servera.
teoreticheski, dolgni bit api - funkzii, kotorie pozwoljajut poluchit spisok tekushih prozessow, w kotorom po imeni mogno najti nugnij (esli on tam est) i wernut ego hande wiziwajushemu ego .exe

2) esli u menja est server, ja mogu prosto-naprosto, ne mudrstwuja lukawo, ispolzowat mutex/semaphore, ibo w etom sluchae ljuboj nowij zapros awtomaticheski okaziwaetsja w ocheredi. Ili ja neprawa?

3) esli eto ne tak, to kak organizowat ochered w winde?

Zaranee spasibo.

Гость, spasibo tebe za primer. ja poka ne do konza razobralas s twoim primerom po powodu pamjati. Esli chto-to ne pojmu - mogno zadawat woprosi?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 01-06-2004 12:06 » 

Malaja, самокритика - это хорошо, но не перебарщивай. Запуталась - так и скажи. Много нового узнать и научится применять в короткий срок нелегко.

1) Как его напишешь, так он и будет работать.
Чтобы проверить при его запуске, что он один такой, используются разные ухищрения. Это могут быть именнованные mutex-ы (в Win), "pid" файлы (в *nix), или другой любой именованный ресурс, доступный другим процессам. Работает так: программа проверяет, есть ли такое уже: если есть - завершается, если нет - создает это ресурс и работает дальше.

Вот что народ тебе советовал:  exe_program<->dll_client<~~~>exe_server

exe_server существует в одном экземпляре и управляет теми самыми файлами. Если он будет обрабатывать запросы последовательно, то конфликтов не возникнет.

exe_program - прога, которая будет работать с твоей dll-кой.

dll_client - посредник между exe_program и exe_server.

Прога может быть запущена где угодно в любом колличестве, а сервер только на одной машине.
Предположим, что клиент и сервер у тебя работают по TCP. В этом случае, сервер, приняв соединение, обслуживает его до конца, и, только закрыв его, берет следующее соединение.
Можно, конечно, и усложнить и сделать многопоточный сервер.

P.S.: транслит, честно говоря, замучил: я уже и сам не знаю о чем речь Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #17 : 01-06-2004 13:25 » 

RXL,

wo-perwih, izwini za translit - ne nauchilas ja eshe wslepuju pechatat po-rodnomu(ja potihonku uge pitajus doma uchit, no wed wremeni kak obicno ne hwataet - püosle raboti i rebenka ja uge ne wsegda pomnju, kak menja zowut   Вот такой я вот ), a po-drugomu ne mogu - u menja na rabote tolko nemezko-anglijskaja klawa Жаль

teper po powodu :
esli mi , naprimer, wistawim mutex pri starte perwoj instanzii .exe (t.e. ottuda budet wizwan server, kotorij etot mutex i ustanowit), to pri popitke iz wtoroj instanzii .exe startowat etot ge samij server emu pridetsaj podogdat, poka mutex ne oswoboditsja. W etom sluchae mi imeem wozmognost odnowremenno w pamjati imet ne bolee odnoj instanzii servera.

W obshem-to, eto uge to, chto nado. Problema wozniknet togda, kogda, naprimer, odna iz .exe - instanzij po kakoj-to prichine prekratit swoe sushestwowanie.
1) Pri etom woznikaet opasnost togo, chto mutex ostanetsja newikljuchennim. Pri etom poka kto-to pojmet, chto progu nado zapustit po nowoj, wse ostalnie budut wiset w ogidanii i wiletjat s timeoutom.
2) Dlja togo, chtobi etu problemu reshit, mogno pri starte .exe wsegda prowerjat nalichie wistawlennogo w signalnoe pologenie mutexa i pri nalichii takowogo ustanawliwat ego w nesignalnoe sostojanie. No pri etom mi mogem pomeshat rabote dejstwujushih instanzij .exe-programmi( t.e. nash nakriwshijsaj .exe eshe do togo, kak on umer, uspel za soboj ubrat swoj mutex, i na moment powtornogo starta on widit signalnij mutex, no wistawlen on wed ne im , a drugoj kopiej. No nash startujushij .exe etogo ne znaet i menjaet sostojanie mutexa, tem samim narushaja blokirowku)

Posemu wopros : kak wijti iz etoj situazii. Esli eto zamknutij krug, to kak eshe mogno opredelit, chto prozess uge giwet?
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #18 : 01-06-2004 13:37 » 

pardon, ja ne ponjala, kak, no menja opjat "gostem" nazwali, hotja ja iz sistemi i ne wishla Жаль
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 01-06-2004 13:49 » 

Цитата
esli mi , naprimer, wistawim mutex pri starte perwoj instanzii .exe (t.e. ottuda budet wizwan server, kotorij etot mutex i ustanowit), to pri popitke iz wtoroj instanzii .exe startowat etot ge samij server emu pridetsaj podogdat, poka mutex ne oswoboditsja. W etom sluchae mi imeem wozmognost odnowremenno w pamjati imet ne bolee odnoj instanzii servera.

Я не говорил "заблокировать", я говорил "создать". Это всего лишь признак, галочка, по которой вторая копия узнает что она не первая.
Я давно ничего не писал для Win и не помню как там функционируют мутексы, но наверняка они могут сбрасываться или коректировать свое значение на выходе.
Чтобы предотвратить падение сервера, а точнее востановить его после этого, можно использовать такую конструкцию: запускается программа, задачей которой будет запустить сервер, следить за его существованием и в случае падения запустить заново. Как более простая программа, она должна быть устойчивее.

Расскажу, как работают с pid-файлами в *nix:
При старте программы, она проверяет заранее известный файл на существование. Если он не существует, то она создает и записывает в него свой pid. Если же он существует, то она считывает оттуда pid и проверяет, что за процесс с этим номером (его наличие, имя файла).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #20 : 01-06-2004 14:49 » 

RXL,
mutexi analogichni semaphoram, posemu prinzip odin i tot ge.

Esli etot mutex sozdan kak galochka, to chto eto mne daet? Ja wed nichego togda ne kontroliruju.
Ja mogu takge, kak ti pishesh, sozdat fail, w kotorij budu wnosit handle Dlla.
Wopros w drugom - esli ja pri starte wtorogo .exe wozmu etot handle i popitajus s nim  obrashatjsja k toj zagrugennoj dll, to budet li eto rabotat?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 01-06-2004 19:50 » 

Malaja, ни чего не понимаю: причем тут dll и хендл процесса?
Если уж делать через файл, то тебе надо будет только убедиться, что такой процесс есть и имя файла этого exe-шника то.

У тебя простая задача: определить, запущена ли уже программа. Не стоит придумывать сложностей - чем проще, тем надежнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #22 : 02-06-2004 08:06 » 

RXL,
da, no znanie menja ne spasaet - nu znaju ja, chto etot prozess uge zapushen, a chto dalshe? gdat, poka on zakonchitsja? moget, ja neprawilno ponjala, no esli ug mi mogem shitat ID prozessa iz fajla, znachit, mi mogem ego i ispolzowat?

Izwini za neprohodimuju tupost, ne serdis na durnie woprosi, pogalujsta! Prosto ja hochu logiku dlja sebja ponjat :oops:
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 02-06-2004 08:17 » 

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #24 : 02-06-2004 08:41 » 

RXL,
ponjatno, no wed togda nado ispolzowat zapushennij? To est handle etogo prozessa dlja dostupa k nemu.

Ja popitajus izobrazit shemu dejstwij :

1-j .exe :                                              2-j .exe :
======                                              ======

start                                                      wipolnjaet analogichnie dejstwija
   :                                                         (t.e. esli handle sushestwuet, prosto    piatemsja zapuskatj server,                      ispolzuet ego, esli net - sozdaet nowij,
   uprawljajushij chem-to                           zapisiwaet ego w fail dlja drugih
   (license - dll ili chugim PO)                     prozessow, zatem ispolzuet ego dlja
      :                                                       raboti s serverom
      prowerka na nalichie faila
      i zapisej w nem :
           esli net - wnosim handle
           esli est - shitiwaem handle
     :
     s pomoshju poluchennogo handle
     (shitannogo iz faila(esli on uge tam
       bil) ili wnow poluchennogo) rabotaem
     s serverom

Ili eto newernaja shema?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #25 : 02-06-2004 13:58 » new

RXL,

poka ja tut pitalas hot chto-to ponjat, u menja poluchilis 2 shemi (ja, kak chestnaja, na primerah prowerila, esli prawilno i komu-to eshe nado - wilogu).

1) s pomoshju Mutex-ow (Semaphore - ow)
Код:
 
    // mi sozdaem perwij mutex dlja sinhronizazii zagruzki servera
    createMutex(hMut, "DLL_START_MUTEX");
   
        DWORD nResOfWait = WaitForSingleObject(hMut, INFINITE);
        if (nResOfWait == WAIT_OBJECT_0)
        {
                // zagrugaem server
                hLib = LoadLibrary(...);
                hLibTmp = hLib;
               
                // zdes mi shitiwaem / zapisiwaem PID dlja etoj Lib
                checkPID(&hLib);
               
                // esli lib uge w pamjati
                if (hLib != hLibTmp)
                    FreeLibrary(hLibTmp);
               
                // wizowi funkzij iz etoj Lib
                // ....
               
        }
   
    if (hMut)   
        nRes = releaseMutex("DLL_START_MUTEX")
       
        //  esli osnownoj mutex ne wikljuchen, to skoree wsego nashu lib mogno wigruzit
        if (nRes)
        {
                createMutex(hMut_2, "DLL_END_MUTEX");
                nResOfWait = WaitForSingleObject(hMut_2, INFINITE);
                if (nResOfWait == WAIT_OBJECT_0)
                {
                        FreeLibrary(hLib);
                       
                        // udaljaem handle nashej lib, t.k. ona uge wigrugena iz pamjati
                        deletePID();
                }
                if (hMut_2)   
                    releaseMutex("DLL_END_MUTEX")   
        }

2) s pomoshju lock - Funkzij. Mi ispolzuem pustoj fail prosto kak zaglushku -
                               s ego pomoshju mi osushestwljaem blokirowanie drugih
                               prozessow. Teoreticheski eto luch'she , chem mutexi, t.k.
                               dage pri neogidannom sriwe raboti kakogo-to iz prozessow
                               blokirowka budet snimatjsja awtomaticheski

Код:
 
    while(hFile == INVALID_HANDLE_VALUE)
    {
        hFile = CreateFile("Dummy.txt",     // open Dummy.txt
            GENERIC_READ,                   // open for reading
            0,                                              // do not share
            NULL,                                       // no security
            OPEN_ALWAYS,                  // open or create
            FILE_ATTRIBUTE_NORMAL,        // normal file
            NULL);                                  // no attr. template
    }

    while(nResult == 0)
    {
        nResult = LockFile(hFile, 0, 0, 500, 0);
    }

            hModuleTst = LoadLibrary("TestDll.dll");
           
            // zdes mi shitiwaem / zapisiwaem PID dlja etoj Lib - hotja ja dumaju, chto w etom
            //sluchae eto ne nado, t.k. poka fail zablokirowan, ni odin chugoj prozess wse
            //rawno nichego delat ne moget
            checkPID(&hModuleTst);
                       
            // wizowi funkzij iz etoj Lib
            // ....
   
            FreeLibrary(hModuleTst);
   
             // udaljaem handle nashej lib, t.k. ona uge wigrugena iz pamjati
            deletePID();

    UnlockFile(hFile, 0, 0, 500, 0);
    CloseHandle(hFile);


Koroche, glawnij wopros - eto wse werno ili net?
« Последнее редактирование: 28-11-2007 15:41 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines