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 Trie树实现字典排序
Mar 28 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
python实现的发邮件功能示例
Sep 11 Python
django ajax发送post请求的两种方法
Jan 05 Python
python字符串替换re.sub()实例解析
Feb 09 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
在python中实现导入一个需要传参的模块
May 12 Python
pandas中关于apply+lambda的应用
Feb 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
自动跳转中英文页面
2006/10/09 PHP
PHP调用三种数据库的方法(3)
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
python矩阵转换为一维数组的实例
2018/06/05 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Scrapy框架使用的基本知识
2018/10/21 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
阿巴庭院:Abba Patio
2019/06/18 全球购物
群胜软件Java笔试题
2012/09/29 面试题
客户代表自我评价范例
2013/09/24 职场文书
表彰大会主持词
2014/03/26 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
公司副总经理任命书
2014/06/05 职场文书
演讲稿开场白台词
2014/08/25 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle