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 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
python实现列表的排序方法分享
Jul 01 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
python+pygame实现坦克大战
Sep 10 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 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 变量未定义等错误的解决方法
2011/01/12 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
python使用psutil模块获取系统状态
2016/08/27 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python解析微信dat文件的方法
2020/11/30 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
高级销售求职信
2014/02/21 职场文书
企业授权委托书范本
2014/04/02 职场文书
小班评语大全
2014/05/04 职场文书
人事任命书格式
2014/06/05 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
战马观后感
2015/06/08 职场文书
2015年教师节广播稿
2015/08/19 职场文书
导游带团欢迎词
2015/09/30 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
优秀创业计划书分享
2019/07/19 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python