实验二  动态高优先权优先调度

实验内容

模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:

设置进程体:进程名,进程的到达时间,服务时间,初始优先权,进程状态(W——等待,R——运行,F——完成),进程间的链接指针

进程初始化:由用户输入进程名、服务时间、初始优先权进行初始化,同时,初始化进程的状态为W。

显示函数:在进程调度前、调度中和调度后进行显示。

排序函数:对就绪状态的进程按照优先权排序。优先权相同时进入等待队列时间早的进程在前。注意考虑到达时间

调度函数:每次从等待队列队首调度优先权最高的进程执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。

删除函数:撤销状态为F的进程。

实验要求

1、  测试数据可以随即输入或从文件中读入。

2、  必须要考虑到进程的到达时间

3、  最终能够计算每一个进程的周转时间。

实验代码

1.txt

process1    W
process2 W
process3 W
process5 W
process4 W

main.go

package main

import (
"bufio"
"container/heap"
"fmt"
"os"
"strconv"
"strings"
"time"
) type Item struct {
name string
priority int
index int
arrival int
service int
oldservice int
state string
} type PriorityQueue []*Item func (pq PriorityQueue) Len() int { return len(pq) } func (pq PriorityQueue) Less(i, j int) bool { if pq[i].priority == pq[j].priority {
return pq[i].service < pq[i].service
}
return pq[i].priority > pq[j].priority
} func (pq PriorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
pq[i].index = i
pq[j].index = j
} func (pq *PriorityQueue) Push(x interface{}) {
n := len(*pq)
item := x.(*Item)
item.index = n
*pq = append(*pq, item)
} //优先队列的Pop并不是用这个Pop,最后的元素并不是优先级最高的!
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-]
item.index = -
*pq = old[ : n-]
return item
} func (pq *PriorityQueue) Top() *Item {
item := heap.Pop(pq).(*Item)
heap.Push(pq, item)
return item
} func (pq *PriorityQueue) update(item *Item, priority, service int, state string) {
item.priority = priority
item.service = service
item.state = state
heap.Fix(pq, item.index)
} //创建优先队列
var pq = make(PriorityQueue, ) func main() {
f, err := os.OpenFile("1.txt", os.O_RDONLY, )
if err != nil {
fmt.Println("没有找到1.txt!")
os.Exit()
}
fmt.Println("请输入每秒改变优先级n")
n :=
fmt.Scan(&n)
reader := bufio.NewReader(f) for i := ; i < ; i++ {
//每次读取一行
buf, _, _ := reader.ReadLine()
sli := strings.Fields(string(buf))
priint, _ := strconv.Atoi(sli[])
arrint, _ := strconv.Atoi(sli[])
serint, _ := strconv.Atoi(sli[])
//创建实例
one := &Item{
name: sli[],
priority: priint,
index: i,
arrival: arrint,
service: serint,
oldservice: serint,
state: sli[],
}
heap.Push(&pq, one)
}
//初始化堆
heap.Init(&pq)
fmt.Println("请输入第x秒后的状态:")
x :=
fmt.Scan(&x)
//执行, 初始总数n为5,x为循环次数 num :=
for second := ; second <= x; second++ { time.Sleep(time.Second)
// pq[num] != heap.Pop(*pq)!!! //临时优先队列
var tempq = make(PriorityQueue, ) //遍历所有堆元素,仅pq[0]优先级最高!
for i := ; i < num; i++ {
onepq := pq[i] if onepq.state == "F" {
//添加到tempq
tempq = append(tempq, onepq)
continue
} //服务时间不为0,就让其-1,state设为R
if onepq.service != {
if i == {
//优先级最高
onepq.priority = pq[i].priority - n
onepq.service = pq[i].service -
onepq.state = "R"
} else {
//堆里其他元素
onepq.priority = pq[i].priority + n
onepq.state = "W"
}
} else {
//service=0, state设为F
onepq.state = "F"
} //添加到tempq
tempq = append(tempq, onepq)
} //删除堆里所有元素
for pq.Len() > {
heap.Pop(&pq)
} //把所有元素加到堆里
for _, v := range tempq {
heap.Push(&pq, v)
} //输出
fmt.Printf("\n第%d秒的状态表示\n", second)
fmt.Println("进程名 | 服务时间 | 目前优先级 | 进程状态 | 平均周转时间") //输出堆
for i := ; i < num; i++ {
if pq[i].oldservice == pq[i].service {
fmt.Printf("%v %v %v %v 0\n", pq[i].name, pq[i].service, pq[i].priority, pq[i].state)
} else {
fmt.Printf("%v %v %v %v %v\n", pq[i].name, pq[i].service, pq[i].priority, pq[i].state, (second-pq[i].arrival)*1.0/(pq[i].oldservice-pq[i].service))
} }
}
} /*
使用了golang的container/heap包,需要手动实现less/len/swap/push/pop方法,这里也自定义了update和top方法,需要注意有以下几点:
1. heap并不是按优先级排序的,所以不能用for遍历,仅pq[0]优先级最高
2. 在遍历堆内所有节点时不能直接update,因为fix方法会重新构建堆,我这里使用的方式是用切片来保存堆中所有的元素,空堆后再一次性push
*/

实验截图

前4秒状态:

后2秒状态:

golang模拟动态高优先权优先调度算法的更多相关文章

  1. 利用python画出动态高优先权优先调度

    之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...

  2. 在WPF中使用PlaneProjection模拟动态3D效果

    原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使 ...

  3. Golang模拟用户登陆,突破教务系统

    目录 一.Golang模拟用户登陆,突破教务系统 1.1 请求登陆页面 1.2 抓包分析登陆请求 1.3 golang使用js引擎合成salt 1.4 模拟表单提交,完成登陆 1.5 进入成绩查询页, ...

  4. Golang编写动态库实现回调函数

    Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...

  5. golang调用动态库

    测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...

  6. NFS-heartbeat-drbd模拟NFS高可用

    NFS介绍: NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS ...

  7. JAVA 模拟瞬间高并发

    如何模拟一个并发?当时我的回答虽然也可以算是正确的,但自己感觉缺乏实际可以操作的细节,只有一个大概的描述. 当时我的回答是:“线程全部在同一节点wait,然后在某个节点notifyAll.” 面试官: ...

  8. UnityShader - 模拟动态光照特效

    模型贴片 + 特效Shader = 动态光照特效 效果是这样的: 做法简单粗暴,直接使用模型贴片: shader上使用了noise只是提供一种思路,也有更简单的方法代替

  9. Golang: 模拟搜索引擎爬虫

    最近网站需要针对百度做 SEO 优化,用 Go 语言写了个测试程序,模拟一下百度的爬虫,看看返回的内容是否正确. 代码很简单,就是发送一个请求,把百度相关的信息放入请求头中即可,代码如下: packa ...

随机推荐

  1. 一款简单实用的jQuery图片画廊插件

    图片画廊 今天分享一个自己实现的jQuery 图片画廊插件. 看一下效果图: 点击图片时: 在线演示地址:http://www.jr93.top/photoGallery/photoGallery.h ...

  2. mbr看图

  3. zedgraph右键菜单的汉化

    http://blog.csdn.net/jeryler/article/details/7876376 修改 zedGraphControl的ContextMenuBuilder事件即可! zedG ...

  4. 第四章 消息摘要算法--SHA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 4.1.SHA 原理:消息摘要长度(可以定量为加密后的字符串的长度)越长,安全性越高 ...

  5. 51nod 1070 Bash游戏 V4

    这种博弈题  都是打表找规律 可我连怎么打表都不会 这个是凑任务的吧....以后等脑子好些了 再琢磨吧 就是斐波那契数列中的数 是必败态 #include<bits/stdc++.h> u ...

  6. Unity3D学习笔记(十三):委托、考试复习

    委托:比较什么时候用委托好   下课案例:不用下课铃 1.ClassManager需要拿到所有教室的引用,课堂管理者应该只负责计时并告知每间教室 2.每间教室应该是由当班老师负责是否需要下课,而课堂管 ...

  7. Source not found :Edit Source Lookup Path 解决方案

    作者原创,转载请注明转载地址 在eclipse中用debug调试的时候,出现了以下问题,很是尴尬,经常碰到,所以有必要进行总结一下: 对该问题有两种解决方案, 一种比较文明:解决方法可参考如下网址: ...

  8. Leetcode[1]Two Sum C++

    最简单的思想,遍历, 1.两层循环,自己写的,没有用STL,时间花费较长 vector<int> twoSum(vector<int>& nums, int targe ...

  9. python读取文本txt文件乱码问题

    python2的编码实在是个头疼的问题,编码问题也将作为一个长期的话题,遇到问题随时补充. 这次的问题比较简单,是在做词云wordcloud的时候发现的,作用就是从文本文件中读取文字,将其制作成词云. ...

  10. Jmeter 测试API接口 查看接口的幂等问题

    背景介绍: 比如一个注册接口,要求填入的手机号与DB中已有的不能重复, 如果手机号码重复,则此次注册失败,不会新增会员数据: 如果不重复,则注册成功(忽略其他因素). 但是用20个并发,同样的请求,请 ...