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 相关文章推荐
windows上安装Anaconda和python的教程详解
Mar 28 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
浅谈Python中range和xrange的区别
Dec 20 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
python 解决函数返回return的问题
Dec 05 Python
python绘制雷达图实例讲解
Jan 03 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
Anaconda配置各版本Pytorch的实现
Aug 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通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
如何实现JS函数的重载
2006/09/22 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
python opencv实现证件照换底功能
2019/08/19 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
数控专业应届生求职信
2013/11/27 职场文书
元旦晚会邀请函
2014/01/27 职场文书
运动会跳远加油稿
2014/02/20 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
入学证明
2015/06/23 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
python基础之模块的导入
2021/10/24 Python
Nginx源码编译安装过程记录
2021/11/17 Servers
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js