Работа непосредственно с хранилищем (добавление, извлечение, чтение истории) происходит в один поток. Запросы ставятся в очередь и постепенно выполняются. Внешние же запросы от клиента выполняются в потоке, обслуживающем конкретного клиента (соединившегося по TCP/IP), но работа с хранилищем все равно происходит с использованием критических секций (фактически, опять же создается глобальная очередь запросов).
Непосредственно файловые операции за пределами хранилища контролируются ОС (в случае, если служба копирует файл, а сторонняя программа пытается произвести запись).
Загруженности процессора в какой момент? В момент простоя? 0%. Никогда не понимал подобных характеристик.
Не перезагружал Windows около 10 сейчас, памяти выделено 3 мегабайта с копейками. Заметной нагрузки сервис не создает. Что с ним, что без него, разница «на глаз» не ощутима (при довольно слабом железе).
Вообще-то должны (у меня 100% добавляются). Попробуйте еще раз =) Обработка изменений идет не сразу, а где-то спустя 10-15 секунд.
В любом случае, строго не судите. Массового бета-теста не было (сам использую и несколько моих друзей).
При запуске служба инициализирует сервер TCP/IP и создает по одному монитору на логический диск. Мониторы работают в отдельных потоках, используют WinAPI функцию ReadDirectoryChangesW. Мониторы передают события основному управляющему объекту, который оставляет только нужные (согласно фильтрам Include и Exclude), классифицирует события, преобразовывает во внутренний формат и передает другому объекту, менеджеру хранилища.
Менеджер хранилища работает так же в отдельном потоке. Часть входящих событий сразу же пересылает на уровень ниже: объекту, управляющему хранилищем на низком уровне. Часть перемещается в «отстойник» (в основном, события изменения содержимого). Отстойник нужен для того, чтобы в хранилище добавлялись только более менее «стабильные» версии (к примеру, если за 10 секунд в файл будет сделано 3 записи, то сохранено будет только последнее состояние).
Сервер работает по протоколу TCP/IP (каждый клиент обслуживается отдельным потоком). Формат сообщений довольно простой (4 байта на размер, байт на тип, остальное уже зависит от типа сообщения). Команды от клиентов передаются менеджеру хранилища, тот опять же передает их на уровень ниже, получает результат и передает серверу. Текущая версия понимает только 2 команды: Timeline (передается имя файла или же путь, возвращается полная история версий для всех найденных файлов) и Restore (передается имя файла, timestamp, возвращается результат и timestamp ближайшей версии).
Текущая версия программы полностью ansi (использовался Delphi 7). В Delphi 2009 уже есть полная поддержка Unicode, перевести проект будет не очень сложно.
Если я только что написал огромный кусок кода, только только нажал в редакторе кнопку сохранить, а потом случайно затер файл старой версией с ftp, то встроенная в Windows система мне никак не поможет восстановить утерянное.
В хранилище так же хранятся полные версии файлов, если изменений слишком много (к примеру, если они составляют больше 30% от размера файла), или, если цепочка версий слишком длинная. Формат хранилища простой и, в крайнем случае, пользователь может найти и скопировать оттуда файл вручную (полные версий файлов отличаются специальным расширением).
Проект пока никакой. Последняя строчка кода была написано за день до защиты (было это давно). Сейчас появилось свободное время и решил довести какой-нибудь из старых проектов до ума. И хочется узнать, нужно ли кому-нибудь подобное и существуют ли близкие аналоги.
Во-первых, аналогов под Windows я не видел. Во-вторых, в 99.9% дипломных работ нет ничего нового (это все-таки не диссертация). Цель, в первую очередь, продемонстрировать и проявить на практике полученные знания и опыт. В реализации TimeMachine довольно много интересных моментов и это далеко не банальная задача. А совершенствовать систему можно практически бесконечно (механизм непрерывного резервирования, хранилище на удаленном ресурсе, протокол синхронизации с удаленным сервером, шифрование данных, интеграция с ОС).
Но для понимающих людей ясно одно: новые патентные иски против Google означают, что эта компания находится на верном пути.
Без исков «путь» был бы под сомнением? =)
Ага, это те же люди делают, которые пишут код типа if (booleanVar.toString().length() == 4 /* true */) {… } else if (booleanVar.toString().length() == 5 /* false */) {… } else { throw new Exception(«Fatal Error»); }.
А если программа получает адреса этих функций нестандартным способом (например, напрямик от GetProcAddr, а не импортом системной dll ), способ ведь не прокатит? Правильнее создавать виртуальный сетевой интерфейс, который будет работать через socks (типа как VPN), и редиректить вызовы программы на него (хотя тут наверно надо поддержку со стороны ядра винды).
Я и не говорил об изменении таблицы импорта. Патчится непосредственно код функции (ставится безусловный переход на функцию-обработчик с сохранением старых команд в отдельной области).
В данном случае, «правильнее» использовать LSP. НО внедрить DLL и перехватить функции можно на лету с довольно ограниченными правами (при чем в рамках конкретного приложения). А добавить, к примеру, собственный провайдер в цепочку на порядок сложнее и в случае какой-либо ошибки последствия будут «катастрофичны».
В любом случае, отладка — это не то чем занимается домашний пользоатель, и не то, что должно быть разрешено по умолчанию. Расширение функционала таким способом — ну явный изврат, согласитесь?
Если нет других способов и сделано грамотно и по всем правилам, то почему сразу «изврат»? Система обязана быть гибкой и позволять подобные манипуляции при наличии соответствующих прав у процесса.
Непосредственно файловые операции за пределами хранилища контролируются ОС (в случае, если служба копирует файл, а сторонняя программа пытается произвести запись).
Не перезагружал Windows около 10 сейчас, памяти выделено 3 мегабайта с копейками. Заметной нагрузки сервис не создает. Что с ним, что без него, разница «на глаз» не ощутима (при довольно слабом железе).
В любом случае, строго не судите. Массового бета-теста не было (сам использую и несколько моих друзей).
Менеджер хранилища работает так же в отдельном потоке. Часть входящих событий сразу же пересылает на уровень ниже: объекту, управляющему хранилищем на низком уровне. Часть перемещается в «отстойник» (в основном, события изменения содержимого). Отстойник нужен для того, чтобы в хранилище добавлялись только более менее «стабильные» версии (к примеру, если за 10 секунд в файл будет сделано 3 записи, то сохранено будет только последнее состояние).
Сервер работает по протоколу TCP/IP (каждый клиент обслуживается отдельным потоком). Формат сообщений довольно простой (4 байта на размер, байт на тип, остальное уже зависит от типа сообщения). Команды от клиентов передаются менеджеру хранилища, тот опять же передает их на уровень ниже, получает результат и передает серверу. Текущая версия понимает только 2 команды: Timeline (передается имя файла или же путь, возвращается полная история версий для всех найденных файлов) и Restore (передается имя файла, timestamp, возвращается результат и timestamp ближайшей версии).
Текущая версия программы полностью ansi (использовался Delphi 7). В Delphi 2009 уже есть полная поддержка Unicode, перевести проект будет не очень сложно.
www.apple.com/macosx/what-is-macosx/time-machine.html
В любом случае, уверен, что этот показатель не будет играть решающую роль при определении позиции.
Gmail его (спам) очень хорошо фильтрует (ежедневно в мою папку «спам» попадает около 100 писем). Ошибки случаются крайне редко.
Но для понимающих людей ясно одно: новые патентные иски против Google означают, что эта компания находится на верном пути.
Без исков «путь» был бы под сомнением? =)
Не надо обобщать.
Я и не говорил об изменении таблицы импорта. Патчится непосредственно код функции (ставится безусловный переход на функцию-обработчик с сохранением старых команд в отдельной области).
В данном случае, «правильнее» использовать LSP. НО внедрить DLL и перехватить функции можно на лету с довольно ограниченными правами (при чем в рамках конкретного приложения). А добавить, к примеру, собственный провайдер в цепочку на порядок сложнее и в случае какой-либо ошибки последствия будут «катастрофичны».
Если нет других способов и сделано грамотно и по всем правилам, то почему сразу «изврат»? Система обязана быть гибкой и позволять подобные манипуляции при наличии соответствующих прав у процесса.