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解析网页源代码中的115网盘链接实例
Sep 30 Python
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
python字符串的常用操作方法小结
May 21 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
Python jieba库分词模式实例用法
Jan 13 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 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 字符串分割和比较
2009/10/06 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
python多线程用法实例详解
2015/01/15 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
python调用摄像头显示图像的实例
2018/08/03 Python
Python接口开发实现步骤详解
2020/04/26 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
《晏子使楚》教学反思
2014/02/08 职场文书
先进集体事迹材料
2014/02/17 职场文书
运动会稿件100字
2014/02/21 职场文书
初中英语演讲稿
2014/04/29 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书