Эволюция операционных систем

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

Идею этого ученого удалось реализовать в 1943-1945 годах. В это время операционные системы (ОС) ещё не появились. Все задачи решались вручную каждым программистом с пультом управления, который представлял собой примитивное устройство ввода-вывода. Оно состояло из кнопок, переключателей и индикаторов. Предшественников операционных систем являлись системы пакетной обработки. Они стали первыми системными программами для управления вычислительных процессов. В ходе реализации системы пакетной обработки был разработан формализованный язык управлениями заданиями, с помощью которого программист сообщал системе какие действия, и в какой последовательности он хочет выполнить на вычислительной машине. Оператор составлял пакет заданий, которые в дальнейшем без его участия запускались на выполнение. Пакет обычно представлял собой набор перфокарт, но мог переноситься на магнитную ленту или магнитный диск.

Следующий этап развития ОС относится к 1965-1975 годам. Произошёл переход от полупроводниковых элементов к интегральным микросхемам. В этот период были реализованы практически все основные концепции, присущие современным системам: мультипрограммированное программное обеспечение, многотерминальный режим, виртуальная память, файловые системы. Революционное событие данного этапа – мультипрограммирование – это способ организации вычислительного процесса, при котором в памяти находилось одновременно несколько программ, попеременно выполняющихся на одном процессоре. Мультипрограммирование было реализовано в двух вариантах: системах пакетной обработки и разделение времени. В мультипрограммном пакетном режиме процессор не простаивал, пока одна программа выполнила операцию ввода и вывода, а переключался на другую, готовую к выполнению программу. В результате достигалась загрузка всех устройств компьютера, увеличивалось число задач, решаемых в единицу времени. В данном случае пользователь был лишён возможности интерактивно взаимодействовать со своими программами. Для исправления такой ситуации был разработан другой вариант мультипрограммирования – система разделения времени (каждый пользователь работает со своим терминалом).

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

Ещё одна важная тенденция этого периода – создание семейств программно совместимых машин и операционных систем для них. В начале 1970 года появились сетевые операционные системы, которые позволяли рассредоточить пользователей, организовать распределённое хранение и обработку данных между несколькими ПК, связанными электрическими связями. С середины 1970-х годов началось массовое использование операционных систем UNIX, которая сравнительно легко переносилась на различные типы компьютеров. Программный код UNIX был написан на языке C (Си). 1980-е годы – становление интернета, появление персональных компьютеров и ОС для них. На этот момент самой распространённой системой была ОС MS-DOS. Это однопрограммная, однопользовательская ОС с интерфейсом командной строки. Основными задачами для неё были управление файлами и поочерёдный запуск программ.

Наибольшее влияние на развитие программного обеспечения для ПК оказала ОС Windows, представлявшая собой надстройку над MS-DOS. На её основании была создана операционная система Windows 3.1, 3.11, 95, 98, 2000, ME и т.д.

FTP-клиент на Node.js для Windows Server

Имеется

  • Дистрибутив Linux (Debian) с установленной платформой Node.js
  • Сторонний Windows Server

Задача

Необходимо установить FTP коннект к Windows Server при помощи платформы Node.js, вырезать определенную папку (вместе с находящимися в ней папками и файлами) и вставить в определенную директорию на сервере под управлением Linux.

Вопрос

Можно ли реализовать описанную задачу? Если «Да», то какие NPM-пакеты использовать и/или какой код программы подойдет для решения задачи?

Ответ

Если ходить по обычному FTP, то инструкция получилась такая:

  1. Добавить службу FTP-сервер (веб-сервер IIS)
  2. Добавить FTP-сайт и установить физический путь к каталогу с содержимым

При помощи NPM-пакета basic-ftp, получить содержимое каталога:

const ftp = require('basic-ftp');

ftp_connect()
 
async function ftp_connect() {
    const client = new ftp.Client();
    client.ftp.verbose = true;
    try {
        await client.access({
            host: 'host',
            port: '21',
            user: 'domain\\username',
            password: 'password',
            secure: false
        })
        console.log(await client.list())
    }
    catch(err) {
        console.log(err)
    }
    client.close()
}

Сумма цифр трехзначного числа

Исходный текст программы:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	int n, n1, n2, n3;
	cout << "Vvedite 3-hznachnoe chislo: " << endl;
	cin >> n;
	if ((n > 99) && (n < 1000))
	{
		n1 = floor(n / 100);
		cout << n1 << " + ";
		n2 = floor(n / 10 % 10);
		cout << n2 << " + ";
		n3 = floor(n / 1 % 10);
		cout << n3 << " = ";
		cout << n1 + n2 + n3 << endl;
	}
	cin.get();
	
	return 0;
}

Деление одного числа на другое без остатка

Исходный текст программы:

#include <iostream>
using namespace std;

int main()
{
	int c1, c2;
	cout << "Vvedite 1 chislo: ";
	cin >> c1;
	cout << "Vvedite 2 chislo: ";
	cin >> c2;
	if (c1 % c2 == 0)
	{
		cout << "ostatka net." << endl;
	}	
	else
	{
		cout << "ostatok est': " << c1 % c2 << endl;
	}
	cin.get();
	
	return 0;
}

Чем отличается спецификация от стандартизации вкратце?

Это вообще разные понятия. Очень очень краткий ответ за этот вопрос:

Спецификация — это документ.

Стандартизация — это правила.

Как разбить массив на куски?

Вопрос

Имеется массив JavaScript, который выглядит следующим образом:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

Какой подход можно применить для разбиения массива на множество меньших массивов, скажем, с 4 элементами максимум?

Ответ

Метод array.slice может извлечь фрагмент из начала, середины или конца массива для любых целей, без каких-либо изменений исходного массива. Например:

function array_chunks(array, chunk_size) {
  let a = Array(Math.ceil(array.length / chunk_size)).fill();
  a = a.map((_, index) => index * chunk_size)
  return a.map(begin => array.slice(begin, begin + chunk_size));
}

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(array_chunks(a, 4)) // [[1, 2, 3, 4], [5, 6, 7, 8], [9]]

Как определить первую и последнюю итерацию в цикле foreach?

Вопрос

Вопрос прост. Есть цикл foreach в коде:

foreach ($array as $item) {
    //code
}

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

Как это сделать?

Ответ

Вы можете использовать счетчик:

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i === 0) {
        // Первая итерация
    } else if ($i === $len - 1) {
        // Последняя итерация
    }
    // ...
    $i++;
}

Установка RabbitMQ на Debian 10

Инструкция по установке RabbitMQ на Debian 10:

$ sudo apt-get update
$ sudo apt-get install erlang (deb http://dl.bintray.com/rabbitmq-$ erlang/debian buster erlang-21.x)
$ sudo apt-get install rabbitmq-server
$ sudo service rabbitmq-server start
$ sudo rabbitmq-plugins enable rabbitmq_management
$ sudo rabbitmqctl add_user admin admin
$ sudo rabbitmqctl set_user_tags admin administrator
$ sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
  • http://host:15672/ — UI Manager (доступ этом примере по admin/admin)

Проверялось на RabbitMQ 3.7.8.

Основные этапы процесса разработки программ

Процесс разработки программы можно выразить следующей формулой:

Разработка программы = Изготовление + Доказательство правильности

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

Затем  программа  разрабатывается  с  использованием  той  или  иной  технологии программирования (например, структурного программирования).

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

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

Документирование. Стадии создания автоматизированной системы

ГОСТ Р 12207:2010 – основополагающий ГОСТ. Процессы жизненного цикла программных средств.

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

К группе вспомогательных процессов также относятся следующие процессы:

  1. Управление конфигурацией;
  2. Обеспечение качества;
  3. Верификация (способ подтверждения);
  4. Аттестация (контроль соответствия);
  5. Совместный анализ
  6. Аудит (проверка финансовой и хозяйственно-экономической деятельности);
  7. Решение проблем, устранение дефекта.

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

ГОСТ 34.208-89 – информационная технология, комплекс стандартов на автоматизированные системы. Виды, комплектность и обозначение документов при создании автоматизированной системы.

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

Перечень наименований разрабатываемых документов и их комплексность на автоматизированную систему должен быть определен в техническом задании на создание автоматизированной системы (АС).

Стадии создания автоматизированной системы

1. Исследование и обоснование создания АС

  •                 Научно-технический отчет
  •                 Тактико-техническое задание
  •                 Технико-экономическое обоснование
  •                 Заявка на создание АС

2. Техническое задание

  •                 Техническое задание на создание АС (разр. С ГОСТ 34.602)

3. Эскизный проект

  •                 Ведомость эскизного проекта
  •                 Пояснительная записка

4. Технический проект

  •                 Схема организационной структуры
  •                 Схема структурная комплекса ТС
  •                 Схема автоматизации
  •                 Схема функциональной структуры

5. Рабочая документация

  •                 Проектная оценка надёжности
  •                 Ведомость эксплуатационных документов
  •                 Спецификация оборудования
  •                 Ведомость потребности в материалах
  •                 Ведомость машинных носителей информации
  •                 Руководство пользователя
  •                 Инструкция по эксплуатации комплекса ТС

6. Ввод в действие

  •                 Акт завершения работ
  •                 Акт приемки в промышленную эксплуатацию
  •                 Акт приемки в оптовую эксплуатацию
  •                 План график работ
  •                 Протокол согласования