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遍历类中所有成员的方法
Mar 18 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
Python 实现微信防撤回功能
Apr 29 Python
python实现连连看辅助(图像识别)
Mar 25 Python
解决python 文本过滤和清理问题
Aug 28 Python
python数据爬下来保存的位置
Feb 17 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
python 星号(*)的多种用途
Sep 21 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判断对象是派生自哪个类的方法
2015/06/20 PHP
PHP概率计算函数汇总
2015/09/13 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
django静态文件加载的方法
2018/05/20 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
python定位xpath 节点位置的方法
2019/08/27 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
中学生社会实践活动总结
2014/07/03 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
Linux安装apache服务器的配置过程
2021/11/27 Servers
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python