Victor_VG:
Vlimiik
Подсистема управления памятью появилась ещё в первых ОС, например она уже была в IBM S/360 PCP (однозадачная, с пакетным запуском задач), затем в многозадачной ОС IBM S/360 MFT (мультипрограммирование с фиксированным числом задач) и OS/360 MVT (мультипрограммирование с переменным числом задач) она была усовершенствованна. А OS/360 появилась как-то в начале 60-х и уже в ней были встроенные средства снижения фрагментации памяти - диспетчер задач читал в её главном управляющем блоке JCB (Job Control Block) необходимый для запуска задачи размер памяти, а в управляющих блоках DCB (Device Control Block) список необходимых для работы задачи периферийных устройств и если ОС не могла выделить память одним фрагментом или какое-то устройство было недоступно, то её запуск откладывался до того момента, пока все необходимые ресурсы не станут доступны. При запуске задачи память выделялась непрерывным блоком адресов, хотя после задача могла запросить у ОС выделение дополнительной памяти, например для рабочих буферов или запуска динамически модифицируемого (машинной командой EXEC) программного кода. Но в любом случае память для задачи выделялась непрерывным блоком адресов что объясняется очень просто:
при создании машинного (исполняемого) кода транслятор (они разделяются на два принципиально разных типа:
1) компилятор - читает исходный код на языке программирования и подставляет вместо его операторов реализующие их блоки машинных команд, формирует таблицу символических имён переходов со строками вида LABEL :: NAME, составляет таблицу внешних по отношению к данному модулю вызовов со строками вида MODULE :: LABEL :: NAME и записывает двоичный модуль во входной редактора связей (линкера), а тот анализируя таблицы связей и внешних вызовов вычисляет и заменяет символические имена переходов на их относительные адреса и записывает готовый к выполнению модуль в выходной файл;
2) интерпретатор - читает одну или несколько строк исходного текста содержащие полное предложение входного языка и немедленно выполняет его, а после цикл чтение - выполнение повторяется до конца исходного текста. Работает значительно медленнее компилятора, но удобен например при отладке алгоритма программы. интерпретаторы реализуют скриповые и такие языки как Basic.)
решает задачу трансляции ("перевода") программы с языка программирования в исполняемый машинный код и на этом его работа завершается. А уже дальше в дело вступает загрузчик который читает готовый к выполнению модуль, смотри его таблицы ссылок и запрашивает у диспетчера памяти ОС необходимый для запуска программы блок памяти. Затем он копирует код в данный блок и настраивает адреса вызовов и переходов заменяя их относительные значения на абсолютные LOAD_ADD + ADDR с учётом адресов загрузки всех внешних модулей и завершается сообщив диспетчеру задач об успешности загрузки. А уже тот, смотрит есть ли сейчас возможность запустить данную задачу или нет и если такая возможность есть запускает её.
Да, в OS/360 и не только в ней есть такие понятия как [i]реентерабельньй[/i] ("параллельно-входовый", не изменяемый в ходе выполнения код, что позволяет одновременно использовать его в нескольких задачах т.к. обрабатываемые данные или изменяемый в процессе выполнения код располагаются в динамически получаемых рабочих буферах), реенфлешный ("повторно-входовый" код - может изменяться в процессе счёта, но перед завершением восстанавливается в исходное состояние), оверлейный ( "оконный", сегментно-загружаемый имеющий) код рабочие сегменты которого загружается в специальную область - оверлейное окно что позволяет запускать программы размер кода которых превышает размер доступного на машине ОЗУ. Такие модули включают специальный оверлейный загрузчик который постоянно находится в памяти задачи и по мере необходимости загружает её сегменты сходно системному загрузчику, только он настраивая адреса работает в диапазоне адресов оверлейного окна. Такой модуль компилируется с опцией overlay и выполняется дольше обычных.
Создатели ОС для микроЭВМ (а все ПК относятся к этому классу ЭВМ т.к. класс ЭВМ определяется числом доступных на ней периферийных устройств: микро ЭВМ - до тридцати, мини ЭВМ - до трёхсот, миди или средние ЭВМ - до тысячи, большие или майнфреймы - свыше тысячи) упростили их ОС приняв за основу постулат - "Микро ЭВМ это однопользовательская система и все решаемые на ней задачи целиком размещаются в ОЗУ вместе со всеми данными и кодом, разделяя его с ОС и буферами ввода-вывода периферийных устройств. А любые более сложные или ресурсоёмкие задачи решаются на других ЭВМ.". Это и создало предпосылки для возникновения проблемы "Нехватка ОЗУ".
BorlandIMHO
При оптической печати с плёнки на бумагу определяющим является не разрешение - число точек развёртки матрицы аппроксимации изображения, а контрастность, оптическая плотность и дефекты исходного негатива т.к. хотя размеры зерна эмульсии фотобумаги и плёнки сходны, при печати происходит линейное масштабирование проецируемого негатива и видимые размеры всех его элементов становятся больше.
insorg
И правильно:) при разрешении 600 dpi (~ 400 lpi) размер пикселя становится соизмерим с диаметром человеческого волоса и с расстояния в 35 - 40 см они визуально "почти не различимы", а тонер аль чернила экономятся.:) Хотя по совести чтобы сделать пикселы не заметными на глаз нужно чтобы их размер был менее 30 мкм, т.е. разрешение печати должно быть выше 1200 dpi, а это уже параметры доступные в основном лазерным/светодиодным принтерам - для струйной технологии потребуются не только сверх малые диаметры сопел, но и специальные составы чернил которые будут иметь малую растекаемость капли, мелкий размер зерна краски, не будут быстро засыхать в печатной головке, позволят сформировать каплю очень маленького объёма, будут хорошо смачивать поверхность подложки. А это куча вопросов к химии, да и конструкция - не всем и не сразу это удаётся сделать, да и замена оборудования на фирме это перестройка рабочих процессов - дополнительные затраты, на что понятно бизнес идёт крайне неохотно...