Цитата: qurvax от 14.03.2019 22:07:19Палегче ) Да, по памяти там немножко криво все. Но можно почитать, разобраться, и все сойдеться. Если хотите, могу на выходных написать псто, что на самом деле эти цифири значат, вольным переводом из мной уже упомянутой книги. Теперь по поводу фактических несостыковок:
а) "одна и та же программа, при использовании 64битных переменных вместо 32битных начинает занимать в 2 раза больше памяти на одну и ту же работу" Это верно, если воспринимать дословно. Но вывод, что на 64битной ОС переменные вдруг становятся в два раза толще - неверный. Это не так, совсем. Переменные ж вообще дело не ОС, а погромиста Но я понимаю, о чем речь. О встроенных типах данных. Вроде int, long и т.д. Вот там влияние есть, но там все сильно сложнее. Таблицу размеров типов данных в винде х86 и х64 приводить не буду, ее можно легко нагуглить, если кому вдруг и правда интересно.
Я стараюсь использовать точные формулировки и, в данном случае, меня надо понимать дословно, попробую объяснить почему:
1) "поддержка 64 бит" - это наличие в процессоре инструкций (операндов) способных обрабатывать 64битные параметры(регистры) за 1 такт.
2) Не существует "типов данных в винде". Типы данных - свойство машинного кода генерируемого компилятором. В случае жабы и дотнета - свойство виртуальной машины получающей на исполнение промежуточный код (и самого промежуточного кода). Но не стоит забывать, что задача такой виртуальной машины - преобразование промежуточного кода в машинный, так что в итоге всё равно упирается в аппаратную реализацию процессора (набор доступных операндов+размер регистров).
3)
"Переменные ж вообще дело не ОС, а погромиста" (надеюсь
погромист - оговорка по Фрейду?). Переменные в программе - не что иное как выделенный участок в оперативной памяти строго заданного размера. Память в винде жёстко выделяется из "общей кучи" (heap) на каждый процесс и поток. Не стоит заблуждаться - не типизированные языки программирования - отдают привилегию определения типа компилятору, который обычно выбирает максимально возможный вариант "чтобы всё влезло". И да, абсолютно все используемые в коде переменные - это кусок в выделенной процессу памяти.
4)
"Вроде int, long и т.д. Вот там влияние есть, но там все сильно сложнее. " Тут нет никаких сложностей, раньше в большинстве компиляторов тип int занимал 16 бит, тип long 32 для 64 бит был отдельный (long long, int64). По мере схода с арены 16битных процессоров, программ и внедрения сначала 32, а потом 64битных инструкций, компиляторы меняли типы данных по умолчанию и сейчас "общепринято" int=32 бита, long=64.
5) Абсолютно все переменные в текущий момент времени исполнения - это ячейки памяти, соответствующего размера и целый тип long сейчас компилируемый будет занимать 64бита памяти на 1 переменную. Если код компилировать под win32 платформу с указанием типа long - будет по умолчанию использована длинна 32 бита. Одной и той же программы. Одного и того же компилятора. Одна и та же переменная ЦЕЛОГО типа будет занимать в 2 раза больше/меньше места в памяти в зависимости от платформы. Обратная сторона медали, если задано жёсткое соответствие типов и в программе строго прописан int32, int16,byte - они будут занимать одинаковое количество памяти для обоих платформ.
6) "К тому-же "занимаемая програмой" память - понятие комплексное". Понятие вполне реальное если представлять какие типы где используются и на что указывают. Действительно, при компиляции программы под 64 бита - объём занимаемой ей памяти возрастает не вдвое потому, что в программах используется не только "длинные целые" типы данных, но их не мало, если учесть, что все указатели тоже становятся 64битными. Откуда, собственно, возможность использовать больше оперативки? Это возможность в качестве адреса указывать число превосходящее диапазон 32бит (2 147 483 647байт). Отсюда же взялось в 32битной системе ограничение 2.1Гб на один процесс. В остальном, "прекрасная маркиза" - всяческие виртуальные области, совместное использование памяти разными программами - это выверты арбитра памяти ОС в интересах "оптимизации себя любимого", ни одна программа об этом доподлинно не знает, что кусок её массива вдруг уехал в виртуальную память (своп). Скажу больше, совместное использование общей области памяти даже в рамках 1 программы, но параллельных потоков - это вполне приличный геморрой с возможным блокировками и прочими ухищрениями. Отдельная и интересная тема в программировании - синхронизация параллельных потоков.
7) К слову "64битное ускорение" - это яблоко с той же яблони. Если раньше 1 операнд для обработки 1 числа диапазона 64 бит занимал 2 такта по 32(старший регистр и младший) ввиду того, что аппаратно его инструкция была так реализована, то "потом" его научили делать операцию за 1 такт со всем числом.
Цитата... Далее, "Привычные 2-10% показометра - это нагрузка создаваемая службами и вспомогательными приложениям.". Моя любимая тема Тут все сложно, если пытаться в процентах мерять. На самом деле нет никаких процентов. И никогда небыло. На совести маркетологов, гори они в аду. Реальную "загрузку создаваемую" отображает в повершеле команда get-process. В секундах. Там тоже есть нюансы, но в общем случае это время, которое все треды процеса пребывали в состоянии running, т.е. исполнялись на каком либо из ядер.
И тут всё тоже несколько неоднозначно. Что такое на самом деле "загрузка процессора"? Каждое реальное ядро процессора, каждый такт выполняет 1 операнд с текущей частотой, на которой в данный момент работает ядро (современные процы могут менять частоту ядер и отключать их по мере надобности). Если (Turbo boost) не активен, то 4хядерный процессор на частоте 3ГГц выполняет 4*3*10^9 инструкций в секунду. Всегда. В любом случае. Допустим в системе 100 процессов, 1000потоков(поток по сути тот же процесс, только с контекстом безопасности наследованным от родительского процесса и от него же зависимый). Вся эта тысяча параллельных потоков с определённой частотой попадает на 4 ядра, переключением завидует арбитр управления задачами ОС(и это не диспетчер задач). Как показывает get-process, большую часть времени процессор "простаивает"? Но остановится реально он не может, он всё равно исполняет положенных 12*10^9 операндов за секунду. Что же происходит? В свободное время он выполняет "пустую" инструкцию(nope). Следовательно - реальная "нагрузка" это отношение команд nope на конвейре ядра по отношению к общему числу операндов за единицу времени. Откуда его взять? Да ни откуда. В процессорах нет аппаратных счетчиков нагрузки и все эти секунды и проценты - берутся из арбитра управления задачами ОС, так как именно он решает когда переключить ядро на какой поток и делает это по своим алгоритмам. А посему - "они всё врут" если брать буквально.
Цитата...деза детектед. Этот показатель указывает, какую часть времени тред провел в режиме ядра. Например треды класических драйверов там проводят (почти)все свое время. Но (почти)любой тред туда переключатся хоть изредка. Бай дезайн. Как видим, к "ядру системы" (т.е. kernel, kernel executive, и windows subsystem (или lxss, или, ранее, posix даже)) сие отношение имеет чуть менее чем никакое.
Прежде чем словами кидаться, Вы, бы, любезный, изволили сначала ознакомится хоть с какой то информацией по вопросу "что такое режим ядра?".
Начните с простого -
вики и
хабра.
Когда осознаете - сами поймёте, что сморозили.
Цитата: Соколов Алексей от 15.03.2019 10:09:17... В том-то и дело, что никакой подготовки не потребовалось. А ту же XP, например, без сноса драйверов чипсета Вы на другую мать не перенесете, с вероятностью процентов в 90.
Это всегда было крайне зависимо от железа. Если установленные драйвера не вызывали bsod на новом железе (обычно при смене типа платформы) сразу, то они удалялись уже на новом месте после загрузки. При удалении драйверов винда заменяет жизненно важные драйвера стандартными, хоть как то работающими на любом железе, это делала и хрюшка и NT и все последующие одинаково (выпадали из общей картины только 2000 и Виста ввиду того, что сами по себе были нестабильны и вопрос драйверов там был не решён нормально). Естественно играть в рулетку желания не было, поэтому старались делать заранее, но не всегда была возможность. Через мои руки прошли сотни компьютеров (когда я ими ещё занимался) - поверьте, разницы между версиями виндов в этом вопросе нет.
ЦитатаЗато и использовать можно не 4 Гига оперативки, и даже не 8.
Кто бы спорил. Удобно. На мой взгляд гораздо важнее, что исчезает ограничение в 2.2 гига на процесс.
К слову, 32битная Enterprise версия Windows Server умела нормально работать сверх 32битных ограничений оперативки благодаря специальному механизму распределения памяти. Но ограничение на на процесс оставалось.
ЦитатаВы же сами заострили внимание на "сколько ОС оставляет ресурсов приложениям"? Я показал то, что наблюдаю в своей системе, и то что мы наблюдаем, показывает что особой разницы в объёме потребляемого на нужды ОС между 7 и 8.1 нет. Не согласны?
Не согласен.
По памяти 450-550 (7ка) против (750-850) чистая установка на 8 и 10.
Вот
тут попались скрины от 7ки.
Ещё было бы недурственно сравнить количество системных процессов и потоков, но такие скрины я сходу не нашёл.
З.Ы. Вопрос на любителя, но для меня +3-4сотни мегабайт, десяток процессов, 2-3 десятка потоков, 2-3 процента "холостого хода", пяток не отключаемых и не нужных мне свистелок, окончательный уход в тотальное шпионство почище Андроида - это недостаточная плата за корявые интерфейсы с нулевой эргономикой (для стационарного компа), при полном сохранении основной функции - обеспечении запуска и работы прикладных приложений. Впрочем, я не игроман и не могу оценить всех прелестей "очередного нового DirectX" (этот механизм поднятия продаж известен со времён хрюшки).