Техника psdm: как решать сложные проблемы и принимать правильные решения

Знание Оболочки

Прежде чем мы углубимся в подробности использования оболочки, давайте сделаем шаг назад и получим небольшой контекст.

Мы общаемся с компьютером практически каждый день дома или в офисе. Каждый раз, когда нам требуется открыть файл, мы используем текстовый процессор или просматриваем Интернет, нам нужен способ предоставления компьютерных инструкций.

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

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

Одним из этих уровней является ваша операционная система — например, Windows, macOS или Linux.

Многозадачность и справедливость

Итак, представим, что у нас есть N процессов и 1 процессор.
Нам нужно поделить время процессора между всеми процессами справедливым образом.
То есть каждому по 1÷N. Однако, пусть мы и справедливы, и все процессы равны,
но некоторые всё же “равнее” — есть процессы с низкой потребностью в
отзывчивости и ресурсе CPU, есть же критичные — задержку работы которых
пользователь сразу заметит. Поэтому процессы приоритезируются.
Тогда наша формула принимает следующий вид:
“Процент времени процесса = Приоритет ÷ Сумма приоритетов”.

Но это в идеальном мире. В реальности же процессы вольно или невольно
стараются получить времени больше, или же отдают управление раньше
(через тот же sched_yield), чем им выделено.
Тем не менее, за условной “справедливостью” следить нужно.

При этом от времени процессора также “откусит” и сам планировщик —
мы уже видели, что сама операция переключения рабочего процесса довольно
затратна. Плюс ещё нужно рассчитать порядок выполнения — работа алгоритма
расчёта также займёт какое-то время.

Есть 2 основных подхода к многозадачности: кооперативный и вытесняющий.
В кооперативной многозадачности процессы сами решают, когда они готовы отдать
управление. В вытесняющей многозадачности планировщик ведёт подсчёт времениисполнения процессов (с помощью таймера) и сам прерывает рабочий процесс, когда
тот выходит за выделенный лимит.

Кооперативная многозадачность

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

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

Среди примеров ОС, работающих по такому принципу — Windows 3.* Кто-нибудь слышал
или даже знаком с этой веткой Windows?

К примеру, для переключения между тредами может быть использована команда
ThreadSwitch. Текущая задача остаётся активной (готовой) и передаёт управление
следующей готовой задаче. Хоть внутри и выполняются низкоуровневые операции, для
языка программирования высокого уровня данная функциональная возможность
выглядит как обычная функция.

Из очереди тредов берётся новый из начала, текущий помещается в конец.
Текущий стек сохраняется в предварительно подготовленный map
(словарь — ), из этого же map берётся адрес
стека для нового треда, кладётся в регистр SP (stack pointer),
запускается новый тред.

К слову, и в Linux можно попросить ОС забрать управление у треда досрочно
с помощью вызова .

Все помнят, что такое очередь? Как работает FIFO?

Аналогично работает в современных языках программирования
высокого уровня таких как ECMA Script, Python3 и т.д.
На команде управление передаётся следующему исполняемому потоку.
Внутри событийной петли (по сути — той же очереди) они кружат,
выполняясь один за другим.

Вытесняющая многозадачность

Из плюсов — бó‎льшая привязка к реальности (планировщик следит за реальным
временем исполнения процесса), а значит более прогнозируемая отзывчивость.
Также выше стабильность — если какой-то процесс завис —
он будет «выедать» только отведённое ему время.

Однако, если размер кусков, на которые мы нарезаем процессорное время мал,
то из-за частых смен задач (смен контекста) можно получить потерю
производительности.

За счёт прогнозируемости и отзывчивости данный подход распространился
на почти все современные ОС.

Говоря о расходе времени при переключении контекста, как вы думаете, на чём же больше всего теряется время?

Основные типы Shell

Текстовая (CLI)

Текстовая оболочка (или интерпретатор команд) представляет собой приложение с интерфейсом командной строки , которая выполняется в текстовом терминале . Типы пользователей в команде, или требования к выполнению программы или выполняемая программа отображается в терминале данных.

Один из самых известных CLI является традиционная «командная строка», которая хорошо известная специалистам , знакомым с операционными системами DOS (MS-DOS , DR-DOS , FreeDOS). Для пользователей MS-DOS и некоторых пользователей систем Microsoft Windows текстовой оболочкой является программа command.com . Даже системы семейства Windows NT имеют оболочки текст, например программа cmd.exe.
В UNIX и UNIX-подобныхоперационных система есть несколько видов текстовых оболочек. Среди наиболее известных — Bash (Bourne-Again Shell) или Korn-оболочка , но есть и другие , такие как С -оболочка , с набором основных функций и параметров. Есть также мощные инструменты, позволяющие связать различные программы для выполнения сложных задач. Современные текстовые оболочки обладают следующей эргономической характеристикой:

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

В текстовых оболочках системы Unix интегрирован язык сценариев , с которыми вы можете написать реальные программы , которые могут, например ,автоматизировать задачи системного администрирования, что упрощает взаимодействие с системой. Синтаксис этого языка является продолжением того, который используется в интерактивном режиме, так что, кто знаком с интерактивным использованием оболочки легко для себя сможет составлять различные сценария взаимодействия.
Некоторые из особенностей текстовой оболочки системы Unix были приняты в той или иной степени от текстовых оболочек для систем Microsoft Windows , но есть продукты , которые предлагают Unix-подобную среду (и связанные с ними оболочки ), как, например, проекта Cygwin, или даже Microsoft Windows Services для UNIX.

Графическая (GUI)

Графическая оболочка представлена или так называемая GUI ( графический интерфейс пользователя , графических пользовательских интерфейсов), которые сопровождаются проработанным визуальным интерфейсом и позволяют воспринимать человеческому сознанию предлагаемые функции и инструменты более естественно и наглядно. В оболочках такого рода присутствуют элементы интерфейса взамен строкам текста, которые предоставляют функционал тех самых строк, а следовательно напрямую завязаны с ядром операционной системы или основным приложением, что позволяет выполнять сложные операции «двумя» кликами мыши. Основным недостатком GUI является их высокое потребление вычислительных ресурсов компьютера: она тяжелее и глобальной сетью можно удаленно управлять только за счет производительности и крайне высокой оптимизации. Многие опытные пользователи также считают их менее и менее гибкими.

Графическая оболочка это определенно шаг вперед для взаимодействия человека и машины, но командная строка не может быть заменена из-за ее мощности и скорости использования. Самая известная графическая оболочка, безусловно GNOME и KDE (в Unix и Unix-подобных системах), Finder (в Mac OS) и File Explorer (в системах Microsoft Windows)

Как и где можно получить подарки

  1. Чтобы получить понравившийся презент, нужно соответственно накопить необходимое количество бонусов на своей карте и при посещении заправочной станции «Шелл» предъявить ее кассиру. Если выбранный вами товар в наличии, то списав с карты баллы, вы сразу станете обладателем любого выбранного вами товара. В случае отсутствия выбранного вами подарка, можно заказать доставку на ближайшую к вам АЗС «Шелл». В течение примерно 14 дней, выбранный вами сувенир будет бесплатно доставлен.
  2. Также заказать сувениры можно и не выходя из дома. Для этого необходимо войти в личный кабинет на сайте Shell ClubSmart и выбрать понравившийся. И подождав немного времени, забрать его на ближайшей к вам станции АЗС «Шелл», куда вы заказали доставку.

Резюмируем

Краткая сводная таблица для 6 вышерассмотренных командных оболочек:

Командная оболочка Путь Приглашение (обычный пользователь) Приглашение (root)
sh (Bourne Shell) /bin/sh и /sbin/sh $ #
bash (Bourne-Again Shell) /bin/bash имя_пользователя@имя_хоста:~$ имя_пользователя@имя_хоста:~#
ksh (Korn Shell) /bin/ksh $ #
csh (C Shell) /bin/csh % #
tcsh (TENEX C Shell) /bin/tcsh имя_хоста:~> #
zsh (Z Shell) /bin/zsh % #

Примечание: Помимо представленных выше оболочек, есть еще и такие оболочки, как:

   mksh — оболочка, основной упор в которой сделан на написание скриптов;

   dash — более легковесная в сравнении с bash оболочка, но из-за этого обладающая ограниченной функциональностью;

   fish — «новая» оболочка, написанная в 2005 году, отличительной чертой которой является упор на комфорт использования и упрощение командного языка;

   и другие.

Вопросы к бенефициару

Другой важный момент, который не всегда показывают явно – это понимание того, кто является истинным владельцем компании или бенефициаром.

В компаниях-пустышках нередко используются номиналы, как в роли директора, так и в роли акционеров. Это не является запрещённой процедурой, по крайней мере в определённых юрисдикциях, однако у контролирующих органов всегда есть право получить информацию об истинном бенефициаре.

Если же выяснить истинного выгодоприобретателя проблематично или невозможно, то снова возникают вопросы

И неважно, бенефициар спрятался за номиналом или чередой подставных компаний – если его найти сложно, будут сложности при работе компании. Тем более, что всё больше юрисдикций требуют составление регистра бенефициаров

В некоторых случаях он публично доступен, как это сделано в Великобритании, в других – доступен только правоохранительным органам по специальным запросам.

Иллюзия многозадачности

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

Поэтому нам нужно сделать из однозадачной системы иллюзию многозадачной.
Для этого мы поделим время работы процессора между всеми задачами.
Точнее — поделим всё время работы на небольшие части, а в эти небольшие части
(time slice), в которые будем исполнять то одну задачу, то другую.
Если делать это очень быстро — создаётся иллюзия параллельной обработки
нескольких задач одновременно.

И тут появляется планировщик

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

Поэтому наша программа-планировщик должна стараться раздавать имеющиеся кванты
времени “справедливо”. При этом понятие “справедливо” — тоже довольно обширное.
К примеру, пользователь будет недоволен, если воспроизведение фильма будет
подвисать, при этом не сильно расстроится, если фоновая задача будет
притормаживать.

Плюсом к этому будет грустно, если задача распределения ресурсов процессора
будет съедать сильно много процессорного времени — неприятно, когда управленцы
получают больше, чем исполнители.

Также важно помнить, что пользователю важен отклик системы.
Поэтому планировщик должен быть привязан как-то к реальному времени. И тут есть множество проблем для планировщика

Так, к примеру, нельзя
определить, когда программа дойдёт до определённого момента
(идеальный момент для переключения) чисто по алгоритмическим причинам

И тут есть множество проблем для планировщика. Так, к примеру, нельзя
определить, когда программа дойдёт до определённого момента
(идеальный момент для переключения) чисто по алгоритмическим причинам.

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

Что-то может пойти не так и какая-то программа зависнет — что тут делать,
как решать, что нужно передать управление, что делать с этой программой?
Опять же, понять, что она реально зависла для произвольной программы мы не можем…

И тут остаётся использовать те самые аппаратные прерывания.
Если программа сама не передаёт управление — через прерывание таймера мы можем
понять, что время пришло переключить управление. Ну и в целом — можно
по таймеру следить за “справедливостью” выделения процессорного времени.
На него ориентироваться при планировании исполнения процессов.

Смена контекста (context switch)

Само собой, при смене контекста производится много работы. Часть из неё
мы уже описали выше, но особого внимания заслуживает отдельный момент,
который мы ещё не обсуждали.

Кеш процессора

Современные компьютеры много сложнее, чем процессор-шина-память. В частности,
для ускорения работы этой связки был добавлен ещё один вид памяти, который
расположен ближе к процессору, чем RAM — кеш процессора. Размер кеша меньше, чем
памяти. Однако, редко какая программа оперирует всей памятью сразу. Обычно
необходимые для работы программы данные лежат вместе и их размер невелик.

Именно благодаря этому небольшая память кеша, но низкое время обращения
процессора к ней, и даёт значительный прирост производительности на многих
задачах. С другой стороны — при переключении контекстов в кеше может не хватать
места под оперативные данные всех процессов — тогда кеш будет обновляться (также
говорят “прогреваться”) из памяти по мере необходимости. И это может сильно
замедлить работу компьютера по сравнению с работой при горячем кеше.

В следующем примере мы запустим программу в 8 потоков на 8-ми ядрах. Они будут
увеличивать общий счётчик до довольно большого числа. Так как они будут
параллельно обрабатывать одни и те же данные, компьютер будет постоянно
синхронизировать кеши.

Сборка:

Для примера, если запустить эту же программу но на одном ядре (пусть и в 8
потоков) — смены контекста также будут происходить, но кеш будет “горячим” —
программа выполнится быстрее. Для запуска на определённых процессорах программ
(или миграции) используется утилита (или программно
).

Посмотреть же статистическую информацию о смене контекстов за секунду можно всё
также в . Столбик system, раздел “cs” (от “context switch”).

Как зарегистрировать карту на сайте www.shellsmart.com

Регистрация карты: поля которые необходимо заполнить

Далее нужно заполнить все необходимые поля на русском языке, обязательные поля отмечены красной звездочкой * — эти поля должны быть заполнены обязательно:

  • Номер карты состоящий из 17 цифр, который начинается с 700436
  • Ф.И.О. Фамилия, имя и отчество
  • Пол
  • Дата вашего рождения в формате ДАТА, МЕСЯЦ, ГОД (ДД.ММ.ГГГГ)
  • Почтовый индекс
  • Населенный пункт
  • Улица с номером дома
  • Номер сотового телефона в международном формате: +7ХХХХХХХХХХ
  • Ваш e-mail (Электронная почта)
  • Пароль (надежность пароля отображается в прямоугольных квадратиках ниже)
  • Контрольный вопрос и ответ для восстановления пароля
  • Согласие с правилами и условиями, а также политикой конфиденциальности

Затем нужно пройти защиту от роботов (каптча) и нажать далее.

Что такое shell companies?

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

Однако с другой стороны, ракушка – это что-то пустое, что некогда живой моллюск уже покинул. Поэтому в современном мире гораздо чаще встречается определение компания-пустышка.

Другие синонимы, которые можно встретить: компания-однодневка, бумажная компания, фиктивная компания. Хотя между ними могут быть различия, в массовом сознании культивируется объединение этих понятий.

По некоторым источникам, изначально shell cmpanies пришли к нам с рынка акций. Так называли компании, которые пришли торговаться на биржу, а затем перестали, хоть и не вышли из листинга.

В современном мире понятие компании-пустышки до сих пор не стандартизовано. В разных государствах оно определяется по-разному, но с каждым годом рамки такой компании становятся уже и чётче. Мы попробуем определить её по самым жёстким критериям, которые существуют на данный момент.

Просто потому, что именно к ужесточению всё и идёт.

Компания-пустышка или shell company – это компания, у которой нет экономической активности или она несущественна, нет реального присутствия по месту регистрации, плюс, отсутствие необходимости подавать отчётность в налоговые органы. Такие 3 критерия выдвинули в Латвии, чем лишили доступ к банкам десятки тысяч компаний, которые попали под новое определение компаний-пустышек. В других странах ситуация может быть чуть мягче, но мы видим, что в среднем все стремятся именно к подобным жёстким определениям.

Поэтому давайте разберёмся, что означает каждый из указанных пунктов на практике.

Интуитивные решения

Интуитивные решения можно описать как выбор, делающийся на основе ощущений о его правильности. Человек, принимающий решение, не анализирует все ЗА и ПРОТИВ, и зачастую даже не оценивает детально ситуацию. Он просто выбирает. Интересно, что интуитивные суждения – это распространенное явление. Более того – многие люди зависят от своей интуиции, склонны доверять ей и всячески развивают ее, т.к. она помогает находить верные решения и эффективные выходы из сложных ситуаций.

Несмотря на это, если дело касается серьезных решений, где есть множество вариантов выбора, человек лицом к лицу сталкивается с таким явлением как случайность. И если посмотреть на вопрос выбора с позиции логики, шансы принять верное решение очень невысоки. Отсюда и вывод: к интуиции нужно прислушиваться и даже следовать ей, но правильный выбор возможен лишь тогда, когда тщательно анализируются все плюсы и минусы ситуации.

Планировщики в Linux

К примеру, всё началось с планировщика O(n) — все задачи расположены в списке,
каждому исходя из приоритета присвоено определённое количество тиков (tick),
которые соответствуют time slice-ам. Ищем задачу с максимальным значением,
исполняем, понижаем счётчик тиков задачи. Если не можем найти задачи с
положительным счётчиком — поднимаем счётчик всем задачам, исходя из приоритета.

Очевидная проблема данного планировщика — при росте количества задач растёт и
время работы планировщика. Причём растёт линейно. В теории сложности вычислений
этот алгоритм относится к классу O(n) — рост времени вычисления растёт
пропорционально количеству входных данных.

Также данный планировщик имеет проблемы при работе с несколькими процессорами —
одна блокировка на одну очередь — то есть одновременно с ней может работать
только один процессор.

В 2002-ом году в Linux стали использовать более продвинутый планировщик — O(1).
Как можно догадаться, алгоритм работы был изменён. Время работы планировщика
более не зависело от числа запущенных процессов. Теперь у каждого процессора
было по паре списков. В первом отсортированном списке — текущие процессы,
ожидающие выполнения, во втором — исчерпавшие своё время. Как только первый
список заканчивался — они менялись местами.

Уже гораздо лучше. Однако и здесь есть свои проблемы. При балансировке нагрузки
между процессорам необходимо время от времени производить миграцию процессов с
одного процессора на другой. Для этого приходится блокировать очередь работы
одного процессора другим.

Также имелись и проблемы с честным выделением ресурсов пользователям. Если один
запустит 10 процессов, а другой 1, то разделение времени будет нечестым.

В ядре 2.6.23 появился новый планировщик CFS — Completely Fair Scheduler
(полностью честный планировщик). Он уже оперирует не процессами, а сущностями
планирования () — появилась возможность честнее разделять время
между пользователями. Сам планировщик стал выделять время ближе к приоритетам.

Алгоритм стал несколько “дороже” — O(logN) — используется красно-чёрное дерево,
что с ростом количества процессов заметно всё меньше и меньше. Планирование из
одной структуры данных организовано довольно оптимально — для работы на
многопроцессорных системах подходит также лучше. Именно он сейчас используется в
Linux.

Помимо планировщиков общего назначения в Linux есть и планировщик для систем
реального времени

Это системы, в которых важно, чтобы время
реакции системы на внешний сигнал не превышало определённого времени. К примеру,
от момента определения заноса до запуска сервоприводов тормозных колодок должно
пройти не более 5мс

Помимо планировщика на работу влияют и многие другие части
ОС, например, буферы, обработчики прерываний и т.д. Однако, и планировщик и
программы должны быть специальными для работы в реальном времени.

Так в Linux используется с алгоритмом планирования по
ближайшему сроку завершения (EDF — Earliest deadline first):

  • планировщик ведёт список процессов, отсортированный по сроку завершения (deadline);
  • в работу берётся готовый процесс, имеющий самый близкий deadline;
  • при появлении нового процесса — пересортировка.

Программы же должны при запуске указывать через параметры
, и — время исполнения в худшем случае, срок
завершения и период.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: