Какова роль ОС, когда JVM выполняет приложение Java? А зачем нам ОС? - PullRequest
15 голосов
/ 09 января 2012

Я немного читал в Интернете, и некоторые люди говорят, что Java-приложение выполняется виртуальной машиной Java (JVM). Слово «выполнить» меня немного смущает. Как я знаю, не-Java-приложение (т.е. написанное на C, C ++ ...) может быть выполнено операционной системой. На более низком уровне это означает, что ОС загрузит двоичную программу в память, а затем направит ЦП на выполнение инструкций в памяти.

Итак, что теперь будет с JVM? Как я знаю, JVM (содержит среду выполнения) будет вызываться в первую очередь ОС. С этого момента JVM создаст один (или несколько) потоков для приложения. Интересно, роль операционной системы вступает в игру? Мне кажется, что JVM «обошла» ОС и напрямую проинструктировала ЦП выполнить приложение. Если так, зачем нам ОС?

Пройдя немного дальше, JVM будет использовать свой JIT для компиляции байтовых кодов приложения в машинные коды, а затем исполнять эти машинные коды. Поскольку это уже машинные коды, нужна ли нам JVM? Потому что вместо JVM ОС может дать команду ЦПУ выполнить эти машинные коды. Я здесь ошибаюсь?

Я хотел бы узнать больше от людей здесь. Пожалуйста, поправьте меня, если я ошибаюсь. Большое вам спасибо!

Ответы [ 6 ]

4 голосов
/ 09 января 2012

Нам нужна ОС для всего того, что может делать программа на C или C ++.По умолчанию JVM делает еще несколько вещей, но не заменяет ничего, что делает ОС.Единственная разница может заключаться в том, что иногда у вас есть Your Code [вызывает] JVM [вызывает] OS, или со скомпилированным кодом вы можете иметь Your Code [вызывает] OS

Точно так же в C ++ у вас может быть Your Code [вызывает] Boost [вызывает] OS.

Когда ваша программа работает в собственном коде, ей как таковая JVM не нужна.Это хорошо, потому что JVM знает, когда «отойти» и позволить приложению работать.Однако не вся программа будет скомпилирована в собственный код на весь оставшийся срок службы приложения, поэтому она вам все еще нужна.

Можно использовать обходные устройства / драйверы ядра с JNI, ноJava напрямую не поддерживает такую ​​функцию.

3 голосов
/ 09 января 2012

Мне кажется, что JVM "обошла" ОС и напрямую поручить ЦПУ выполнить приложение. Если так, зачем нам OS

Все двоичные файлы C / C ++ (не только JVM) запускаются непосредственно на процессоре. После запуска эти программы могут обращаться к большему количеству машинного кода, предоставляемого операционной системой, для выполнения таких полезных задач, как чтение файлов, запуск потоков или использование сети.

JVM преобразует программу Java в инструкции, которые выполняются на процессоре. За кулисами, тем не менее, потоки Java, файловый ввод-вывод и сетевые сокеты (и многие другие) содержат инструкции, которые обращаются к коду, предоставленному операционной системой для потоков / файлов / и т. Д. Это одна из причин, по которой вам все еще нужна ОС.

Поскольку это уже машинные коды, нужна ли нам JVM?

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

1 голос
/ 09 января 2012

Ну, я хочу, чтобы все было просто. Как вы программировали в ZX Spectrum, то есть в старые времена, когда на самом деле вы не используете ОС (даже до эры DOS, в эпоху до ПК). Вы пишете свой код, и вы должны управлять всем. Во многих случаях не было компилятора, поэтому ваша программа была интерпретирована.

Далее было понято, что ОС - отличная вещь, и программы стали проще. Кроме того, компилятор был в более широком использовании. Я говорю о C ++, например. В этих программах, если вам нужно вызвать какую-то функцию ОС, вы добавили нужную библиотеку и сделали свой вызов. Один из недостатков, когда ваша программа зависит от ОС, другая проблема заключалась в том, что ваши программы включают OS DLL в некоторой фиксированной версии. Если другая программа на той же станции требует, чтобы DLL в другой версии, у вас были проблемы.

В первые годы истории JVM не использовался JIT-компилятор. Итак, ваша программа работает в интерпретированном режиме. Вашему приложению больше не нужно напрямую вызывать ОС, вместо этого оно использует JVM для всего, что ему нужно. Вместо этого JVM перенаправляет некоторые вызовы приложений в ОС. Думайте о JVM как о посреднике. Одна из лучших особенностей JVM - универсальность. Если вам не нужно придерживаться определенной ОС (хотя на практике вам нужно внести некоторые незначительные изменения, когда вы не придерживаетесь требований Java, в то время как ваша программа «иногда» работает в какой-то конкретной ОС, например, вы используете C: \ для файлов или предположений в планировщике потоков, что в текущей ОС соответствует действительности, но обычно JVM не гарантируется как истинное). Программисты JVM разрабатывают такой API, который, с одной стороны, может быть простым в использовании для разработчика Java, и с другой стороны можно будет сопоставить любые системные вызовы ОС .

JVM предоставляет вам более простую оболочку для ОС. Например, у него есть собственная модель памяти (синхронизация потоков), которая имеет несколько недельных грантополучателей (она была полностью пересмотрена в JDK 1.5, потому что она была повреждена). У него также есть сборщик мусора, он инициализирует переменные нулевыми значениями (int i; я буду инициализироваться 0). Это то, что JVM помимо того, что является модератором ОС, действует как вспомогательный код для вашего собственного приложения.

В какой-то момент JIT был добавлен. Он был добавлен для уменьшения накладных расходов, создаваемых JVM. Когда некоторые предположения выполняются, обычно после одного выполнения кода, интерпретация команды может быть скомпилирована в машинный код (я пропускаю фазу байтового кода). Это оптимизация, и я не знаю ни одного случая, где вы могли бы повлиять.

В JDK 1.6 добавлена ​​еще одна оптимизация. Теперь некоторые объекты при некоторых обстоятельствах могут быть размещены в стеке, а не в куче. Я не знаю, может быть, у него есть побочные эффекты, но это пример того, что JVM может сделать для вас.

И мое последнее замечание. Когда вы компилируете свой код, что действительно происходит, ваша программа проверяется на синтаксическую корректность, а затем генерируется байт-код (файл .class). Язык Java использует подмножество существующих байт-кодов (так был реализован AOP, используя существующие байт-коды, которые не являются частью языка Java). Когда Java-программа выполняется, эти байтовые коды интерпретируются , они транслируются на лету в машинные инструкции. Если JIT включен, то некоторые из строк исполнения могут быть скомпилированы для машинного языка и использованы повторно вместо интерпретации «на лету».

1 голос
/ 09 января 2012

Базовая базовая операционная система по-прежнему должна выполнять почти все для JVM, не в последнюю очередь:

  1. Ввод / вывод
  2. Управление памятью
  3. Создание потоков (если используются собственные потоки)
  4. Совместное использование времени - то есть позволяет запускать более одного процесса

и многое другое, кроме!

0 голосов
/ 14 марта 2019

Поскольку это уже машинные коды, нужна ли нам больше JVM? скомпилированные Java-программы не являются машинными кодами.[javac] скомпилируйте файл [.java] в файл байт-кода [.class]. Затем эти байт-коды передаются в JRE [среда выполнения Java].Теперь в действие вступает Java-интерпретатор, который интерпретирует байт-код в машинный код, работающий на ЦП.

0 голосов
/ 29 августа 2014

Поскольку мы знаем, что ОС не выполняет какую-либо программу, она предоставляет Среду для процессора для выполнения, если мы говорим о Среде, она выделяет файл загрузки памяти, давая инструкции процессору, Управление адресом
из загруженного метода данных работа Процессора является только выполняющейся программой, это происходит на языке c или на любом процедурном языке программирования, если мы видим, что ОС играет очень важную роль в этих накладных расходах на ОС Потому что, если мы напишем небольшую простую программу на языке c, например Hello World, которая будет содержать только одну функцию Main, когда она скомпилируется, сгенерирует .exe-файл более чем одной функции, взятой из функции Library, так что управлять всем этим с помощью ОС - утомительная работа, поэтому в JVM облегчение ОС здесь работа ОС только для загрузите JVM с жесткого диска в RAM и заставьте jvm выполнить и выделить место для JVM для выполнения Java-программы. Распределение Momery, загрузка файла байт-кода с жесткого диска, управление адресами, выделение памяти и выделение памяти выполняется самой JVM, поэтому ОС свободна, она может выполнять другую работу. Распределять или освобождать память в зависимости от того, что ОС предоставила для выполнения Java-программы.

если мы говорим о выполнении, JVM содержит интерпретатор, а также JIT-компилятор, который преобразует байт-код в машинный код требуемой функции после выполнения метода. Исполняемый код этого метода уничтожается, поэтому мы можем сказать, что в java есть файл .EXE.

...