Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ос. Показать все сообщения
Показаны сообщения с ярлыком ос. Показать все сообщения

среда, 29 января 2020 г.

Как изменить скорость течения времени в системе?

#ос


Понятно, что на аппаратном уровне это достижимо.
Возможно ли сделать это на программном уровне: изменив драйвер системного таймера
или вроде того?
    


Ответы

Ответ 1



Ну, если менять исходник ОС (или библиотеки, которую использует эта программа), то запросто. Только все остальные программы тоже "замедлятся" в 10 раз.

Ответ 2



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

пятница, 24 января 2020 г.

Грузятся ли в .NET одни и те же DLL в разные процессы или совместно используются?

#net #ос


Тоненбаум в книге "Операционные системы" пишет, что ОС отслеживает DLL, которые используются
совместно разными процессами и не грузит в память N одних и тех же DLL.

Справедливо ли это для .NET?

Вроде, Рихтер писал, что для доменов приложения mscorlib общая, а все остальные DLL
грузятся повторно.
    


Ответы

Ответ 1



Обычные managed dll не разделяются между процессами, и загружаются в кажджый процесс заново, и каждый раз заново проходят через процедуру генерации нативного кода из IL. Сгенерированный машинный код также хранится в private памяти процесса, и не разделяется между приложениями. Если у вас много экземпляров приложения, и накладные расходы на повторную загрузку dll становятся проблемой - пройдитесь по сборкам утилитой ngen. Нативные сборки на выходе ngen - это обычные Windows PE dll, они вполне шарятся между процессами. Инсталлятор фреймворка запускает ngen при установке и самого фреймворка, и обновлений, выглядит это примерно так Так что скорее всего для всех стандартных сборок фреймворка у вас есть локальные native images, и они разделяются между процессами даже без ручного запуска ngen.

среда, 25 декабря 2019 г.

Защита памяти при сегментной организации

#ос #уязвимости #ассемблер


Приветствую.
Есть такая штука, как переполнение буффера: мы затираем адрес возврата в стеке на
какой-то другой, по которому расположены инструкции, которые мы хотим выполнить. И
скорее всего на адрес, который принадлежит сегменту стека (ну или кучи). Почему процессор,
когда EIP указывает на адрес не из сегмента кода, не паникует и не выдает ошибку сегментации?
Разве это не отслеживается флагами в дескрипторе сегментов?
Википедия говорит, что такой защиты нет, но тогда возникает разумный вопрос, почему?    


Ответы

Ответ 1



По поводу дискуссии, развернувшейся в комментариях (о случайном расположении стека в памяти), можно почитать про Address Space Layout Randomization. По поводу возможности или невозможности исполнения памяти мне было интересно почитать о PaX. Случайно наткнулся на статью Касперски Переполнение буфера на системах с неисполняемым стеком, теперь знаю много умных слов :)

Теоретический вопрос о “Copy On Write”

#ос #память #ассемблер #linux


Доброго времени суток.
После вызова fork() мы получаем два процесса с абсолютно идентичными адресными пространствами.
Давным-давно в BSD система реально выделяла нужное количество новой памяти и копировала
туда данные процесса-родителя во время вызова fork(). Сейчас есть технология копирования
при изменении. Мне вот что интересно:

Что именно копируется при изменении? Допустим мы вызвали функцию в дочернем процессе,
значит как минимум записали кое-что в стек. Ядро скопирует одну измененную страницу,
весь сегмент стека, все сегменты приложения или еще что-то?
Как происходит копирование? Неужели по-байтово? Или процессор может копировать например
целую страницу за 1 инструкцию? Я о таком никогда не слышал...
    


Ответы

Ответ 1



Копируется страница. Копирование исполняет тот же код, что и обычное копирование аргументов из пространства пользователя и по факту не отличается от быстрых вариантов реализации memcpy. Так для amd64 существует три реализации (вызываются из обработчика страничного прерывания, фактически отсюда): Базовая, copy_user_generic_unrolled общий алгоритм: копирование происходит через четыре 64-битных регистра по 64 байта за итерацию цикла. Базовая на основе строковых инструкций, copy_user_generic_string, с использованием rep; movsq. По факту копирование целой страницы происходит в течение выполнения одной микрокоманды — movsq. Алгоритм доступен на системах предоставляющих расширение rep_good (см. flags в /proc/cpuinfo). Быстрая на основе строковых инструкций, copy_user_enhanced_fast_string, аналогично предыдущей, но использует rep; movsb на системах, с поддержкой расширения erms (см. flags в /proc/cpuinfo) — особо быстрой системой реализации копирования.

Ответ 2



Копируется страница целиком. Как именно - скорее всего именно побайтово. Надо смотреть исходники ядра.

вторник, 24 декабря 2019 г.

Возможно ли создание ОС, запускающую исполняемые файлы от Win, Mac, Linux

#windows #ос #macos #linux


Возник спор, решил спросить у аудитории (:
В общем, чисто теоретически возможно ли создание ОС, у которой исполняемыми файлами
будут являться .exe .deb и т.п. и они будут корректно интерпретированы и подобающе
работоспособными?
Получается что-то наподобие "Кроссплатформенной ОС", оксюморон прям (:    


Ответы

Ответ 1



Существует же wine и разные его дериваты, которые худо-бедно позволяют на никсах запускать виндовские приложения. Что-то подобное есть и для маков. И на виндах есть способы запускать линуксовые приложения. Так что не только теоретически, но и практически уже нечто подобное существует, хотя и очень далекое от совершенства. ADDENDA: deb - это не исполняемый файл, а установочный пакет Linux Debian и его производных (например, Ubuntu).

Ответ 2



Конечно возможно. Но на пути будет множество сложностей и придётся проделать очень много лишней работы. Это было бы очень неэффективно с точки зрения ресурсов разработчиков. Создание действительно полноценной ОС требует довольно больших ресурсов и много времени, тестирования и т.п. Сделать две ОС в одной потребует ещё больше усилий и терпения. Но теоретически всё это возможно. Ничто не мешает реализовать разные системные API одновременно, поддерживать несколько моделей организации файлов, разных абстракций, реализовать иксы и т.п. На уровне ядра придётся также реализовать сразу два вида API чтобы драйвера в ядре могли работать и не мешать друг другу. С другой стороны есть вероятность, что всё же будут ограничения на уровне ядра, связанные с разной архитектурой. Однако на прикладном уровне думаю это возможно, более чем. Такие вещи как wine доказывают, что это возможно. Только очень уж мучительно будет.

Ответ 3



Наверное, да. Т.е. подсистемы типа wine, cygwin, interix существуют, подкрутить загрузчик (+ подключение соответствующих разделяемых библиотек) тоже можно, хотя, на практике геморроя будет много. Интереснее другое продолжение темы. Кроссплатформенный standalown модуль (естественно я имею в виду машинные коды и следовательно речь идет об одной и той же процессорной архитектуре). Возможно к такой штуке нужен будет миниустановщик (меняющий magic и если потребуется формат файла для загрузчика ОС) в зависимости от ОС. Идея состоит в том, что функция в точке входа определяет (сама, на лету) текущее окружение и "подстраивается" к нему. Очевидно, что система разработки (компоновщик и библиотеки) должна "обладать знаниями" о возможных целевых ОС. IMHO идея интересная, но дальше теоретических размышлений сам не двигался. На практике же широко используются интерпретаторы типа python, perl ...

воскресенье, 22 декабря 2019 г.

Многозадачность компьютеров

#многопоточность #таймер #ос


Насколько я понимаю, процессы в компьютере выполняются не совсем параллельно, а на
самом деле быстро переключаются между собой. Но в таком случае время на завершение
всех процессов все равно остается таким же, как если бы процессы работали последовательно.
Правильно ли я понимаю, что главная фишка этой как-бы "параллельности" в том что мы
можем не дожидаться пока некий процесс закончится а перейти на другой остановив предыдущие?
Какие еще преимущества у такого принципа "параллельности"?

В таком случае, если принцип как-бы "параллельности" верен, то разве в часах на компьютере
не должно накапливаться отставание?
    


Ответы

Ответ 1



Ответ зависит от того, что делают ваши процессы или потоки (давайте для простоты дальше будем говорить о потоках, которые в оригинале зовутся thread). Потоки будут выполняться действительно одновременно, если у вас есть больше одного ядра. Но в вопросе, как я понимаю, интересует ситуация, когда ядро одно. В этом случае некоторые потоки все равно могут выполняться параллельно. Например, пока жесткий диск читает данные или сетевая карта получает пакеты, то операционная система может переключиться на другой поток, и в таких задачах будет заметен выигрыш. Если вы отправили некоторые данные на звуковую карту, то можете пока заняться другими делами, пока она не проиграет полученный участок звука. Если же у вас несколько потоков, которые заняты в основном расчетами, которые занимают ядро процессора, то в этом случае выигрыша от распараллеливания не будет, и даже будет замедление, т.к. переключение между потоками - это не очень дешевая операция.

Ответ 2



Насколько я понимаю, процессы в компьютере выполняются не совсем параллельно, а на самом деле быстро переключаются между собой. В современных многозадачных операционных системах это действительно так, но в общем случае это зависит от операционной системы. Но в таком случае время на завершение всех процессов все равно остается таким же, как если бы процессы работали последовательно. Да, если вся полезная нагрузка процессов выполняется именно на процессоре. А это далеко не всегда так. Различный ввод-вывод приводит к простою процессора. Если во время этого простоя выполнять код другого процесса, можно сэкономить время. Правда, это не учитывает расходы времени на т. н. context switch ("переключение контекста", переход управления из процесса в процесс), так что чисто ЦПУшные задачи при "распараллеливании" окажутся даже медленнее. Правильно ли я понимаю, что главная фишка этой как-бы "параллельности" в том что мы можем не дожидаться пока некий процесс закончится а перейти на другой остановив предыдущие? Да, я выше примерно это и описал :) Другие процессы могут быть и не "силой" остановлены. Они могут остановиться сами в ожидании результата от ядра ОС. Какие еще преимущества у такого принципа "параллельности"? Вообще это не "параллельность" как таковая, но хорошего перевода правильного термина, concurrency, я пока не слышал. "Конкурентность" разве что. Concurrency имеет место, когда код структурирован не для последовательного выполнения, а содержит определённые "разветвления" и "соединения", разные ветки которых могут (потенциально) исполняться параллельно. Однако не обязаны. И описанный вами механизм как раз позволяет "конкурентному" коду ужиться на одном процессоре. Достаточно часто конкурентный код используется в рамках одного процесса (в разных потоках [thread]), в котором поддерживается какой-то интерфейс пользователя (UI), а из него запускается какая-то рабочая нагрузка. Они оформляются конкурентно, чтобы интерфейсом можно было пользоваться даже когда программа занята какой-то работой. Однако это "преимущество" строится скорее на способе определения понятия "процесс". Скажем, в Linux различий между "процессом" и "потоком" минимум: у них всех есть собственные "process ID", хотя снаружи их не всегда видно, т. к. перечислители процессов стараются отдельные потоки не показывать, за ненадобностью. Но этот же принцип встречается и в несколько неожиданной форме: интерпретаторы некоторых языков, в частности Ruby (MRI), JS (V8) и Python (CPython), реализованы с применением Global Interpreter Lock, и из-за этого интерпретатор в каждый момент времени может заниматься выполнением только одного потока кода. Это существенно упрощает реализацию интерпретатора и взаимодействующего с ним кода (расширений на С, например), хотя и ставит дополнительные ограничения. В таком случае, если принцип как-бы "параллельности" верен, то разве в часах на компьютере не должно накапливаться отставание? Да нет, там всё в порядке, поддержкой часов обычно занимается отдельное устройство (RTC с батарейкой), а не процесс. Иначе как бы часы шли, когда компьютер выключен? Впрочем, это легко выяснить. К примеру, на всех моделях Raspberry Pi часы при каждом включении приходится выставлять заново. Там реализована поддержка часов при включенном устройстве, но отдельного источника питания для них нет. Похожим образом будет себя вести и обычный настольный компьютер, если извлечь из материнской платы батарейку.

вторник, 10 декабря 2019 г.

ОС для ПК с ОЗУ 8 мегабайт [закрыт]

#linux #ос


        
             
                
                    
                        
                            Closed. This question is opinion-based. It is not currently
accepting answers.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Want to improve this question? Update the question so
it can be answered with facts and citations by editing this post.
                        
                        Closed 2 года назад.
                                                                                
           
                
        
Имеется компьютер начала 90-х, который планируется использовать в качестве "микро"контролера
хотелось бы иметь возможность писать скрипты на bash и пользоваться сетью. ОЗУ всего
8 мегабайт, загрузка возможна с hdd. 
    


Ответы

Ответ 1



Компьютер x86-совместимый? Есть подборка микро-дистров, многие из которых умещаются в 8Mb оперативной памяти, В частности Fd Linux на базе Red Hat (8Mb RAM) или PiTux (4Mb RAM). Fd Linux — довольно специфичный дистр: сеть есть, bash есть, но поддержки дисков нет. В PiTux, как известно, нет ни дисков, ни сети из коробки.

воскресенье, 1 декабря 2019 г.

Как объединить мощность нескольких компьютеров под управлением одной Linux системы?

#linux #сеть #администрирование #железо #ос


В офисе валяется куча ненужных, рабочих системных блоков. Вот я и решил объединить
их в единую вычислительную сеть,  а по сути в обычный компьютер управляемый единой
ОС, но представляющий собой 3+ системных блока. 

Итог: Мне нужно что бы 5+ коробок работала как одна, при этом я не хочу управлять
каждым серваком отдельно, моя цель единая машина состоящая физически из нескольких
под управлением одной системы. Что она будет делать? Да что угодно, хоть пусть будет
web сервером с ip в интернете или просто рабочей станцией Ubuntu или fedora
    


Ответы

Ответ 1



обычно решения строятся от задачи, а не от платформы что конкретно вы хотите делать? из личного опыта -- анализ логов на биллинге, и ретарификация: делал ручным шардингом на уровне приложения (скрипты на Python), на пачке списанных десктопов, аккаунте на конторском IBM eServer, и паре десктопов под windows. если у вас межсоединения на древнем 100mbit ethernet, а не как минимум 1G (не говоря уж о спецжелезе типа Infiniband) -- дешевле будет пойти в магазин, купить самую поганую материнку и набить ее памятью под завязку, съэкономите на дорогом быстром 1G свитче и энергопотреблении ваш вариант конфигурации может быть эффективен только в одном случае: все параллельные потоки полностью независиммы, и каждый блок задачи польностью влазит в ОЗУ и ресурсы одного узла, неплохо решаются вычислительные задачи с полным отсутствием зависимостей в архитектуре "одна нода - один расчетный блок" с другой стороны, в качестве кластерной рабочей станции подобная утилизация вполне интересная и имеет право на жизнь, и может оказаться выигрышным вариантом: на рабочей станции активно не более 2-3 тяжелых задач, остальные ресурсы тратятся на хранение гигабайтных вкладок в браузере, текстовые редакторы и редкие пробежки утилит по файловой системе https://en.wikipedia.org/wiki/Single_system_image https://en.wikipedia.org/wiki/Distributed_operating_system https://en.wikipedia.org/wiki/Multikernel Linux реализаций похоже нет: https://en.wikipedia.org/wiki/OpenMosix (R.I.P 2008, kernel 2.4) так что решение задачи в оригинальной постановке сводится по факту к освоению системного программирования в полном объеме: написать аналог ядра Linux обеспечивающий весь необходимый функционал DOS, адаптировать базовые библиотеки в т.ч. из поставки копиляторов GNU (libc, libatomic, gomp,...) и пересобрать всю систему до состояния, когда сможет работать весь компплект ПО который вы используете возможно более простым решением может оказаться написание слоя виртуализации: переписать только слой всех системных библиотек, который использует ваше прикладное ПО, с реализацией функционала distributed POSIX поверх обычных дистрибутивов, поставленных на каждый узел, или гипервизоров (желаю много весеслья с исходниками Xen и libgcc/libstdc++ 8-) с практической точки зрения: ищите задачи с минимальным объемом обмена данными между потоками, и пишите свое ПО: смотрите в сторону готовых распределенных платформ для веб/микросервисов, требующие для работы минимальных ресурсов перетаскивайте бизнес-процессы в вашей конторе на веб-технологии, чтобы можно было раздать хилое железо юзерам в качестве терминалов/запускалок браузеров к сожалению, насколько знаю бесплатных реализаций распределенного Smalltalk не существует, а то бы в первую очередь посоветовал его -- как вариант, искать библиотеки для программирования на распределенном обмене сообщениями между объектами для mainstream языков

Ответ 2



В таком виде - в котором вы спрашиваете: решения будут неэффективными. Системы из множества компьютеров(серверов) делаются отдельно, под каждую задачу свои, мало того программы - для работы которых и создаётся такая система - тоже пишутся именно под определённые системы серверов. Называются они "высоконагруженные системы", и их создание/использование - это очень дорогой процесс, который называется "масштабирование". Крупнейшие примеры таких систем - социальные сети: например работу VK обеспечивает 10к машин, но сравнимых по мощности с домашним компьютером(как утверждают владельцы). Да и сам StackOverflow конечно работает не на одном сервере. Если вам действительно интересно масштабирование: то стоит на крутом уровне освоить системное администрирование, docker, а также почитать лирику на тему хайлода https://ruhighload.com/scale

Ответ 3



Ответ сводится к тому, что Вам необходимо создать кластер компьютеров под управлением какой-либо Linux-like OS. Вот несколько готовых решений: [useless link: has been removed]. Кластер в домашних условиях. Для справки: Вики (Кластер). Описывать весь процесс в ответе особого смысла нет. Думаю, мой ответ вам полезен.

Ответ 4



Скорее всего энергоэффективность (и, возможно, надежность) такой системы будет слишком низка. Задача кластерных систем - достичь такой вычислительной мощности и отказоустойчивости, которой сложно (или невозможно) достичь средствами одного современного сервера. А для утилизации старого железа лучше применить другие способы ;)

понедельник, 1 апреля 2019 г.

Как изменить скорость течения времени в системе?

Понятно, что на аппаратном уровне это достижимо. Возможно ли сделать это на программном уровне: изменив драйвер системного таймера или вроде того?


Ответ

Ну, если менять исходник ОС (или библиотеки, которую использует эта программа), то запросто. Только все остальные программы тоже "замедлятся" в 10 раз.

вторник, 27 ноября 2018 г.

Защита памяти при сегментной организации

Приветствую. Есть такая штука, как переполнение буффера: мы затираем адрес возврата в стеке на какой-то другой, по которому расположены инструкции, которые мы хотим выполнить. И скорее всего на адрес, который принадлежит сегменту стека (ну или кучи). Почему процессор, когда EIP указывает на адрес не из сегмента кода, не паникует и не выдает ошибку сегментации? Разве это не отслеживается флагами в дескрипторе сегментов? Википедия говорит, что такой защиты нет, но тогда возникает разумный вопрос, почему?


Ответ

По поводу дискуссии, развернувшейся в комментариях (о случайном расположении стека в памяти), можно почитать про Address Space Layout Randomization. По поводу возможности или невозможности исполнения памяти мне было интересно почитать о PaX. Случайно наткнулся на статью Касперски Переполнение буфера на системах с неисполняемым стеком, теперь знаю много умных слов :)

понедельник, 15 октября 2018 г.

ОС для ПК с ОЗУ 8 мегабайт [закрыт]

Имеется компьютер начала 90-х, который планируется использовать в качестве "микро"контролера хотелось бы иметь возможность писать скрипты на bash и пользоваться сетью. ОЗУ всего 8 мегабайт, загрузка возможна с hdd.


Ответ

Компьютер x86-совместимый? Есть подборка микро-дистров, многие из которых умещаются в 8Mb оперативной памяти, В частности Fd Linux на базе Red Hat (8Mb RAM) или PiTux (4Mb RAM).
Fd Linux — довольно специфичный дистр: сеть есть, bash есть, но поддержки дисков нет. В PiTux, как известно, нет ни дисков, ни сети из коробки.