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 26 Python
python模块之StringIO使用示例
Apr 08 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
Django视图扩展类知识点详解
Oct 25 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
关于Pytorch的MLP模块实现方式
Jan 07 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
tensorflow之自定义神经网络层实例
Feb 07 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适配器模式介绍
2012/08/14 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
JavaScript 继承的实现
2009/07/09 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
vue计算属性computed的使用方法示例
2019/03/13 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
软件测试工程师结构化面试题库
2016/11/23 面试题
医务人员自我评价
2014/01/26 职场文书
元旦晚会邀请函
2014/01/27 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL