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编码时应该注意的几个情况
Mar 04 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
pandas提升计算效率的一些方法汇总
May 30 Python
Python实现信息管理系统
Jun 05 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/09/26 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
小学生勤俭节约演讲稿
2014/08/28 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
golang中的空slice案例
2021/04/27 Golang
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Java基础-封装和继承
2021/07/02 Java/Android
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers