Цитата: DarkRaider от 15.03.2019 23:14:25Я стараюсь использовать точные формулировки и, в данном случае, меня надо понимать дословно, попробую объяснить почему:
1) "поддержка 64 бит" - это наличие в процессоре инструкций (операндов) способных обрабатывать 64битные параметры(регистры) за 1 такт.
2) Не существует "типов данных в винде". Типы данных - свойство машинного кода генерируемого компилятором. В случае жабы и дотнета - свойство виртуальной машины получающей на исполнение промежуточный код (и самого промежуточного кода). Но не стоит забывать, что задача такой виртуальной машины - преобразование промежуточного кода в машинный, так что в итоге всё равно упирается в аппаратную реализацию процессора (набор доступных операндов+размер регистров).
Да лааадно?
А тут о чем?
https://docs.microso…25d93e4ba2Или тут?
https://docs.microso…ew=vs-2017Таки существуют
Но если вы о регистрах, то давайте о регистрах. Я не против
Вот без жаб и дотнетов давайте обойдемся, т.к. совершенно лишний слой.
Цитата: DarkRaider от 15.03.2019 23:14:253) "Переменные ж вообще дело не ОС, а погромиста" (надеюсь погромист - оговорка по Фрейду?).
Это просто мое любимое словечко. Не сильно люблю этих, ввиду постоянного пребывания вблизи результатов их жизнедеятельности. Достаточно дипломатично?
Цитата: DarkRaider от 15.03.2019 23:14:253) Переменные в программе - не что иное как выделенный участок в оперативной памяти строго заданного размера.
Память в винде жёстко выделяется из "общей кучи" (heap) на каждый процесс и поток. Не стоит заблуждаться - не типизированные языки программирования - отдают привилегию определения типа компилятору, который обычно выбирает максимально возможный вариант "чтобы всё влезло". И да, абсолютно все используемые в коде переменные - это кусок в выделенной процессу памяти.
Память какая? Под переменные? Или вообще? А как же VirtualAlloc? Так не обязательно из кучи, наверное, да?
Цитата: DarkRaider от 15.03.2019 23:14:254) "Вроде int, long и т.д. Вот там влияние есть, но там все сильно сложнее. " Тут нет никаких сложностей, раньше в большинстве компиляторов тип int занимал 16 бит, тип long 32 для 64 бит был отдельный (long long, int64). По мере схода с арены 16битных процессоров, программ и внедрения сначала 32, а потом 64битных инструкций, компиляторы меняли типы данных по умолчанию и сейчас "общепринято" int=32 бита, long=64.
Да, компиляторы и разницу в них я как-то упустил из виду. Но, вернемся к нашим баранам, написаное вами ведь не означает автоматического увеличения потребной памяти в 2 раза изза x64. Согласны?
Цитата: DarkRaider от 15.03.2019 23:14:255) Абсолютно все переменные в текущий момент времени исполнения - это ячейки памяти, соответствующего размера и целый тип long сейчас компилируемый будет занимать 64бита памяти на 1 переменную. Если код компилировать под win32 платформу с указанием типа long - будет по умолчанию использована длинна 32 бита. Одной и той же программы. Одного и того же компилятора. Одна и та же переменная ЦЕЛОГО типа будет занимать в 2 раза больше/меньше места в памяти в зависимости от платформы. Обратная сторона медали, если задано жёсткое соответствие типов и в программе строго прописан int32, int16,byte - они будут занимать одинаковое количество памяти для обоих платформ.
Я так понимаю, это означает, что никаких в 2 раза не будет и близко.
Цитата: DarkRaider от 15.03.2019 23:14:256) "К тому-же "занимаемая програмой" память - понятие комплексное". Понятие вполне реальное если представлять какие типы где используются и на что указывают. Действительно, при компиляции программы под 64 бита - объём занимаемой ей памяти возрастает не вдвое потому, что в программах используется не только "длинные целые" типы данных, но их не мало, если учесть, что все указатели тоже становятся 64битными. Откуда, собственно, возможность использовать больше оперативки? Это возможность в качестве адреса указывать число превосходящее диапазон 32бит (2 147 483 647байт). Отсюда же взялось в 32битной системе ограничение 2.1Гб на один процесс. В остальном, "прекрасная маркиза" - всяческие виртуальные области, совместное использование памяти разными программами - это выверты арбитра памяти ОС в интересах "оптимизации себя любимого", ни одна программа об этом доподлинно не знает, что кусок её массива вдруг уехал в виртуальную память (своп). Скажу больше, совместное использование общей области памяти даже в рамках 1 программы, но параллельных потоков - это вполне приличный геморрой с возможным блокировками и прочими ухищрениями. Отдельная и интересная тема в программировании - синхронизация параллельных потоков.
Понятие да, реальное. Но комплексное
Я в курсе за ограничение, откуда и почему оно. Тут спорить не буду. Считаете за выверты - ваше право. По мне так вполне внушающая и, внезапно, довольно надежно работающая технология.
Цитата: DarkRaider от 15.03.2019 23:14:257) К слову "64битное ускорение" - это яблоко с той же яблони. Если раньше 1 операнд для обработки 1 числа диапазона 64 бит занимал 2 такта по 32(старший регистр и младший) ввиду того, что аппаратно его инструкция была так реализована, то "потом" его научили делать операцию за 1 такт со всем числом.
Термин "64битное ускорение" как-то прошел мимо меня. Удивительное рядом
Цитата: DarkRaider от 15.03.2019 23:14:25И тут всё тоже несколько неоднозначно. Что такое на самом деле "загрузка процессора"? Каждое реальное ядро процессора, каждый такт выполняет 1 операнд с текущей частотой, на которой в данный момент работает ядро (современные процы могут менять частоту ядер и отключать их по мере надобности). Если (Turbo boost) не активен, то 4хядерный процессор на частоте 3ГГц выполняет 4*3*10^9 инструкций в секунду. Всегда. В любом случае. Допустим в системе 100 процессов, 1000потоков(поток по сути тот же процесс, только с контекстом безопасности наследованным от родительского процесса и от него же зависимый). Вся эта тысяча параллельных потоков с определённой частотой попадает на 4 ядра, переключением завидует арбитр управления задачами ОС(и это не диспетчер задач). Как показывает get-process, большую часть времени процессор "простаивает"? Но остановится реально он не может, он всё равно исполняет положенных 12*10^9 операндов за секунду. Что же происходит? В свободное время он выполняет "пустую" инструкцию(nope). Следовательно - реальная "нагрузка" это отношение команд nope на конвейре ядра по отношению к общему числу операндов за единицу времени. Откуда его взять? Да ни откуда. В процессорах нет аппаратных счетчиков нагрузки и все эти секунды и проценты - берутся из арбитра управления задачами ОС, так как именно он решает когда переключить ядро на какой поток и делает это по своим алгоритмам. А посему - "они всё врут" если брать буквально.
Это все примерно так (только процессор не всегда "молотит", C-state'ы забыли, и паркинг, ага). Ну и хотплаг проца. Вот непомню, винда умеет в него или нет.
Цитата: DarkRaider от 15.03.2019 23:14:25Прежде чем словами кидаться, Вы, бы, любезный, изволили сначала ознакомится хоть с какой то информацией по вопросу что такое "режим ядра".
Начните с простого вики и хабра.
Когда осознаете - сами поймёте, что сморозили.
Ась? Я тащемта вроде в курсе, что такое "режим ядра", и чем он отличается от "Ядра операционной системы и служебных компонентов"(цитата неточная, бо по смыслу). Ничего вроде не сморозил. Ткните носом, если что.
Кстати, подсказка от "морозящего", про перенос платформ: разведка сообщает, что раньше у винды вроде бывали разные HAL'ы...
И еще, порылся в книжке на предмет "откуда брать "нагрузку"". В TCB есть поле, зовется cycletime, смещение 0х048. Тоже может врать, если треду не дали довыполняться до отмеренного ему времени (quantum), и выпнули на мороз, но не сильно. Вот оттуда и считают, если по людски.
Отредактировано: qurvax - 16 мар 2019 00:54:11
Консервированный чужой. Осторожно запах!