Что происходит при запуске программы

Содержание

Я хотел бы собрать вот что происходит при запуске исполняемого файла на Windows, Linux и OSX. В частности, я хотел бы точно понять порядок операций: мое предположение заключается в том, что исполняемый файл формата (ПЭ, эльф или Маха-О’) загружается ядро (но я игнорирую различные разделы эльф(исполняемый и linkable формат) и их смысл), а то у вас динамический компоновщик, которые решает ссылок, то __init, а часть запускается исполняемый файл, то главное, тогда __Фини`, а затем программа завершится, но я уверен, что это’s очень грубо, и, наверное, неправильно.

Редактировать: вопрос теперь в CW. Я заполнения для Linux. Если кто-то хочет сделать то же самое для Win и OSX это было бы здорово.

38 2009-07-30T01:55:15+00:00 5
Редактировал вопрос 21-го августа 2014 в 3:57
Комментарии к вопросу (5)
Ответ на вопрос
30-го июля 2009 в 2:40
2009-07-30T02:40:31+00:00

Дополнительно

Это только на очень высоком и абстрактном уровне, конечно!

Executable — No Shared Libary: Client request to run application ->Shell informs kernel to run binary ->Kernel allocates memory from the pool to fit the binary image into ->Kernel loads binary into memory ->Kernel jumps to specific memory address ->Kernel starts processing the machine code located at this location ->If machine code has stop ->Kernel releases memory back to pool Executable — Shared Library Client request to run application ->Shell informs kernel to run binary ->Kernel allocates memory from the pool to fit the binary image into ->Kernel loads binary into memory ->Kernel jumps to specific memory address ->Kernel starts processing the machine code located at this location ->Kernel pushes current location into an execution stack ->Kernel jumps out of current memory to a shared memory location ->Kernel executes code from this shared memory location ->Kernel pops back the last memory location and jumps to that address ->If machine code has stop ->Kernel releases memory back to pool JavaScript/.NET/Perl/Python/PHP/Ruby (Interpretted Languages) Client request to run application ->Shell informs kernel to run binary ->Kernel has a hook that recognises binary images needs a JIT ->Kernel calls JIT ->JIT loads the code and jumps to a specific address ->JIT reads the code and compiles the instruction into the machine code that the interpretter is running on ->Interpretture passes machine code to the kernel ->kernel executes the required instruction ->JIT then increments the program counter ->If code has a stop ->Jit releases application from its memory pool

Читайте также:
Какие есть детские программы

Как routeNpingme говорит, регистры находятся внутри процессора и происходит волшебство!

Ничего не происходит при запуске exe файла на Windows 10

Обновление: да, я не могу speell правильно сегодня!

Источник: kzen.dev

Русские Блоги

[Подробный процесс запуска активности]: что происходит после нажатия значка приложения?

[Подробный процесс запуска активности]:

Что происходит после нажатия значка приложения на рабочем столе?

Рассматривали ли вы:

После того, как вы нажмете значок приложения на рабочем столе,

Что именно случилось? ? ?

С того момента, как вы убираете палец с экрана,

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

Что вы испытали? ? ?

Этот процесс от щелчка по значку приложения на рабочем столе до успешного отображения приложения,

Каждый из нас должен работать бесчисленное количество раз в день, и мы все слишком знакомы с этим.

Давайте проанализируем, что произошло в этом процессе ~!

В этой статье анализируются следующие проблемы:

Работа системы при запуске программы

  • Что такое ActivityThread, это поток и как он запускается?
  • Что такое ActivityClientRecord и ActivityRecord?
  • Что такое Context, ContextImpl и ContextWapper?
  • Что такое приборостроение?
  • Что такое приложение, когда оно было создано и сколько приложений у каждого приложения?
  • В чем разница между запуском действия, нажав Launcher, и запуском действия в приложении?
  • Процесс запуска активности, время обратного вызова onCreate (), onResume () и конкретная роль?

Launcher

Если вы не понимаете, как Android начинается с загрузки до запуска, пожалуйста, сначала прочтите егоПроцесс запуска Android-системы。

ЗАПУСК И ФУНКЦИОНИРОВАНИЕ ПРИЛОЖЕНИЯ

В общем случае время запуска приложения — это время, которое проходит от нажатия пользователем иконки приложения до отображения его интерфейса на экране. При этом выделяют следующие типы запуска:

  • Холодный запуск — данные о приложении отсутствуют в оперативной памяти или кэшэ ядра iOS. Обычно это происходит, когда приложение давно не запускалось или запускается первывй раз.
  • Теплый запуск — образ приложения присутсвует в кэшэ ядра iOS. Обычно это происходит, когда приложение запускалось недавно.
  • Горячий запуск — приложение находится в операвной памяти в состоянии background или suspended . Оно просто переводится в состояние foreground .
Читайте также:
Программа в домашних условиях

Процесс запуска приложения

В общем случае процесс запуска приложения состоит из следующих шагов:

  1. Запрос на запуск приложения. Им может быть запрос от пользователь (например, тап по иконке) или событие операционной системы (например, поступление push).
  2. подготовка образа приложения (pre-main time);
  3. запуск функции main() приложения, и соответственно, исходного кода приложения (post-main time).

Несмотря на то, что разрабатывая iOS-приложения на Swift у вас нет прямого доступа к функции main() , она все еще существует, но вызывается скрытно.

Pre-main time

В первую очередь в ОС cоздается процесс запускаемого приложения, в процессе чего под него выделяется виртуальное адресное пространство.

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

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

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

Измерение pre-main time

Для того, чтобы измерять время, затрачиваемое на pre-main, необходимо:

  • Перейти к настройкам текущей схемы.
  • В разделе Run , в вкладке Arguments добавить Enviroment Variables :
  • DYLD_PRINT_STATISTICS со значением 1 .

После этого в процессе запуска на консоли отобразится текст примерно следующего содержания:

Total pre-main time: 234.31 milliseconds (100.0%) dylib loading time: 225.03 milliseconds (96.0%) rebase/binding time: 126687488.9 seconds (141572795.5%) ObjC setup time: 10.89 milliseconds (4.6%) initializer time: 40.16 milliseconds (17.1%) slowest intializers : libSystem.B.dylib : 2.44 milliseconds (1.0%) libBacktraceRecording.dylib : 6.49 milliseconds (2.7%) libMainThreadChecker.dylib : 25.98 milliseconds (11.0%)

Post-main time

Post-main time включает в себя все, что происходит с приложением начиная с запуска функции main() и в общем случае включает в себя следующие шаги:

  1. Запуск функции main() .
  1. Запуск функции UIApplicationMain(_:_:_:_:) фреймворком UIKit . Данная функция принимает данные о запускаемом приложении и причине его запуска.
  2. Создается экземпляр типа UIApplication , соответсвующий приложению, и его делегат AppDelegate .

Одному приложению всегда соответствует только один экземпляр UIApplication .

  1. Если у приложения есть стандартный storyboard-файл, то происходит его загрузка.
  2. Вызовается метод application(_:willFinishLaunchingWithOptions:) .
  3. Вызывается метод application(_:didFinishLaunchingWithOptions:) .
  4. Создает делегат сцены SceneDelegate .
  5. Вызывается метод scene(_:willConnectTo:options:) , в котором создается экземпляр окна UIWindow и происходит загрузка интерфейса.

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

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

Процессы

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

Читайте также:
Как записать разговор на Айфоне без программ

Процесс — абстракция, объединяющее в себе независимое виртуальное адресное пространство в оперативной памяти и дополнительные ресурсы (например файлы).

Процесс — это экземпляр запущенного приложения.

Обычно запущенному приложению соответствует один процесс, но в некоторых случаях разработчиком (не под iOS) может быть реализована иной подход. Так, например, браузер Google Chrome для каждой вкладки создает отдельный процесс, чтобы исключить возможность взаимодействия вкладок между собой.

В iOS для одного приложения всегда создается только один процесс.

Процессы по умолчанию не могут взаимодействовать между собой и для организации этого взаимодействия требуется использовать дополнительные возможности, вроде общих файлов, сокетов (socket), портов (port). Так же в зависимости от используемой платформы могут быть доступны другие средства обмена. В iOS можно использовать Pipe, App Groups, Share Extension, Custom URL Scheme и другие.

В iOS и macOS все пользовательские процессы создаются процессом с названием launchd (PID = 1). Для создания дочерних процессов в macOS можно использовать класс Process . В iOS нет возможности самостоятельно создавать дочерние процессы.

После запуска в рамках процесс создается главный поток (thread), в рамках которого автоматически запускается RunLoop и в дальнейшем выполняются все инструкции.

Дополнительная информация

Источник: swiftme.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru