Проектирование курса операционной системы на основе C# Winform: Spooling Spooled входная и моделирование технологии вывода.
Требуется разработать процесс вывода катушек и два пользовательских процесса, которые запрашивают вывод, а также программу службы вывода катушек. Когда пользовательский процесс, запрашивающий вывод, желает вывода серии информации, вызвана программа Service Service, а программа Service Service отправляет информацию в вывод. Когда встречается выходной флаг конечного флага, он указывает, что выходной выходной выход процесса завершен. После этого применяется блок выходного запроса (используется для записи имени пользовательского процесса, запрашивающего вывод, положение информации в выходной скважине, длину вывода информации и т. Д.) И ожидают вывода процесса катушки.
Когда процесс вывода катушек работает, он фактически будет выводить на принтер или монитор на основе информации, которая будет выходить из каждого процесса, записанного в блоке запроса. Здесь процесс вывода SP00LING и пользовательский процесс, запрашивающий вывод, могут выполняться одновременно.
Планирование процесса использует случайный алгоритм, который согласуется с случайностью выходной информации процесса. Вероятность планирования двух пользовательских процессов, запрашивающих выход, составляет 45% каждый, а процесс вывода катушки составляет 10%, что определяется моделированием случайного числа, сгенерированного генератором случайных чисел.
Существует три основных состояния процесса, а именно исполняемые файлы, ожидание и окончание. Исполняемая государство - это состояние, в котором работает процесс или ожидает планирования; Состояние ожидания разделено на состояние ожидания 1, состояние ожидания 2 и состояние ожидания 3.
Условия для изменения состояния:
① Когда процесс выполняется, он устанавливается в состояние «конечного».
② Когда сервисная программа отправляет выходную информацию на вывод хорошо, если она обнаруживает, что выходной скважина заполнена, процесс вызова будет установлен на «Состояние ожидания 1».
③ Когда процесс катушки выводится, если вывод пуст, он введет «состояние ожидания 2».
④ После того, как процесс катушки выводит информационный блок, он должен немедленно выпустить пространство выходного скважины, занятое информационным блоком, и установить процесс ожидания вывода в «исполняемое состояние».
⑤ После того, как программа службы выводит информацию в вывод Well и формирует информационный блок запроса вывода, если процесс катушки находится в состоянии ожидания, она установлена на «исполняемое состояние».
⑥ Когда пользовательский процесс запрашивает выходной блок, если нет доступного блока запросов, процесс вызова входит в «Состояние ожидания 3».
В системе есть два пользовательских процесса, запрашивающие вывод, и эти два процесса называются пользовательским процессом A и пользовательским процессом B соответственно. Пользователю может потребоваться вывести более одного файла, а файлы разделены выходным флагом. Флаг End End, используемый в этом эксперименте, #.
Пользователь должен ввести все содержимое файла, которое будет выводиться на этапе инициализации, а затем сохранить его в массив. Когда пользовательский процесс запланирован, если выполняются следующие три условия: все еще есть файл, который не выведен, оставшееся пространство в выходном скважине может уложить файл вниз, и есть доступный блок выходного запроса, файл отправляется в выходной колодец, а затем применяется блок выходного запроса, и блок запроса добавляется к блоку запроса ожидающего дохода, и ожидает вывода для вывода, и вывод и вывод.
Когда наступает очередь процесса вывода катушек для заполнения процессора, процесс вывода катушек сначала проверяет, есть ли выходные блоки в очереди ожидания запроса для вывода, и если нет, он входит в состояние ожидания. В противном случае вывод выполняется, а затем выпускаются пространство выходного скважины и соответствующий запрошенный выходной блок, и пользовательский процесс, который спит, потому что нет доступных выходных блоков.
Процесс вывода катушки и пользовательский процесс могут быть выполнены одновременно. Эта статья реферает процесс одного процесса выполнения (процесс не обязательно заканчивается после выполнения) в функцию, каждый раз, когда он генерирует случайное число и выполняет определенное процесс в соответствии со случайным числом. Если процесс заблокирован из -за определенных ситуаций, будет сгенерировано следующее случайное число, а другой процесс будет запланирован. Пользовательский процесс и процесс вывода катушек запланированы по разным причинам, то есть одновременно выполнение.
Функции всей системы делятся на следующие части: функция инициализации, функция графика, функция пользователя и функцию вывода катушки. Функция инициализации используется для реализации начального ввода и хранения пользовательских файлов; Функция диспетчерской реализует переключение между пользовательскими процессами и процессами вывода катушек; Функция пользовательского процесса реализует ряд действий, выполненных после запланированного процесса; Выходная функция катушки представляет операцию вывода.
Общая блок -схема работы системы показана на рисунке 1:
Система сначала использует функцию инициализации для инициализации ввода контента пользователем, а затем генерирует случайное число R от 0 до 1, а также судьи, независимо от того, следует ли выполнять пользовательский процесс или выполнять процесс вывода в соответствии с размером R. После выполнения процесса пользователя и вывода, программа выполняется, в противном случае планирование будет продолжаться.
Пользователь должен ввести контент, который он хочет «распечатать». Функция инициализации принимает ввод содержимого пользователем и сокращает его в соответствии с символом, окончившим файл, и помещает файл CUT в массив и отправляет его на вывод хорошо, когда пользовательский процесс запланирован.
Планирование процессов использует случайный алгоритм, а вероятность планирования двух пользовательских процессов, запрашивающих выход, составляет 45%, а процесс вывода катушки составляет 10%. В этой статье используются случайные числа для достижения этого требования. При выполнении планирования процесса наблюдается десятичное количество между 0 и 1 случайным образом. Если число меньше или равно 0,45, пользовательский процесс A будет введен в работу; Если число составляет от 0,45 до 0,9, пользовательский процесс B будет введен в работу; Если число превышает 0,9, процесс вывода катушки будет введен в работу.
Функция пользовательского процесса сначала необходимо проверить, соответствует ли текущий процесс три условия: файл не является выводом, оставшееся пространство в выходном скважине может уложить файл, и есть доступный блок выходного запроса. Если будут выполнены три условия, файл будет отправлен на выходной скважины, а соответствующий блок запроса применяется.
Блок -схема выполнения функции пользовательского процесса показана на рисунке 2:
Когда пользовательский процесс выполняется, если обнаружено, что файл был выведен, процесс заканчивается. В противном случае определяется, есть ли какое -либо оставшееся пространство в выводе, и состояние ожидания не вводится. Если в выходе хорошо остается место, продолжайте судить, есть ли выходной блок. Если он есть, отправьте файл в выходной сигнал и запросите выходной блок и разбудите потенциально сонный процесс вывода, в противном случае войдите в состояние ожидания 3.
Функция вывода катушки проверяет, есть ли блоки выходных запросов, и если есть, вывод и выпуск соответствующих ресурсов. В противном случае процесс вывода катушек будет ждать.
Блок -схема выходной функции катушки показана на рисунке 3:
Определение печатной платы заключается в следующем:
class PCB {
/*
* 进程描述
*/
public int id ; //序号
public int status ; //状态,0表示可执行,123表示三个等待状态,4表示结束
public string [ ] contents = new string [ MaxFileCount ] ; //要输出的内容
public int [ ] flags = new int [ MaxFileCount ] ; //为1表示该文件已经被输出,初始全部为0
public int fileCount ; //用户真实输入的文件个数
}Пользовательский процесс включает в себя идентификатор последовательного номера, состояние состояния процесса, контент для вывода, флаги вывода файлов и реальное количество файлов.
Среди них возможные состояния процесса, в которых может существовать пользовательский процесс: 0 означает исполняемое состояние, 1 означает состояние ожидания 1, 3 означает состояние ожидания 3, 4 означает окончание процесса.
Outputreqblock определяется следующим образом:
class OutputReqBlock {
/*
* 输出请求块
*/
public int id ; //要求进行输出的进程的id
public int start ; //文件在输出井中的起始位置
public int length ; //文件长度
public int fileIndex ; //要输出文件的序号
public OutputReqBlock ( int id , int start , int length , int fileIndex ) {
this . id = id ;
this . start = start ;
this . length = length ;
this . fileIndex = fileIndex ;
}
}Выходной блок запроса включает в себя: идентификатор процесса блока запроса, исходную позицию файла в выходном скважине, длину длины файла и номер последовательности файла для вывода во всех файлах пользователя.
Определение выходноговея выглядит следующим образом:
class OutputWell {
/*
* 输出井
*/
public char [ ] buffer = new char [ MaxWellLen ] ; //输出缓冲区
public int begin = 0 ; //当前可用位置
public int restSize = MaxWellLen ; //剩余容量
}Параметры выходной скважины: буферный буфер, используемый для хранения данных, размещенных пользователем; Текущее доступное местоположение начинается, файлы хранятся в порядке в выводе, а начало всегда указывает на начальную позицию доступного в данный момент буфера; Оставшаяся вместимость остается, оставшаяся емкость в буфере, изначально длину буфера Maxwellen.
Пользователь вводит информацию в «Печать» в текстовом поле, затем выбирает, к какому процессу принадлежит выходной контент (A или B). Наконец, нажмите кнопку «Инициализация», чтобы запустить функцию инициализации. Функция инициализации сначала использует строковый объект для хранения ввода контента пользователем. Затем проверьте, заканчивается ли контент, введенный пользователем номером #, и предложите пользователю повторно въехать, если он не является законным. После того, как ввод является законным, контент, введенный пользователем, разрезан в соответствии с номером #, а строка разрезана на несколько строк. Наконец, объект PCB инициализируется с помощью сгенерированной информации и помещается в очередь ожидания.
Поскольку пользователь может нажать кнопку инициализации несколько раз, необходимо определить, был ли текущий процесс инициализирован до каждого щелчка. Если пользователь уже завершил инициализацию, но снова нажал кнопку инициализации, исходный контент будет перезаписан.
Выходная скважина автоматически инициализируется при загрузке системного интерфейса.
Код функции инициализации пропущен!
Чтобы достичь случайности, каждый раз, когда вы хотите запланировать, случайное число между 0 и 1 генерируется с использованием случайной функции C#. Если случайное число меньше или равно 0,45 означает, что пользовательский процесс A будет запланирован дальше; Если случайное число составляет от 0,45 до 0,9 означает, что пользовательский процесс B будет запланирован дальше; Если случайное число больше 0,9 означает, что процесс вывода катушки будет запланирован дальше.
Реализация функции планировщика заключается в следующем:
private int dispatch ( ) {
/*
* 进程调度
*/
double res = rd . NextDouble ( ) ; //产生一个01之间的小数
if ( res <= 0.45 ) {
return 0 ;
} else if ( res <= 0.9 ) {
return 1 ;
} else {
return 2 ; //012分别表示两个进程和SPOOLing输出进程
}
} Используется для реализации серии операций, выполняемых при запуске пользовательского процесса.
Когда пользовательский процесс запланирован, сначала проверьте, есть ли еще файлы, которые не были отправлены на вывод. Если нет, текущий пользовательский процесс устанавливается на конечное состояние, а функция возвращается.
Пользовательский процесс еще не закончился, что означает, что есть все еще файлы, которые не были хорошо отправлены на вывод. Цикл, чтобы найти блок файла, который не был выведен (соответствующий флаг - 1), а затем запрашивает, может ли оставшееся пространство в выходном скважине все еще поставить этот блок файла. Если нет, установите состояние процесса, чтобы ожидание состояния 1, а функция возвращается. Если еще остается место, проверьте, есть ли еще доступный выходной блок запроса. Если процесс не установлен на состояние ожидания 3, функция возвращается. В противном случае блок файла отправляется на выходной скважины, а соответствующие параметры выходной скважины изменяются. Затем выходной блок запроса применяется к выходной очереди Printqueue, и выход печати печатается при запланировании процесса вывода катушки. Наконец, если процесс вывода катушки находится в состоянии ожидания, пользовательский процесс должен разбудить его.
Различные ситуации во время выполнения функции пользовательского процесса сохраняются через список для окончательного отображения результатов. Список включает в себя: текущий номер последовательности планирования, номер процесса, статус процесса, состояние вывода скважины, количество доступных блоков запроса, номер последовательности файлов и длину файла.
Код функции пользовательского процесса пропущен!
Функция выходной функции заключается в выборе выходного блока запроса, затем выводу содержимого в нем и, наконец, выпустить соответствующий ресурс.
Сначала проверьте, пусто ли вывод. Если процесс пустого вывода установлен в состояние ожидания 2, функция возвращается. В противном случае, проверьте, есть ли выходные блоки запроса в выходной очереди запроса, которые необходимо быть выводимым, и никакая функция возвращается. В противном случае выходной блок запроса в головке очереди извлекается из выходной очереди запроса, а затем блок запроса выводится, а соответствующее пространство вывода скважины и блок запроса освобождаются.
При выводе выходной функции выходной контент должен отображаться в области вывода файла.
Код функции вывода пропущен!
Пользователь нажимает кнопку «Программа запуска» и начинает запускать основную функцию. Процесс работы динамически корректируется в соответствии с текущей ситуацией.
Основная функция сначала определяет, были ли оба пользовательских процесса инициализированы и могут быть запущены только после инициализации, в противном случае сообщается об ошибке.
После инициализации нажмите кнопку «Программа запустить» еще раз. Пока есть процесс, который не находится в конечном состоянии, или блок запросов не был выведен, продолжайте планировать. При планировании вы должны определить, закончился ли текущий процесс, и вывести соответствующее состояние, когда оно закончено.
Основной код функции пропущен!
Описание различных параметров, используемых в эксперименте, показано в таблице 1:
| Имя параметра | Максвелллен | MAXFILECOUNT | блоккант |
|---|---|---|---|
| Описание параметра | Вывод скважина длина | Максимальное количество файлов, которые пользователь может вывести | Количество запрошенных блоков |
| Значение параметра | 15 | 10 | 3 |
Системный интерфейс показан на рисунке 4:
Системный интерфейс разделен на три раздела: инициализация, процесс планирования и область вывода файла. Раздел инициализации содержит текстовое поле, поле выбора и кнопку. Пользователь входит в файл, который будет напечатан в текстовом поле, а затем инициализирует его. Раздел процесса планирования - это в основном таблица, которая отображает подробный процесс планирования процесса. Раздел вывода файла используется для отображения процесса печати всех файлов.
Пользователь сначала выбирает процесс, начальным по умолчанию является A, а затем помещает файл для вывода в текстовое поле раздела инициализации, а затем нажимает кнопку инициализации. Инициализация успешна, как показано на рисунке 5:
Для процесса B выполните вышеуказанные операции, как показано на рисунке 6:
После завершения инициализации двух пользовательских процессов нажмите кнопку «Запустить программу», и результаты показаны на рисунке 7 и рисунке 8:
Ниже приведен краткий анализ содержимого рисунка 7., как показано на рисунке 9:
Процесс вывода был запланирован в первый раз, потому что вывод пуст в настоящее время, поэтому состояние процесса вывода является состоянием 2 ожидания 2, а количество доступных блоков запроса составляет 3. Второй раз, когда процесс A запланирован. Состояние процесса A выполняется. Количество доступных блоков запроса составляет 3. A отправляет файл 0 на вывод хорошо. Длина файла 0 ("ABCD") составляет 4. Выходной процесс запланирован на третий раз. Доступное пространство выходного скважина составляет 15-4 = 11, количество доступных блоков запроса становится 2, а файл 0 процесса A-вывод, как показано в области вывода файла, и выделяется соответствующее пространство.