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多线程编程(四):使用Lock互斥锁
Apr 05 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
Python模拟三级菜单效果
Sep 11 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
python属于哪种语言
Aug 16 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
运行Python编写的程序方法实例
Oct 21 Python
用python批量移动文件
Jan 14 Python
Python实现排序方法常见的四种
Jul 15 Python
python的变量和简单数字类型详解
Sep 15 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
长波有什么东西
2021/03/01 无线电
实用函数8
2007/11/08 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
重定向实现代码
2006/11/20 Javascript
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jQuery动态添加
2016/04/07 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python中单例模式总结
2018/02/20 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
英语系本科生求职信范文
2013/12/18 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
学校文明单位申报材料
2014/05/06 职场文书
文明工地标语
2014/06/16 职场文书
管理标语大全
2014/06/24 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
小学教师教育随笔
2015/08/14 职场文书
2019求职信大礼包
2019/05/15 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL