【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码
文章目录
一、先来先服务调度算法(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)
算法思想是追求更少的平均时间,最少的平均周转时间,最少的平均平均带权周转时间算法规则是最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)。即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Shortest 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"请输入{i+1}号进程的到达时间和服务时间:")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_id+1, 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"请输入{i+1}号进程的到达时间和服务时间:")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]].Id+1, 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_id+1, 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_id+1, 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
相关文章:
【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码
文章目录 一、先来先服务调度算法(FCFS) 二、短作业优先调度算法(SJF) 三、高响应比优先调度算法(HRRN) 四、轮转调度算法(RR) 五、最早截至时间优先算法(EDF&#…...
Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)
1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果,但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下,深度学习模型的适应程度变低,检测结果也随之下降,因此研究在复杂气象条件下的目标检测方法…...
Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告
Jenkins支持的JDK版本17、21,通过java -version查看当前JDK版本,确认是否匹配 打开网址https://www.jenkins.io/download 点击下载,选择mac版本 commend空格打开终端,输入安装命令brew install jenkins 安装完成后输入brew servi…...
redis-Hash
一,应用场景 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。 二,命令 H…...
Kubernetes kafka系列 | Strimzi 部署kafka-bridge
Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件,用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台,广泛用于构建实时数据流水线和流式应用程序。然而…...
AR和VR如何改变客户体验?
How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…...
微信小程序中实现埋点的方法
在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…...
vue记事本渲染以及交互
以下是记事本的源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本</title><styl…...
Zookeeper中的脑裂
简单点来说,脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点,它们都知道在这个cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候,就会达成共识,选出其中一个作为 master。但是如果它们之间…...
【漏洞复现】金和OA XmlDeal.aspx XXE漏洞
0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…...
对比:React 还是 Vue
自己之前的开发栈一直是 Vue,对 Vue 的设计理念及底层实现原理算是颇有了解;随着公司技术迭代,近半年来开始接触&使用 React。 前面写了几篇关于 React 的文章,但大部分都是知识点以及开发过程问题的沉淀总结。 这篇文章想尝…...
ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法
前言 默认 SD 卡分区是 FAT32 格式,为了用于嵌入式Linux ext4 文件系统,需要改为 ext4 文件系统,但是SD 卡分区类型默认是 msdos 类型,也就是 MBR 类型,不是 GPT 类型。 烧写 ext4 分区表,或者使用 ubuntu…...
Kubernetes(K8s)技术解析
1. K8s简介 Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案,帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…...
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 一、简单介绍 二、简单颜色反转效果实现原理 三、简单颜色反转效果案例实现简单步骤 四、注…...
【ELK+Kafka+filebeat分布式日志收集】部署filebeat和Kibana(三)
filebeat下载 官网:https://www.elastic.co/cn/downloads/beats/filebeat 或者 cd /opt wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz依次执行如下命令...
二.音视频编辑-媒体组合-播放
引言 当涉及到音视频编辑时,媒体资源的提取和组合是至关重要的环节。在iOS平台上,AVFoundation框架提供了丰富而强大的功能,使得媒体资源的操作变得轻松而高效。从原始的媒体中提取片段,然后将它们巧妙地组合成一个完整的作品&am…...
前端安全-面试题(2024)
1. 面试总结话术: 前端常见的安全问题主要包括以下几种: 跨站脚本攻击(XSS):攻击者通过在目标网站注入恶意脚本,当用户访问网站时,恶意脚本会被执行,从而窃取用户信息或进行其他恶意操作。这种攻击通常利用表单提交、URL参数等方式注入脚本。存储型 xss 恶意代码存在数…...
CVE-2022-29405 Apache Archiva任意用户密码重置漏洞分析
Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven,Continuum和ANT等构建工具完美结合。Archiva提供的功能包括:远程Repository代理,基于角色的安全访问管理,Artifact分发、维护、查询,生成使用…...
ssm框架配置文件例子
emmm。。。。 就是说,正常ssm的配置文件长啥样? 就最基础的? 贴一下,备忘吧。 第一个:applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http…...
maven构建项目报错:Failure to find com.microsoft.sqlserver:sqljdbc4:jar:4.0 in
背景 今天在项目里面查询sqlserver的数据库的时候,本地maven中引入依赖: <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependenc…...
已解决rabbitmq AMQPConnectionClosedException:管道破裂或连接关闭异常的正确解决方法,亲测有效!!!
已解决rabbitmq AMQPConnectionClosedException:管道破裂或连接关闭异常的正确解决方法,亲测有效!!! 目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 五、总结 博主v:XiaoMing_Java 一、…...
Excel 隔几行批量插入空白行
例如如下表格,每隔6行插入一行数据: 1)第7个单元格输入1 2)选中6个单元格,然后双击填充数据: 3)F5 找到常量 Ctrlshift 复制插入的数据,然后选中数据 按F5,定位到空值...
2024年04月在线IDE流行度最新排名
点击查看最新在线IDE流行度最新排名(每月更新) 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…...
如何通过Elasticsearch实现搜索的关键词达到高亮的效果
高亮 首先介绍一下什么是搜索的关键词达到高亮的效果,如图所示 当在百度里面搜索elasticsearch的时候,可以看到出现的搜索结果里面elasticsearch这个关键词明显与其他的条文不一样,用红颜色凸显了“高亮效果”。当我们想要在自己的项目里面…...
真实sql注入以及小xss--BurpSuite联动sqlmap篇
前几天漏洞检测的时候无意发现一个sql注入 首先我先去网站的robots.txt去看了看无意间发现很多资产 而我意外发现admin就是后台 之后我通过基础的万能账号密码测试or ‘1‘’1也根本没有效果 而当我注入列的时候情况出现了 出现了报错,有报错必有注入点 因此我…...
Java类和对象练习题
练习一 下面代码的运行结果是() public static void main(String[] args){String s;System.out.println("s"s);} 解析:本题中的代码不能编译通过,因为在Java当中局部变量必须先初始化,后使用。所以此处编译不…...
Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示
1.效果图 2.代码实现 2.1 .pro文件 QT core gui multimedia multimediawidgets 2.2 .h文件 #ifndef VIDEOPLAYING_H #define VIDEOPLAYING_H#include <QWidget> #include<QFileDialog>#include<QMediaPlayer> #include<QMediaRecorder> #in…...
vue基础教程(6)——构建项目级登录页
同学们可以私信我加入学习群! 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点:四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除,也搭建了最简单的router路由,下面就可以真正开发我们自己的项目…...
C++宝强越狱1.0.6版本
没啥好说的,更新了一关,上代码 #include"bits/stdc.h" #include"Windows.h" #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) using namespace std; int w3,s3,a3,d3; bool nfalse,iptrue,mfals…...
构建高可用性数据库架构:深入探索Oracle Active Data Guard(ADG)
随着企业数据规模的不断增长和业务的复杂化,数据库的高可用性和可靠性变得尤为重要。Oracle Active Data Guard(ADG)作为Oracle数据库提供的一种高可用性解决方案,在实时备份和灾难恢复方面发挥着重要作用。本文将深入探讨ADG的原…...
广州seo地址/西安seo主管
题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割找解析考前必练!安全生产模拟考试一点通每个月更新熔化焊接与热切割模拟考试题题目及答案!多做几遍,其实通过熔化焊接与热切割模拟考试题库很简单。 1、【单选题】…...
wordpress 支持手机6/专门代写平台
查看当前系统是否有安装ssh ssh localhost ssh: connect to host localhost port 22: Connection refused //没安装 安装 sudo apt-get install openssh-server 启动服务 sudo /etc/init.d/ssh start ps -e|grep ssh // 查看启动是否成功 ssh的配置方法 /etc/ssh/sshd_c…...
龙岗义乌网站制作/网站优化课程
最近想开始多学习一下工作中代码常常使用的设计模式。 除单例模式,工厂模式之外,command模式用的也是比较多的。 在学习了“正统”的设计模式之后,再来看实际项目代码中使用的类似的设计模式,发现还是有差别的——事实上&#x…...
怎么把网站做成手机版的/百度搜题在线使用
RSA加密解密算法 是非对称加解密算法的一种,也是非常常用的一种方法。 在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求…...
江苏建设网站酒店装修合同范本/推广产品的文案
记得有这么一句广告词:“软件以用为主”。这句广告词的背后传达了时下人们对于软件的一种普遍的认识和价值取向:软件是而且仅是一种工具。不仅软件的普通用户或者高级用户,就算是软件供应商也对软件持这样一种价值观。功用或者功能似乎成了软…...
怎么做免流网站/舆情网站直接打开的软件
部署了WSUS服务器,使用正常,由于补丁下载的硬盘空间不够了,需要把补丁下载的路径改到一个比较大的硬盘上由于磁盘空间不足,希望将下载的更新文件搬迁到一个新的分区。可以使用WSUS中自带的wsusutil工具进行更新安装文件的搬迁操作。具体步骤如下:\1. 以本…...