手机html5网站开发,电子商务网站建设工具,绍兴公司注册,ui在线设计工具文章目录
一、先来先服务调度算法#xff08;FCFS#xff09;
二、短作业优先调度算法#xff08;SJF#xff09;
三、高响应比优先调度算法#xff08;HRRN#xff09;
四、轮转调度算法#xff08;RR#xff09;
五、最早截至时间优先算法#xff08;EDF#…文章目录
一、先来先服务调度算法FCFS
二、短作业优先调度算法SJF
三、高响应比优先调度算法HRRN
四、轮转调度算法RR
五、最早截至时间优先算法EDF
六、最低松弛度优先算法LLF 相关时间计算 周转时间 作业完成时刻 - 作业到达时刻 等待时间 周转时间 - 运行时间带权周转时间 周转时间 / 服务时间 平均周转时间 作业周转时间之和 / 作业个数 平均带权周转时间 带权周转时间之和 / 作业个数 服务时间作业的运行时间 一、先来先服务调度算法FCFS 如果早就绪的进程排在就绪队列的前面迟就绪的进程排在就绪队列的后面那么先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说它只考虑进程进入就绪队列的先后而不考虑它的下一个CPU周期的长短及其他因素。 先来先服务的调度算法是最简单的调度算法既可以用于作业调度 也可以用于程序调度当作业调度中采用该算法时系统将按照作业到达的先后次序来进行调度优先从后备队列中选择一个或多个位于队列头部的作业把他们调入内存分配所需资源、创建进程然后放入“就绪队列”,直到该进程运行到完成或发生某事件堵塞后进程调度程序才将处理机分配给其他进程。
实现代码
avg_turnaround_time 0.0
aqtt 0.0class Progress:def __init__(self):self.pro_name self.arrive_time 0self.service_time 0self.finish_time 0self.cycling_time 0self.float_wi 0.0courses [Progress() for _ in range(80)]def health_examine(course_num):returndef progress_num(course_num):i 0for i in range(course_num):print(Enter information for process %d % (i 1))courses[i].pro_name input(Enter process name: ) #进程名courses[i].arrive_time int(input(Enter arrival time: )) #到达时间courses[i].service_time int(input(Enter service time: )) #服务时间returndef finish_time(course_num):i 0if courses[0].arrive_time ! 0:courses[0].finish_time courses[0].arrive_time courses[0].service_timecourses[0].finish_time courses[0].service_timefor i in range(1, course_num):if courses[i - 1].finish_time courses[i].arrive_time:courses[i].finish_time courses[i - 1].finish_time courses[i].service_timeelse:courses[i].finish_time courses[i].arrive_time courses[i].service_timereturndef cycling_time(course_num): #周转时间for i in range(course_num):courses[i].cycling_time courses[i].finish_time - courses[i].arrive_timereturndef float_wi(course_num): #带权周转时间for i in range(course_num):courses[i].float_wi float(courses[i].cycling_time) / courses[i].service_timereturndef avg_turnaround_time(course_num): #平均周转时间sum_turnaround_time 0for i in range(course_num):sum_turnaround_time courses[i].cycling_timeglobal avg_turnaround_timeavg_turnaround_time sum_turnaround_time / course_numreturndef aqtt(course_num): #平均带权周转时间sum_float_wi 0for i in range(course_num):sum_float_wi courses[i].float_wiglobal aqttaqtt sum_float_wi / course_numreturndef print_fifo(course_num):print(Process information:)print(Process\tArrival Time\tService Time\tFinish Time\tTurnaround Time\tWeighted Turnaround)for i in range(course_num):print(%s\t%d\t%d\t%d\t%d\t%.2f % (courses[i].pro_name, courses[i].arrive_time, courses[i].service_time, courses[i].finish_time, courses[i].cycling_time, courses[i].float_wi))print(Average Turnaround Time\tAverage Weighted Turnaround Time)print(%.2f\t%.2f % (avg_turnaround_time, aqtt))returndef main():course_num 5course_num int(input(Enter the number of processes: ))progress_num(course_num)finish_time(course_num)cycling_time(course_num)float_wi(course_num)avg_turnaround_time(course_num)aqtt(course_num)print_fifo(course_num)if __name__ __main__:main()
输出信息
Enter the number of processes: 3
Enter information for process 1
Enter process name: p1
Enter arrival time: 0
Enter service time: 5
Enter information for process 2
Enter process name: p2
Enter arrival time: 2
Enter service time: 1
Enter information for process 3
Enter process name: p3
Enter arrival time: 3
Enter service time: 4
Process information:
Process Arrival Time Service Time Finish Time Turnaround Time Weighted Turnaround
p1 0 5 5 5 1.00
p2 2 1 6 4 4.00
p3 3 4 10 7 1.75
Average Turnaround Time Average Weighted Turnaround Time
5.33 2.25进程已结束,退出代码0
二、短作业优先调度算法SJF 算法思想是追求更少的平均时间最少的平均周转时间最少的平均平均带权周转时间算法规则是最短的作业/进程优先得到服务所谓“最短”是指要求服务时间最短。即可用于作业调度也可用于进程调度。用于进程调度时称为“短进程优先SPFShortest Process First算法”。 SJF和SPF都是非抢占式的算法。但是也有抢占式的版本----最短剩余时间优先算法。SRTN,Shortest Remaining Time Next 优点 最短的平均等待时间、平均周转时间缺点 不公平。对短作业有利对长作业不利。可能产生饥饿现象。另外进程/作业的运行时间都是由用户提供的并不一定真实不一定能做到真正的短作业优先。饥饿 会导致饥饿
实现代码非抢占式 N 5
class PCB:def __init__(self):self.process_name self.arrive_time 0self.service_time 0self.complete_time 0PCB_list [PCB() for _ in range(N 1)]def sjf(n):for i in range(1, n 1):print(请输入第, i, 进程名字: , end)PCB_list[i].process_name input()print(请输入到达时间: , end)PCB_list[i].arrive_time int(input())print(请输入服务时间: , end)PCB_list[i].service_time int(input())temp 1for i in range(2, n 1):if PCB_list[temp].arrive_time PCB_list[i].arrive_time or (PCB_list[temp].arrive_time PCB_list[i].arrive_time and PCB_list[temp].service_time PCB_list[i].service_time):temp iPCB_list[0] PCB_list[temp]PCB_list[temp] PCB_list[1]PCB_list[1] PCB_list[0]sum 1PCB_list[1].complete_time PCB_list[1].arrive_time PCB_list[1].service_timetime PCB_list[1].complete_timeprint(\n第1次进程调度运行的进程为 : , PCB_list[1].process_name)nextprocess 0while True:if sum n:breaknextprocess i sum 1while i n:if time PCB_list[i].arrive_time and PCB_list[i].service_time PCB_list[nextprocess].service_time:nextprocess ii 1PCB_list[0] PCB_list[nextprocess]PCB_list[nextprocess] PCB_list[sum 1]PCB_list[sum 1] PCB_list[0]nextprocess sum 1if PCB_list[nextprocess].arrive_time time:time PCB_list[nextprocess].arrive_timetime PCB_list[nextprocess].service_timePCB_list[nextprocess].complete_time timesum 1print(第, sum, 次进程调度运行的进程为 : , PCB_list[nextprocess].process_name)return 0def print_info():i 1round_time [0] * (N 1)force_round_time [0] * (N 1)sum_time 0print(\n 进程 到达时间 服务时间 完成时间 周转时间 带权周转时间)while i N 1:round_time[i] PCB_list[i].complete_time - PCB_list[i].arrive_timeforce_round_time[i] round_time[i] / PCB_list[i].service_timeprint(PCB_list[i].process_name, \t , PCB_list[i].arrive_time, \t , PCB_list[i].service_time, \t\t ,PCB_list[i].complete_time, \t , round_time[i], \t , force_round_time[i])sum_time force_round_time[i]i 1print(\n\n系统平均带权周转时间: , (sum_time / (i - 1)))if __name__ __main__:print(\t\t短作业优先调度算法)sjf(N)print_info()
输出信息
请输入第 1 进程名字: p1
请输入到达时间: 0
请输入服务时间: 5
请输入第 2 进程名字: p2
请输入到达时间: 2
请输入服务时间: 1
请输入第 3 进程名字: p3
请输入到达时间: 3
请输入服务时间: 4
请输入第 4 进程名字: p4
请输入到达时间: 5
请输入服务时间: 6
请输入第 5 进程名字: p5
请输入到达时间: 7
请输入服务时间: 8第1次进程调度运行的进程为 : p1
第 2 次进程调度运行的进程为 : p2
第 3 次进程调度运行的进程为 : p3
第 4 次进程调度运行的进程为 : p4
第 5 次进程调度运行的进程为 : p5进程 到达时间 服务时间 完成时间 周转时间 带权周转时间
p1 0 5 5 5 1.0
p2 2 1 6 4 4.0
p3 3 4 10 7 1.75
p4 5 6 16 11 1.8333333333333333
p5 7 8 24 17 2.125系统平均带权周转时间: 2.1416666666666666进程已结束,退出代码0三、高响应比优先调度算法HRRN 高响应比优先算法考虑了作业的等待时间又考虑了作业运行时间的调度算法因此照顾了短作业又不致使长作业等待时间过长从而改善了处理机的调度的性能。这个算法相当于给与每个作业一个动态的优先级这个优先级是随着时间变化的变化的等待时间不断地增加这将让长作业的优先级在等待期间不断地增大等待足够的时间必然会得到处理机。 1、该优先级的变化规则可以描述为 2、规律
作业的等待时间相同则要求服务的越短优先级越高类似于SJF算法。当要求服务的时间相同时等得越久优先级越高类似于FCFS算法。对于长作业来说该算法实现了较好的折中。
3、优点算法折中长短作业兼顾时间分配较为均匀。
4、缺点每次计算响应比都会花费一定时间即时间开销其性能比SJF算法略差。 实现代码
class JobControl:def __init__(self, Id, arr_time, ser_time):self.Id Id # 序号self.arr_time arr_time # 到达时间self.ser_time ser_time # 服务时间self.Rp 0self.state Falsejobs []
n 0 # 进程个数
new_time 0if __name__ __main__:print(请输入进程总数)n int(input())min_arr_time float(inf)for i in range(n):print(f请输入{i1}号进程的到达时间和服务时间)Id iarr_time, ser_time map(float, input().split())jobs.append(JobControl(Id, arr_time, ser_time))if arr_time min_arr_time:min_arr_time arr_timenew_time min_arr_timeprint(进程执行的顺序)m 0while m ! n:max_Rp -1max_id 0for i in range(n):if not jobs[i].state and jobs[i].arr_time new_time:jobs[i].Rp ((new_time - jobs[i].arr_time) jobs[i].ser_time) / jobs[i].ser_timeif max_Rp jobs[i].Rp:max_Rp jobs[i].Rpmax_id ijobs[max_id].state Truenew_time jobs[max_id].ser_timeprint(max_id1, end )m 1print(\n进程的完成时间, new_time)
输出信息
请输入进程总数
4
请输入1号进程的到达时间和服务时间
0 20
请输入2号进程的到达时间和服务时间
5 15
请输入3号进程的到达时间和服务时间
1 5
请输入4号进程的到达时间和服务时间
15 10
进程执行的顺序
1 3 2 4
进程的完成时间 50.0进程已结束,退出代码0四、轮转调度算法RR 在轮转(RR)法中系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断去激活进程调度程序进行调度把CPU分配给队首进程并令其执行一个时间片。当它运行完毕后又把处理机分配给就绪队列中新的队首进程也让它执行一个时间片。 在RR调度算法中应在何时进行进程的切换可分为两种情况 ① 若一个时间片尚未用完正在运行的进程便已经完成就立即激活调度程序将它从就绪队列中删除再调度就绪队列中队首的进程运行并启动一个新的时间片。 ② 在一个时间片用完时计时器中断处理程序被激活。如果进程尚未运行完毕调度程序将把它送往就绪队列的末尾。 基于时间片为1的进程运行情况 实现代码
class JC:def __init__(self):self.Id 0self.arr_time 0.0self.ser_time 0.0self.state Falseself.arr_s Falsejc [JC() for _ in range(10)]
n 0
new_time 0.0
rr 0.0if __name__ __main__:min_val 0xFFFprint(请输入进程的总数)n int(input())print(请依次输入各进程的信息按到达时间排列)for i in range(n):print(f请输入{i1}号进程的到达时间和服务时间)jc[i].Id ijc[i].arr_time, jc[i].ser_time map(float, input().split())print(请输入时间片)rr float(input())m 0print(进程完成执行的顺序)jc[0].arr_s Truearr_sum 1ary [-1] * 100ary[0] 0k 1q 0while True:if jc[ary[q]].arr_s and not jc[ary[q]].state:if jc[ary[q]].ser_time rr:new_time jc[ary[q]].ser_timejc[ary[q]].state Truejc[ary[q]].ser_time 0print(jc[ary[q]].Id1, end )m 1q 1if arr_sum n:for i in range(arr_sum, n):if jc[i].arr_time new_time and not jc[i].arr_s:jc[i].arr_s Trueary[k] ik 1else:new_time rrjc[ary[q]].ser_time - rrif arr_sum n:for i in range(arr_sum, n):if jc[i].arr_time new_time and not jc[i].arr_s:jc[i].arr_s Trueary[k] ik 1ary[k] ary[q]k 1q 1if m n:breakprint(f进程的完成时间 {new_time})
输出信息
请输入进程的总数
5
请依次输入各进程的信息按到达时间排列
请输入1号进程的到达时间和服务时间
0 4
请输入2号进程的到达时间和服务时间
1 3
请输入3号进程的到达时间和服务时间
2 4
请输入4号进程的到达时间和服务时间
3 2
请输入5号进程的到达时间和服务时间
4 4
请输入时间片
1
进程完成执行的顺序
2 4 1 3 5 进程的完成时间 17.0
五、最早截至时间优先算法EDF 最早截止期限优先EDF调度根据截止期限动态分配优先级。截止期限越早优先级越高截止期限越晚优先级越低。根据 EDF 策略当一个进程可运行时它应向系统公布截止期限要求。优先级可能需要进行调整以便反映新可运行进程的截止期限。注意单调速率调度与 EDF 调度的不同前者的优先级是固定的。 在每一个新的就绪状态调度器都是从那些已就绪但还没有完全处理完毕的任务中选择最早截止时间的任务并将执行该任务所需的资源分配给它。在有新任务到来时调度器必须立即计算EDF排出新的定序即正在运行的任务被剥夺并且按照新任务的截止时间决定是否调度该新任务。如果新任务的最后期限早于被中断的当前任务就立即处理新任务。按照EDF算法被中断任务的处理将在稍后继续进行。 该算法的思想是从两个任务中选择截至时间最早的任务把它暂作为当前处理任务再判断该任务是否在当前周期内若不在当前周期内就让另一任务暂作当前处理任务若该任务也不在当前周期内就让CPU空跑到最靠近的下一个截至时间的开始若有任务在该周期内就判断该任务的剩余时间是否小于当前截至时间与当前时间的差若小于则让该任务运行到结束否则就让该任务运行到该周期的截止时间就立即抢回处理器再判断紧接着的最早截至时间,并把处理器给它,做法同上如此反复执行。
非抢占式调度任务用于非周期实时任务 抢占式调度任务用于周期性实时任务 实现代码抢占式
class JobControl:def __init__(self, Id, arr_time, ser_time, end_time):self.Id Idself.arr_time arr_timeself.ser_time ser_timeself.end_time end_timeself.edf -1self.state Falsen 7
jc [JobControl(0, 0, 0, 0) for _ in range(10)]
new_time 0print(进程总数为 str(n))for i in range(5):jc[i].Id ijc[i].arr_time i * 20jc[i].ser_time 10jc[i].end_time (i 1) * 20for i in range(5, 7):jc[i].Id ijc[i].arr_time (i - 5) * 50jc[i].ser_time 25jc[i].end_time (i - 5 1) * 50m 0
min_val 0xFFF
min_id 0print(进程完成执行的顺序)
while True:for i in range(7):if jc[i].arr_time new_time and not jc[i].state and jc[i].edf -1:if jc[i].end_time min_val:min_val jc[i].end_timemin_id jc[i].Idjc[i].edf 0jc[min_id].ser_time - 5new_time 5if jc[min_id].ser_time 0:jc[min_id].state Trueprint(min_id1, end )m 1min_val 0xFFFfor i in range(7):if jc[i].arr_time new_time and not jc[i].state:if jc[i].end_time min_val:min_val jc[i].end_timemin_id jc[i].Idif m n:breakprint()
print(进程的完成执行时间 str(new_time))输出信息
进程总数为7
进程完成执行的顺序
1 2 6 3 4 7 5
进程的完成执行时间100
六、最低松弛度优先算法LLF 最低松弛度优先算法Lowest Slack Time First简称LLF是一种动态优先级调度算法它根据进程的剩余处理时间和截止时间来确定优先级以确保系统能够尽可能快地完成最紧急的任务。在LLF算法中每个进程都有一个松弛度Slack Time表示当前时间到达截止时间的剩余时间。 LLF算法的核心思想是选择具有最低松弛度的进程作为下一个执行的任务以最大限度地降低任务的响应时间和延迟。根据任务的紧急(或松弛)度来确定任务的优先级紧急度越高优先级越高。要求系统中有一个按松弛度排序的实时任务就绪队列松弛度最低的任务排在任务最前面。
主要用于可抢占调度方式中松弛度必须完成的时间 - 其本身的运行时间 - 当前时间抢占时机松弛度为零时。最小响应时间 LLF算法优先执行剩余处理时间最短、截止时间最近的任务因此能够最小化任务的响应时间。高实时性 LLF算法适用于对任务响应时间有严格要求的实时系统能够确保紧急任务及时完成。负载均衡 LLF算法能够在各个任务之间实现相对均衡的负载分配提高系统整体性能。
实现代码
class Job:def __init__(self):self.Id 0self.arr_time 0.0self.ser_time 0.0self.end_time 0.0self.llf -1self.state Falsen 6
jc [Job() for _ in range(10)]
new_time 0print(进程总数, n)for i in range(4):jc[i].Id ijc[i].arr_time i * 20jc[i].ser_time 10jc[i].end_time (i 1) * 20for i in range(4, 6):jc[i].Id ijc[i].arr_time (i - 4) * 50jc[i].ser_time 25jc[i].end_time (i - 4 1) * 50m 0
min_val float(inf)
min_id 0print(进程完成执行的顺序)
while True:for i in range(6):if jc[i].arr_time new_time and not jc[i].state and jc[i].llf -1:jc[i].llf jc[i].end_time - jc[i].ser_time - new_timeif jc[i].llf min_val:min_val jc[i].llfmin_id jc[i].Idjc[min_id].ser_time - 5new_time 5if jc[min_id].ser_time 0:jc[min_id].state Trueprint(min_id1, end )m 1min_val float(inf)for i in range(6):if jc[i].arr_time new_time and not jc[i].state:jc[i].llf jc[i].end_time - jc[i].ser_time - new_timeif jc[i].llf min_val:min_val jc[i].llfmin_id jc[i].Idif m n:breakprint(\n)
print(进程的完成执行时间, new_time)
输出信息
进程总数 6
进程完成执行的顺序
1 2 5 3 4 6 进程的完成执行时间 90 文章转载自: http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.rkzk.cn.gov.cn.rkzk.cn http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn http://www.morning.i-bins.com.gov.cn.i-bins.com http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.nytgk.cn.gov.cn.nytgk.cn http://www.morning.xhfky.cn.gov.cn.xhfky.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.qhydkj.com.gov.cn.qhydkj.com http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.wkgyz.cn.gov.cn.wkgyz.cn http://www.morning.ykwgl.cn.gov.cn.ykwgl.cn http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn http://www.morning.kdldx.cn.gov.cn.kdldx.cn http://www.morning.gkktj.cn.gov.cn.gkktj.cn http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.qqpg.cn.gov.cn.qqpg.cn http://www.morning.rlhh.cn.gov.cn.rlhh.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.ccphj.cn.gov.cn.ccphj.cn http://www.morning.fmtfj.cn.gov.cn.fmtfj.cn http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn http://www.morning.tlpgp.cn.gov.cn.tlpgp.cn http://www.morning.hqzmz.cn.gov.cn.hqzmz.cn http://www.morning.hlfgm.cn.gov.cn.hlfgm.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.gqtw.cn.gov.cn.gqtw.cn http://www.morning.hotlads.com.gov.cn.hotlads.com http://www.morning.xtqld.cn.gov.cn.xtqld.cn http://www.morning.wyzby.cn.gov.cn.wyzby.cn http://www.morning.qnywy.cn.gov.cn.qnywy.cn http://www.morning.ngcw.cn.gov.cn.ngcw.cn http://www.morning.daxifa.com.gov.cn.daxifa.com http://www.morning.rywn.cn.gov.cn.rywn.cn http://www.morning.kngx.cn.gov.cn.kngx.cn http://www.morning.fysdt.cn.gov.cn.fysdt.cn http://www.morning.syqtt.cn.gov.cn.syqtt.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.gyqnp.cn.gov.cn.gyqnp.cn http://www.morning.skkln.cn.gov.cn.skkln.cn http://www.morning.ydfr.cn.gov.cn.ydfr.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.tcxzn.cn.gov.cn.tcxzn.cn http://www.morning.qsmch.cn.gov.cn.qsmch.cn http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn http://www.morning.qynpw.cn.gov.cn.qynpw.cn http://www.morning.syssdz.cn.gov.cn.syssdz.cn http://www.morning.qydgk.cn.gov.cn.qydgk.cn http://www.morning.kgxrq.cn.gov.cn.kgxrq.cn http://www.morning.gwdnl.cn.gov.cn.gwdnl.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.lfsmf.cn.gov.cn.lfsmf.cn http://www.morning.lmhwm.cn.gov.cn.lmhwm.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.qwmsq.cn.gov.cn.qwmsq.cn http://www.morning.tlbdy.cn.gov.cn.tlbdy.cn http://www.morning.cgdyx.cn.gov.cn.cgdyx.cn http://www.morning.qllcp.cn.gov.cn.qllcp.cn http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.ttaes.cn.gov.cn.ttaes.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.hwzzq.cn.gov.cn.hwzzq.cn http://www.morning.rbkdg.cn.gov.cn.rbkdg.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.hblkq.cn.gov.cn.hblkq.cn http://www.morning.rdlfk.cn.gov.cn.rdlfk.cn http://www.morning.ymwny.cn.gov.cn.ymwny.cn http://www.morning.sqgqh.cn.gov.cn.sqgqh.cn