Python实现调度算法代码详解


Posted in Python onDecember 01, 2017

调度算法

操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。

在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法;又如在分时系统中,为了保证系统具有合理的响应时间,应当采用轮转法进行调度。目前存在的多种调度算法中,有的算法适用于作业调度,有的算法适用于进程调度;但也有些调度算法既可以用于作业调度,也可以用于进程调度。

目标阐述:

将中缀表达式转换为后缀表达式(Reverse Polish Notation:RPN 逆波兰式)
参与运算的数据的正则表示为:[0-9]{1,}形式的十进制数

运算符优先级:(从高到低)————————————————————————
( )   括号
/ * %  除乘余
+ -   加减————————————————————————

解:

第一步:使用正则词法分析器flex生成一个词法分析器,以处理输入的中缀表达式。
从stdin接收输入,检测非法字符,并将处理后的中缀表达式输出到stdout。

%option noyywrap
%{
#include<stdio.h>
#include<stdlib.h>%}

%%
[0-9]+ { printf("%s ",yytext); }
[()*/%+-] { printf("%s ",yytext); }
[[:space:]] {}
. { printf("\nError\n");exit(1); }
%%

int main()
{
 yylex();
 printf("\n");
 return 0;
}

第二步:使用Python进行转换。

从stdin接收一定格式的中缀表达式字符流,检测是否在词法分析器处理过程中出错,然后使用调度场算法处理数据,得到rpn列表。

import sys

line=sys.stdin.readline()
line2=sys.stdin.readline()

if len(line2)>0:
 sys.stderr.write("Syntax Error after : ")
 sys.stderr.write(line)
 sys.stderr.write("\n")
 exit(1)

lis=line.split(' ')
lis.pop()
lis_old=lis[:]
lis.reverse()

oplis=[]
rpnlis=[]
str=''
arith_op="+-*/%" # '(' ')' [0-9]+
prior={ '/':1,'*':1,'%':1, '+':2,'-':2 }

while len(lis)>0:
  str=lis.pop()
  if str=='(':
    oplis.append('(')
  elif str.isdigit():
    rpnlis.append(str)
  elif len(str)==1 and arith_op.find(str[0])!=-1:
    if len(oplis)==0 or oplis[len(oplis)-1]=='(':
      oplis.append(str)
    else:
      while len(oplis)>0 and oplis[len(oplis)-1]!='(' \
               and prior[oplis[len(oplis)-1]]<=prior[str]:
        rpnlis.append(oplis.pop())
      oplis.append(str)
  elif str==')':
    while len(oplis)>0 and oplis[len(oplis)-1]!='(':
      rpnlis.append(oplis.pop())
    if len(oplis)>0:
         oplis.pop()
        else:
         sys.stderr.write("Syntax Error while translating : Expected '('")
         sys.stderr.write("\n")
         exit(2)
    else:
     sys.stderr.write("Syntax Error : unkown notation -->")
     sys.stderr.write(str)
     sys.stderr.write("\n")
     exit(3)
while len(oplis)>0 :
  if oplis[len(oplis)-1]!='(':
     rpnlis.append(oplis.pop())
    else:
     sys.stderr.write("Syntax Error while translating : Unexpected '('")
     sys.stderr.write("\n")
     exit(1)

print lis_old
for i in lis_old:
  sys.stdout.write(i)
print ''
print rpnlis
for i in rpnlis:
  print i,
print ''

exit(0)

实验结果:

Python实现调度算法代码详解

目前程序的局限:
未进行语法检测。
不支持函数、变量标识。

附录:

Python实现调度算法代码详解

算法示意图,使用了3个空间。输入用符号代替,如果输入是一个数字则直接进输出队列,即图中 b),d),f),h)。如果输入是运算符,则压入操作符堆栈,即图中 c),e),但是,如果输入运算符的优先级低于或等于运算符栈顶的操作符优先级,则栈内元素进入输出队列(循环判定),输入操作符压入运算符堆栈,即图中 g)。 最后,运算符堆栈内元素入输出队列,算法结束。

Python实现调度算法代码详解

附录中资料摘自维基百科•调度场算法词条。

总结

以上就是本文关于Python实现调度算法代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出!

Python 相关文章推荐
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
Python函数装饰器实现方法详解
Dec 22 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
python实现简单石头剪刀布游戏
Oct 24 Python
Python 中的 copy()和deepcopy()
Nov 07 Python
python脚本框架webpy的url映射详解
Nov 20 Python
Python进阶学习之特殊方法实例详析
Dec 01 #Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 #Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 #Python
vscode 远程调试python的方法
Dec 01 #Python
Python中单、双下划线的区别总结
Dec 01 #Python
从CentOS安装完成到生成词云python的实例
Dec 01 #Python
Django的分页器实例(paginator)
Dec 01 #Python
You might like
深入PHP数据缓存的使用说明
2013/05/10 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Python中的super()方法使用简介
2015/08/14 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python实现简单井字棋小游戏
2020/03/05 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
施工人员岗位职责
2013/12/12 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
大学生求职信范文
2014/05/24 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
详解Vue slot插槽
2021/11/20 Vue.js
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript