当前位置: 首页 > news >正文

【操作系统】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实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…...

Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)

1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果&#xff0c;但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下&#xff0c;深度学习模型的适应程度变低&#xff0c;检测结果也随之下降&#xff0c;因此研究在复杂气象条件下的目标检测方法…...

Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告

Jenkins支持的JDK版本17、21&#xff0c;通过java -version查看当前JDK版本&#xff0c;确认是否匹配 打开网址https://www.jenkins.io/download 点击下载&#xff0c;选择mac版本 commend空格打开终端&#xff0c;输入安装命令brew install jenkins 安装完成后输入brew servi…...

redis-Hash

一&#xff0c;应用场景 Redis hash 是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储&#xff0c;表中存放对象的信息。 二&#xff0c;命令 H…...

Kubernetes kafka系列 | Strimzi 部署kafka-bridge

Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件&#xff0c;用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台&#xff0c;广泛用于构建实时数据流水线和流式应用程序。然而…...

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences&#xff1f; 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中的脑裂

简单点来说&#xff0c;脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点&#xff0c;它们都知道在这个cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候&#xff0c;就会达成共识&#xff0c;选出其中一个作为 master。但是如果它们之间…...

【漏洞复现】金和OA XmlDeal.aspx XXE漏洞

0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…...

对比:React 还是 Vue

自己之前的开发栈一直是 Vue&#xff0c;对 Vue 的设计理念及底层实现原理算是颇有了解&#xff1b;随着公司技术迭代&#xff0c;近半年来开始接触&使用 React。 前面写了几篇关于 React 的文章&#xff0c;但大部分都是知识点以及开发过程问题的沉淀总结。 这篇文章想尝…...

ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法

前言 默认 SD 卡分区是 FAT32 格式&#xff0c;为了用于嵌入式Linux ext4 文件系统&#xff0c;需要改为 ext4 文件系统&#xff0c;但是SD 卡分区类型默认是 msdos 类型&#xff0c;也就是 MBR 类型&#xff0c;不是 GPT 类型。 烧写 ext4 分区表&#xff0c;或者使用 ubuntu…...

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于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依次执行如下命令...

二.音视频编辑-媒体组合-播放

引言 当涉及到音视频编辑时&#xff0c;媒体资源的提取和组合是至关重要的环节。在iOS平台上&#xff0c;AVFoundation框架提供了丰富而强大的功能&#xff0c;使得媒体资源的操作变得轻松而高效。从原始的媒体中提取片段&#xff0c;然后将它们巧妙地组合成一个完整的作品&am…...

前端安全-面试题(2024)

1. 面试总结话术: 前端常见的安全问题主要包括以下几种: 跨站脚本攻击(XSS):攻击者通过在目标网站注入恶意脚本,当用户访问网站时,恶意脚本会被执行,从而窃取用户信息或进行其他恶意操作。这种攻击通常利用表单提交、URL参数等方式注入脚本。存储型 xss 恶意代码存在数…...

CVE-2022-29405 Apache Archiva任意用户密码重置漏洞分析

Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven&#xff0c;Continuum和ANT等构建工具完美结合。Archiva提供的功能包括&#xff1a;远程Repository代理&#xff0c;基于角色的安全访问管理&#xff0c;Artifact分发、维护、查询&#xff0c;生成使用…...

ssm框架配置文件例子

emmm。。。。 就是说&#xff0c;正常ssm的配置文件长啥样&#xff1f; 就最基础的&#xff1f; 贴一下&#xff0c;备忘吧。 第一个&#xff1a;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的数据库的时候&#xff0c;本地maven中引入依赖&#xff1a; <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependenc…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...