Опять о патентах
В последнее время прошло много дискуссий по поводу патентов на ПО. Но, оказывается, патенты в других областях науки не менее маразматичны.
Например, удивляют патенты на химические синтезы.
В последнее время прошло много дискуссий по поводу патентов на ПО. Но, оказывается, патенты в других областях науки не менее маразматичны.
Например, удивляют патенты на химические синтезы.
Читаю "Краткий справочник по физике" авторов Карякина, Быстрова и Киреева, издание 1964 года. Натыкаюсь на интереснейший момент:
"К методам ударных волн относятся способы получения высоких температур с помощью кумулятивных взрывов. На ампулу, содержащую дейтерий или его смесь с тритием, направляются кумулятивные струи от обычного взрывчатого вещества (тринитротолуол или любое другое не менее мощное взрывчатое вещество). Возникающая при этом температура оказывается достаточной для протекания термоядерной реакции как D+T, так и LiD. При этом выделяется большое количество энергии; регистрирующая аппаратура оказывается уничтоженной.
Кумулятивный взрыв может служить запалом и в водородной бомбе (так называемые "чистые" бомбы)."
А к Ирану пристают из-за какого-то обогащения урана :)
Основные недостатки микроядра:
1) Затрата времени на дополнительное переключение между задачами.
2) Трудности с синхронизацией.
Есть несколько предложений насчёт того, как от них избавиться:
1) а) Есть простые способы, позволяющие переключать задачи за десятки тактов вместо сотен и тысяч.
б) Можно использовать схему не "посылка сообщения клиентом -> ответ сервера", а схему с накоплением заданий. То есть, если процесс хочет получить страницу из определённого файла, то он добавляет запрос в список заданий демона файловой системы. Демон файловой системы удовлетворяет эти запросы по мере срабатывания дисковода. Чтобы не допустить зависаний, можно ограничить размер списка заданий каким-нибудь разумным пределом.
2) Все беды микроядра от того, что его пихают туда, куда не надо. Если что-то удобнее делать в "монолитном" ядре, то это надо делать там. Например, низкоуровневые части драйверов устройств.
Это, оказывается, не только годовщина Чернобыля. Интересно, почему защитники интеллектуальной собственности выбрали эту дату :)?
Как мне задать норму телесигнала PAL-B?
Такая ситуация: имеется локальная сеть. В ней есть сервер, у которого есть подключение к Интернету. На сервере стоит программа Traffic Inspector. Под Windows для неё есть клиентский агент, который позволяет подключиться через сервер к Интернету. Linux видит компьютеры в локальной сети, но я не знаю, как тут подключиться к Интернету...
Микрософ т делится своими соображениями:
http://www.microsoft.com/Rus/Government/Newsletters/Issue26/05.mspx
"В качестве программного обеспечения используются язык программирования Visual Basic for Applications (VBA) и табличный процессор Microsoft Excel.
Мы остановились на Microsoft Excel потому, что в этой среде можно решать разнообразнейшие задачи, а VBA был выбран нами из других языков программирования, так как он уже встроен в Microsoft Office, не требует дополнительной установки, позволяет показать детям способы написания (создания) собственного интерфейса, — поясняет О.Н. Волик."
Удалось сделать в userspace переключение задач за 44 такта (процессор Pentium IV Celeron). Это уже соизмеримо со временем простого выхова процедуры. Могло бы быть и меньше (порядка 11 тактов), если бы конвейер процессора не сбрасывался. Может, кому-нибудь будет полезно. Вот структуры данных (язык - Free Pascal): unit threads; interface const //размер стека в 32-х битных словах thr_st=1020; type //контекст задачи thr_task=record //место для стека st:array[1..thr_st] of pointer; //параметр param:pointer; //сохранённый указатель стека sp:pointer; //поддержка списка задач next, pred:^thr_task; end; var //выполняющаяся в данный момент задача thr_cur:^thr_task; Вот само переключение: procedure helper;assembler; asm mov esp,[eax+4084] //загружаем сохранённый указатель стека sub esp,8 //корректируем его end; //возврат произойдёт в новом стеке procedure schedule;assembler; asm mov eax,thr_cur //загружаем указатель на контекст текущей задачи mov [eax+4084],esp //сохраняем указатель стека текущей задачи. Потом в стек будет помещено содержимое регистра EBP и адрес возврата -> потом корректировка ESP на 8 mov eax,[eax+4088] //загружаем указатель на следующую активную задачу mov thr_cur,eax //следующая выбранная задача становится текущей push ebp //сохраняем указатель кадра стека call helper //выполняем собственно переключение задач pop ebp //восстанавливаем указатель кадра стека. Когда другая задача передаст управление этой задаче, она передаст его сюда. end;
При разработке ПО часто бывает удобно разбить сложную программу на несколько программных компонент, взаимодействующих путём обмена сообщениями.
У меня есть реализация кооперативной многозадачности (в данный момент для языка Free Pascal). Семафоры и передача сообщений реализованы, есть тестовые примеры.
Модуль не использует системные вызовы и привилегированные команды процессора, поэтому его можно компилировать под любую ОС.
Может, кто-нибудь ещё этим интересуется?
Посмотрел исходники ядра linux 2.4-20.8. Заметил одно место, которое, ИМХО, можно сделать попроще. Это - передача аргументов и переменных среды вызываемой функцией exec программе. Довольно сложная вещь с хранением строк в памяти ядра. Предлагается следующий способ, не требующий каких-то особых действий со стороны ядра. Короче: будем передавать аргументы в файле с дескриптором равным, например, 3. Перед вызовом exec этот файл создаётся, открывается, потом удаляется из ФС функцией unlink. Затем в него пишутся аргументы, потом вызывается exec, потом вызванная программа читает из него аргументы и закрывает. Конечно, может это и не особо нужно, раз уже так реализовано, ведь проще - не всегда лучше, но, по-моему, чем меньше используется невыгружаемой памяти, тем стабильнее система. Может, у кого-нибудь ещё есть соображения по этому поводу и вообще по поводу улучшения linux?