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学习手册中的python多态示例代码
Jan 21 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
浅析Python的web.py框架中url的设定方法
Jul 11 Python
Python 登录网站详解及实例
Apr 11 Python
实例讲解python中的序列化知识点
Oct 08 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
python hash每次调用结果不同的原因
Nov 21 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
python安装mysql的依赖包mysql-python操作
Jan 01 Python
在 Python 中利用 Pool 进行多线程
Apr 24 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 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 current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
PHP线程的内存回收问题
2016/07/08 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
交通安全教育制度
2014/02/02 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
生产文员岗位职责
2014/04/05 职场文书
计划生育证明书写要求
2014/09/17 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
作文批改评语
2014/12/25 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers