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使用cookielib模块操作cookie的实例教程
Jul 12 Python
PyQt5每天必学之单行文本框
Apr 19 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
python关闭占用端口方式
Dec 17 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
基于python和flask实现http接口过程解析
Jun 15 Python
Python二元算术运算常用方法解析
Sep 15 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
利用python进行数据加载
Jun 20 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的ASP防火墙
2006/10/09 PHP
PHP5.3新特性小结
2016/02/14 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
vue实现顶部菜单栏
2020/11/08 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python中执行shell的两种方法总结
2017/01/10 Python
20行python代码实现人脸识别
2019/05/05 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
判断单链表中是否存在环
2012/07/16 面试题
好习惯伴我成长演讲稿
2014/05/21 职场文书
锦旗标语大全
2014/06/23 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书