Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт авг 17, 2017 12:46 am

Часовой пояс: UTC+03:00




Начать новую тему  Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ 16 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 10:06 am 
Не в сети

Зарегистрирован: Пт фев 20, 2015 1:44 pm
Сообщения: 10
И так, у меня в планах написать такую утилиту которая будет передавать рабочий процесс на другой комп(допустим в одной локальной сети). Как это будет работать: На обоих компах есть программа которую будем передавать(допустим калькулятор)>передаются все переменные на второй комп, после запускается программа на втором компе с места где она остановилась.
Сейчас вы можете написать предложения.
П.С.
Пишу на Си.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 10:45 am 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 156
geri777 писал(а):
И так, у меня в планах написать такую утилиту которая будет передавать рабочий процесс на другой комп(допустим в одной локальной сети). Как это будет работать: На обоих компах есть программа которую будем передавать(допустим калькулятор)>передаются все переменные на второй комп, после запускается программа на втором компе с места где она остановилась.
Сейчас вы можете написать предложения.
П.С.
Пишу на Си.

Можно попробовать через http.obj.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 10:55 am 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Не все приложения таким образом можно перенести. Будут отличаться системные объекты: id процесса, id окна, хендлы сокетов, данные при работе с файловой системой.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 11:28 am 
Не в сети

Зарегистрирован: Пт фев 20, 2015 1:44 pm
Сообщения: 10
Veliant писал(а):
Не все приложения таким образом можно перенести. Будут отличаться системные объекты: id процесса, id окна, хендлы сокетов, данные при работе с файловой системой.

А зачем одинаковые ID процесса и окна?


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 3:41 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 429
И состояние памяти процесса придётся передавать. По сути реально всё. При условии, что программа в том же месте находится на другом компе. А то прога себя же не найдёт. Хотя перенести не всё можно, да. Те, кто использует какой-то специфичный драйвер, например. Короче, всё, что в ядре перенесено не может быть. Ну и надо следить, чтоб все выделенные куски памяти были выделены в тех же местах, что и на первом компе. Например такая ловушка: прога выделила 2 куска памяти, удалила первый кусок. Тут её клонировали на второй комп, и он копировал прогу, и выделил ту память, что 2ом куске. А находится он будет не там, где он был в оригинале. Он займёт место сразу памяти проги, то есть на месте первого куска. Короче адреса изменяться, после запуска прога наверняка рухнет.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 5:37 pm 
Не в сети

Зарегистрирован: Пт фев 20, 2015 1:44 pm
Сообщения: 10
GerdtR писал(а):
И состояние памяти процесса придётся передавать. По сути реально всё. При условии, что программа в том же месте находится на другом компе. А то прога себя же не найдёт. Хотя перенести не всё можно, да. Те, кто использует какой-то специфичный драйвер, например. Короче, всё, что в ядре перенесено не может быть. Ну и надо следить, чтоб все выделенные куски памяти были выделены в тех же местах, что и на первом компе. Например такая ловушка: прога выделила 2 куска памяти, удалила первый кусок. Тут её клонировали на второй комп, и он копировал прогу, и выделил ту память, что 2ом куске. А находится он будет не там, где он был в оригинале. Он займёт место сразу памяти проги, то есть на месте первого куска. Короче адреса изменяться, после запуска прога наверняка рухнет.

Я знаю о проблеме ячеек пам'яти. Я знаю что нада писать в свободные ячейки а не в те же которые были на 1 компе.
Еще вся программа будет останавливаться полностю перед тем как передеть все состояние.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 6:26 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1163
На первый взгляд всё довольно просто: нужно передать содержимое всей выделенной памяти процесса, кроме самого кода... хотя нет, можно тупо всю память процесса вместе с кодом, тогда наличие программы на втором компе вообще не потребуется. Ну и содержимое регистров, естественно. Но. Правильно сказали про ID процессов. Что ты будешь делать, если требуемые ID уже заняты другими программами?


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Пт сен 11, 2015 7:25 pm 
Не в сети

Зарегистрирован: Пт фев 20, 2015 1:44 pm
Сообщения: 10
Pathoswithin писал(а):
Что ты будешь делать, если требуемые ID уже заняты другими программами?

А почему б не использовать другой ID?


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Сб сен 12, 2015 12:04 am 
Не в сети
Mentor

Зарегистрирован: Вт мар 11, 2014 11:37 am
Сообщения: 164
This is an interesting problem to solve. I have often wondered through school how to perform this (on a linux machine). But as others have pointed out, it's kinda tricky.

Well, consider a small program which is like this :

/* smallprogram.c */
Код:
/* Assume suitable headers for system calls */
/* getpid() gets the caller's Process ID */

int main()
{
int my_pid = getpid();   /* Line 1 */
printf("My PID is : \n%x" , my_pid); /* Line 2 */

/* my_pid variable is at an address 0x000000F0 */
/* printf function definition (libc) is loaded at an address 0x00AA0000 */
}


Now say, you run this program on MACHINE-1 and want to break after Line 1.
my_pid has been set to the current process ID on MACHINE-1 . Assume my_pid = 120.

Your registers and assembly of the program are set up according to current state of MACHINE-1.

Shifting this to MACHINE2 (Say you are able to perform a 1:1 copy somehow of the memory space):

MACHINE2 has:
libc loaded at 0x00BB0000.
130 processes running. So the next available pid will be 131.
Assuming everything else is the same as MACHINE1. (Very difficult in reality, but let's assume)
---
Some issues (There may be more) :

*As soon as your program tries to continue execution on MACHINE2, it will crash (as some other memory address is CALLED instead of print() )

*EVEN IF you were able to run without the issues you faced with libc, the value of my_pid is 120 (migrated from MACHINE-1). But the actual PID on MACHINE2 is 131. So all code that follows Line2 and uses the value of my_pid will behave in an irresponsible/unexpected manner.
---

A valid approach here might be to have some sort of a "CONTAINER" (jail, chroot, virtual memory space, or something along these lines) which is able to run a program inside it. But you write the container in such a way, that it automatically *fixes* all the addresses of the program running inside this container (or the approach is universal, and does not require address fixing in any manner).

Hope this helps.

_________________
---
Check out the Netsurf Web Browser for KolibriOS.
Read the wiki and happy hacking with KolibriOS!


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Сб сен 12, 2015 12:13 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1163
Ну, такой программе, как калькулятор, это действительно пофиг. Но если прога имеет больше одного потока, да хоть открыла дочернее окошко, то смена ID сломает связь между ними.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Сб сен 12, 2015 6:06 pm 
Не в сети

Зарегистрирован: Чт мар 05, 2015 9:02 pm
Сообщения: 29
выделить немного места в памяти для служебных данных. Эти служебные данные будут содержать адрес компа, ID и прочую инфу для совместимости.
Сами служебные данные никак не должны зависеть от ID.
Думаю, нужно это дело реализовать на уровне ядра.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Вс сен 13, 2015 12:30 pm 
Не в сети

Зарегистрирован: Пт фев 20, 2015 1:44 pm
Сообщения: 10
ruwebstyle писал(а):
выделить немного места в памяти для служебных данных. Эти служебные данные будут содержать адрес компа, ID и прочую инфу для совместимости.
Сами служебные данные никак не должны зависеть от ID.
Думаю, нужно это дело реализовать на уровне ядра.

Если мне кто-то из hard программистов поможет ибо я боюсь лезть к ядру...


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Вс сен 13, 2015 10:16 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1163
Если реализовывать на уровне ядра, то нужно делать серьёзную надстройку, чтоб все системные вызовы проверялись на "перенесённость". Возникает вопрос: для каких целей нам нужны такие возможности? Не проще ли создать формат "переносимых программ"? Добавить в заголовок бинарника таблицу ID процессов и прочих "региональных данных", которые будут редактироваться при переносе. Также добавить флаг, который будет запрещать перенос, если эти данные используются в данный момент.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Вт сен 15, 2015 7:29 am 
Не в сети

Зарегистрирован: Пн фев 16, 2009 5:40 am
Сообщения: 74
Не программист, но может что то годное выражу:

а) Запуск копии ядра с программой в своей V86 машине. Тогда не будет проблем с ID.
Спойлер: Показать
Сохранение:
1) сохраняется память занятая ядром со всеми "переменными";
2) сохраняется память занятая требуемой программой и её данными (тут же возникнет проблема, если программе потребуется файл с данными, лежащий где то, например её ini`шка);

Востановление:
1) востановили на отдельной страницы памяти ядро с данными
2) востановили программу с данными
3) передали управления процедуре востановленного ядра, где указали, что оно нынче не основное, находится по такому то смещению (на такой то странице памяти) и должно все системные вызовы транслировать(преобразовывать адреса и т.п.) в ядро "верхнего уровня", после чего оно продолжает исполнять программу, которая нечего не подозревая работает далее, имея в своём "виртуальном мире" тот же id, ту же версию ядра, те же функции и данные по тому же адресу, и т. п.

По хорошему программа со всеми данными должна лежать в определённом каталоге/рам-диске/и т.п., чтоб всегда могла найти свои файлы по одному пути. Реализуя этот принцип мы вводим понятие "рабочая папка", в которой находится программа и её данные, а также файлы и "ссылки" на них (таблица преобразования имён каталогов/id разных процессов и т.д.) И открывая и закрывая эту "рабочую папку", убераем/востанавливаем все программы и данные в ней. (как в полуоси :) )

P.S. Возможность "заморозить" состояния ПК со всеми программами, передать его по сети/флешку/голубями на другой ПК и продолжить работу с того же места - это круто, но думаю очень непросто в реализации.

P.P.S. пришло на ум запускать виртуалку (qemu), сохранять в ней состояние машины и этот файл перекинув по сети востановить в другой виртуалки на другом компе. Для этого надо всего та собрать для колибри qemu :)

б) Реализовать "vnc-сервер", на ядре, которое по мимо экрана, ещё "рисует" в сетевые порты.
Спойлер: Показать
Например - вещаем по порту 10 000 + id процесса. На втором компе подключаемся к требуемогу порту.
Тогда наличие такой же программы на втором ПК необязательно. Данные перекидывать необязательно. Но к сожалению работать и сохранять результат программа будет "на сервере", хотя тут же "под шумок" можно реализовать "монтирование" "серверных" (ram)дисков.

в) Записать и воспроизвести макросы.
Спойлер: Показать
При запуске программы записывать движение мышки относительно элементов окна и нажатия клавиш.
Перекинуть этот файл по сети и на втором ПК, и там запустив туже программу "сэмулировать" движение мыши и нажатия клавиш.
Только как быть с данными, которые программа берёт не от пользователя. Например запустив текстовый редактор и загрузив в него текст мы его немного поправели, тогда для продолжения "правки" на другом ПК, нам нужно будет или тащить правливаемый файл или ту его часть, которая загружена в буфер редактора, но тогда мы его полностью не востановим.


Вернуться к началу
 
 Заголовок сообщения: Re: ServiceProccesGet
СообщениеДобавлено: Вт сен 15, 2015 3:31 pm 
Не в сети

Зарегистрирован: Вс авг 09, 2015 3:41 pm
Сообщения: 79
Бредовая идея. Программы не живут в вакууме, они работаюм в определенном программно-аппаратном окружении и если программа получает данные извне себя, то она уже не может быть просто так "передана" по сети. Единственный вариант это идея с передачей снапшотов виртуальной машины по сети (вместе с носителями информации если потребуется).


Вернуться к началу
 
Показать сообщения за:  Поле сортировки  
Начать новую тему  Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ 16 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB