Linux内核实时线程throtted机制

2023-11-02

Linux内核支持实时线程和非实时线程同时工作,并且可以给实时线程分配适当的执行比例,当超过设置的比例的时候,调度器将不再调度实时线程工作,这样做保证了即便在实时线程不主动放弃CPU的情况下,CPU的占用率也不会到%100,保证了其它线程总有执行时间。

具体实验可以看下片博客:

Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别

下面我们分析一下它的内核实现机制,从上篇博客我们知道关键的变量是rt_throttled,系统在调度器初始化阶段会分配RT线程默认的CPU带宽

 而初始化bandwidth 依赖的两个关键变量均来自于/proc/sys/kernel下的关键节点配置:

我们尝试调试一下它的变化逻辑,加入下面的补丁:

diff --git a/linux-5.4.138/kernel/sched/rt.c b/linux-5.4.138/kernel/sched/rt.c
index 1e102783d..2dffb8762 100644
--- a/linux-5.4.138/kernel/sched/rt.c
+++ b/linux-5.4.138/kernel/sched/rt.c
@@ -763,10 +763,6 @@ static void __disable_runtime(struct rq *rq)
 		 * runtime - in which case borrowing doesn't make sense.
 		 */
 		rt_rq->rt_runtime = RUNTIME_INF;
-		//if(strcmp("a.out", current->comm) == 0)
-		{
-			printk("%s line %d, throttled is %d, set to zero, comm %s.rq_rq = %p\n", __func__, __LINE__, rt_rq->rt_throttled, current->comm,rt_rq);
-		}
 		rt_rq->rt_throttled = 0;
 		raw_spin_unlock(&rt_rq->rt_runtime_lock);
 		raw_spin_unlock(&rt_b->rt_runtime_lock);
@@ -794,10 +790,6 @@ static void __enable_runtime(struct rq *rq)
 		raw_spin_lock(&rt_rq->rt_runtime_lock);
 		rt_rq->rt_runtime = rt_b->rt_runtime;
 		rt_rq->rt_time = 0;
-		//if(strcmp("a.out", current->comm) == 0)
-		{
-			printk("%s line %d, throttled is %d, set to zero, comm %s.rq_rq = %p\n", __func__, __LINE__, rt_rq->rt_throttled, current->comm,rt_rq);
-		}
 		rt_rq->rt_throttled = 0;
 		raw_spin_unlock(&rt_rq->rt_runtime_lock);
 		raw_spin_unlock(&rt_b->rt_runtime_lock);
@@ -868,11 +860,6 @@ static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
 			runtime = rt_rq->rt_runtime;
 			rt_rq->rt_time -= min(rt_rq->rt_time, overrun*runtime);
 			if (rt_rq->rt_throttled && rt_rq->rt_time < runtime) {
-				//if(strcmp("a.out", current->comm) == 0)
-				{
-					printk("%s line %d, throttled is %d, set to zero, comm %s.rq_rq = %p\n", __func__, __LINE__, rt_rq->rt_throttled, current->comm,rt_rq);
-				}
-
 				rt_rq->rt_throttled = 0;
 				enqueue = 1;
 
@@ -943,9 +930,8 @@ static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
 		 * but accrue some time due to boosting.
 		 */
 		if (likely(rt_b->rt_runtime)) {
-			printk_deferred_once("sched: RT throttling activated\n");
-			printk("%s line %d, throttled set to one, comm %s.pree is %d.rq_rq = %p\n", __func__, __LINE__, current->comm, rt_rq->rt_throttled, rt_rq);
 			rt_rq->rt_throttled = 1;
+			printk_deferred_once("sched: RT throttling activated\n");
 		} else {
 			/*
 			 * In case we did anyway, make it go away,
@@ -1586,20 +1572,12 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
 static struct task_struct *
 pick_next_task_rt(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
 {
-	static unsigned long counter = 0;
 	struct task_struct *p;
 
 	WARN_ON_ONCE(prev || rf);
 
 	if (!sched_rt_runnable(rq))
-	{
-		counter ++;
-		if(counter % 10 == 0)
-		{
-			printk("%s line %d. comm %s, pick next is null, throttled.\n", __func__, __LINE__, prev->comm);
-		}
 		return NULL;
-	}
 
 	p = _pick_next_task_rt(rq);
 	set_next_task_rt(rq, p, true);

修改内核代码rt,增加调试信息,重新编译内核,启动。

编写用户态测试用例,基于Posix创建实时线程

#include <string.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>

void *child_thread(void *arg)
{
	int policy = 0;
	int max_priority = 0,min_priority = 0;
	struct sched_param param;
	pthread_attr_t attr;
	struct sched_param sp;
	bzero((void*)&sp, sizeof(sp));
	 
	pthread_attr_init(&attr);
	pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
	pthread_attr_getinheritsched(&attr,&policy);

	if(policy == PTHREAD_EXPLICIT_SCHED){
		printf("Inheritsched:PTHREAD_EXPLICIT_SCHED\n");
	}

	if(policy == PTHREAD_INHERIT_SCHED){
		printf("Inheritsched:PTHREAD_INHERIT_SCHED\n");
	}
	 
	pthread_attr_setschedpolicy(&attr,SCHED_RR);
	//pthread_attr_setschedpolicy(&attr,SCHED_OTHER);
	pthread_attr_getschedpolicy(&attr,&policy);

	if(policy == SCHED_FIFO){
		printf("Schedpolicy:SCHED_FIFO\n");
	}
	if(policy == SCHED_RR){
		printf("Schedpolicy:SCHED_RR\n");
	}
	if(policy == SCHED_OTHER){
		printf("Schedpolicy:SCHED_OTHER\n");
	}

	max_priority = sched_get_priority_max(policy);
	min_priority = sched_get_priority_min(policy);
	printf("Maxpriority:%u\n",max_priority);
	printf("Minpriority:%u\n",min_priority);
	 
	param.sched_priority = max_priority;
	pthread_attr_setschedparam(&attr,&param);

	sp.sched_priority = 1;
	// Actually set the sched params for the current thread.
	if (0 == pthread_setschedparam(pthread_self(), policy, &sp)) {
		printf("IO Thread #%ld using high-priority scheduler!", pthread_self());
	}

	printf("sched_priority:%u\n",param.sched_priority);
	while(1);
	pthread_attr_destroy(&attr);
}
 
int main(int argc,char *argv[ ])
{
	pthread_t child_thread_id; 
	pthread_create(&child_thread_id,NULL,child_thread,NULL);
	pthread_join(child_thread_id,NULL);

	return 0;
} 

编译生成a.out.

修改sched_rt_runtime_us的值,将RT线程的占比从%95调整为%30.

root@caozilong-Vostro-3268:/proc/sys/kernel# 
root@caozilong-Vostro-3268:/proc/sys/kernel# cat sched_rt_runtime_us 
950000
root@caozilong-Vostro-3268:/proc/sys/kernel# cat sched_rt_period_us 
1000000
root@caozilong-Vostro-3268:/proc/sys/kernel# echo 300000 > sched_rt_runtime_us 
root@caozilong-Vostro-3268:/proc/sys/kernel# cat sched_rt_runtime_us 
300000
root@caozilong-Vostro-3268:/proc/sys/kernel# cat sched_rt_period_us 
1000000
root@caozilong-Vostro-3268:/proc/sys/kernel# 

PC为4核,所以运行四次,可见CPU占用率稳定在 %30,还有四核有8个a.out在运行,是因为测试程序中创建了两个线程,一个主线程和一个实时线程,四个CPU运行四个最高优先级的线程同时存在,它们共同瓜分了%30的CPU占用率。

 dmesg调试输出:

[  152.226547] pick_next_task_rt line 1599. comm (efault), pick next is null, throttled.
[  152.543163] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  152.543167] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  152.543170] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  152.543172] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  153.143066] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  153.143069] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  153.144062] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  153.144064] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  153.543199] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  153.543203] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  153.543205] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  153.543208] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  154.143035] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  154.144034] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  154.144037] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  154.144040] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  154.149441] pick_next_task_rt line 1599. comm (efault), pick next is null, throttled.
[  154.543167] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  154.543172] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  154.543175] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  154.543177] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  155.143008] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  155.143013] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  155.143017] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  155.144005] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  155.161285] pick_next_task_rt line 1599. comm (efault), pick next is null, throttled.
[  155.543133] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  155.543136] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  155.543137] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  155.543139] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  156.142976] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  156.143977] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  156.143980] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  156.144977] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  156.543105] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  156.543110] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  156.543112] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  156.543115] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  157.142952] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  157.142956] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  157.142957] pick_next_task_rt line 1599. comm (efault), pick next is null, throttled.
[  157.142963] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  157.143961] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  157.146095] pick_next_task_rt line 1599. comm (efault), pick next is null, throttled.
[  157.543078] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  157.543082] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  157.543085] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  157.543087] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  158.142923] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000009dc5f730
[  158.143920] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 000000007cc53a4d
[  158.143923] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000b2e03ff9
[  158.143925] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  158.543050] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000d110e197
[  158.543054] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000009dc5f730
[  158.543057] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 000000007cc53a4d
[  158.543059] do_sched_rt_period_timer line 873, throttled is 1, set to zero, comm swapper/1.rq_rq = 00000000b2e03ff9
[  159.142897] sched_rt_runtime_exceeded line 947, throttled set to one, comm a.out.pree is 0.rq_rq = 00000000d110e197
[  159.142902] sched_rt_runtime_exceeded line 947, throttl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核实时线程throtted机制 的相关文章

  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际

随机推荐

  • Java中的File与字符流,字节流

    File File类概述和构造方法 File 他是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于FIle而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名而已 它可以是存在的 也可以是不存在的 将来是要通过
  • Java 统计连续签到天数

    说明 签到功能根据业务情况的不同大致分为两种 一种是只要进入系统就会默认签到 另外一种是进入系统之后需要用户手动点击签到按钮进行签到 两种情况最大的区别就是 自动签到连续签到天数肯定至少为1天 而手动签到的情况则需要考虑断签的情况 1 自动
  • 关于list容器(链表)

    list容器基本概念 list优点 list容器的迭代器 以下代码为验证list是否为循环链表 list构造函数 list数据元素插入和删除操作 list大小操作 list赋值操作 list数据的存取 list常用操作 list容器基本概念
  • QGLViewer+VS(MSVC2013)配置

    工具 libQGLViewer 2 7 2 Visual Studio 2013 Uitimate QT5 9 1 MSVC2013 另外在VS中使用QT显示界面需要下载qt vsaddin msvc2013 2 2 0 vsix官网下载
  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 GPIO中断 外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断 从而使得STM32微控制器能够及时响应外部设备的变化 STM32的GPIO中断 外部中断EXTI可以配置为上升沿中断 下降沿中断和
  • c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象

    目录 4 3 C 对象模型和this指针 4 3 1 成员变量和成员函数分开存储 4 3 2 this指针概念 非常重要 4 3 3 空指针访问成员函数 4 3 4 const修饰成员函数 相关教程 4 3 C 对象模型和this指针 4
  • C++基本数据类型

    一 数据类型 C 的数据类型有四类 基本类型 结构类型 指针类型 和空类型 void 二 部分基本数据类型说明 1 整型 1 int 整数就是没有小数点部分的数字 如2 98 100和0 在C 中提供多种整型 按示数范围分为短整数 shor
  • "Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)...

    不知什么时候开始 每次我在运行xcode在真机上 或者archive打包的时间 都会弹出输入用户名和密码的框 搞的烦死了 解决方法 打开钥匙串访问 双击那些密钥弹出框 改变到允许所有应用程序访问此项目 输入一次密码即可 解决 不用每次输入了
  • Qt Widgets 与 QML/Qt Quick

    Qt Widgets 更老 更成熟 可以做gui界面 适合传统的桌面程序 QML Qt Quick 开发更 现代 的 UI 与高级应用 渲染效果更佳 界面更炫酷 参考 https my oschina net u 4000302 blog
  • Ant Design 常见用法与坑点总结(一)

    前言 Ant Design 是蚂蚁出品的出色优秀的 React 组件库 相信使用 React 进行管理系统开发的小伙伴们或多或少都接触过 Ant Design 很多公司基于 React 开发的管理端系统也都是使用 Ant Design 的组
  • 运动估计与运动补偿

    运动估计与运动补 偿 改正 2010 11 17 10 29 29 运动补偿是通过先前的局部图像来预测 补偿当前的局部图像 它是减少帧序列冗余信息的有效方法 运动估计是从视频序列中抽取运动信息的一整套技术 运动估计与运动补偿技术 MPEG
  • 基于matlab的长短期神经网络LSTM的电力负荷预测

    目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的电力负荷预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 电力负荷预测的实质是从已知的电力系统 经济 社会 气象等情况出发 根据历史负荷变化
  • Vue入门基础(环境搭建+软件安装+问题解决)

    如何创建一个vue项目 打开cmd 输入如下指令 因人而异自己电脑上就进入想创建的目录 输入vue init webpack 项目名称 接下来打开vscode找到新建的文件夹 package json经过观察可以发现 现在没有配置Vuex
  • HTMLCanvasElement.toDataURL()

    HTMLCanvasElement toDataURL 方法返回一个包含图片展示的 data URI 可以使用 type 参数其类型 默认为 PNG 格式 图片的分辨率为96dpi 如果画布的高度或宽度是0 那么会返回字符串 data 如果
  • 基于FPGA的频率计

    好久没更了 百忙之中写一篇so easy的代码 基于FPGA的频率计设计 一 简介 废话不多说 下面是百度搜索关于频率计的简洁概念 数字频率计是一种基本的测量仪器 被广泛应用于航天 电子 测控等领域 基于传统测频原理的频率计的测量精度将随被
  • 2020最新Ubutu18.04安装NVIDIA出现如下报错解决方法[亲测可用]

    我使用的NVIDIA版本为 NVIDIA Linux x86 64 455 28 run 以下只是报错过程中尝试解决的方法 前提条件是你自身的机器具有nvidia显卡 如需正确安装nvidia 请参考这篇文章https blog csdn
  • MYSQL基础管理-auto_increment测试应用

    mysql gt create table tid id int not null auto increment name varchar 100 prima ry key id Query OK 0 rows affected 0 11
  • Flask 和 Bootstrap 应用控制 WiFi 模块温度控制

    根据室温 控制风扇 或者程序会为您完成 并在温度过高时发送短信 所需材料 简述 该项目具有三个主要功能 打开风扇 关闭风扇 自动模式 这些功能由 3 个按钮控制 这些按钮是使用 Flask 和 Html 以及 Bootstrap 设计的 分
  • 6 * 4 = 24从上面的乘法算式可以看出,我们可以把24只羊分的不同的组合方式,而且这些组合方式是通过乘法来计算出来的。因此,我们可以把乘法组合用于羊群分组的问题中。通过本文,可以看出,乘法组合是...

    有一个叫做安妮的小女孩 她有一群24只羊 安妮经常做这样的家务 把这些羊分成不同的组合 以便它们更好地享受活动 但是 安妮发现 把羊分成组合以后 有时会出现混乱的情况 她不知道如何把它们分成不同的组合 这时 安妮的爸爸想起了乘法组合 他给安
  • Linux内核实时线程throtted机制

    Linux内核支持实时线程和非实时线程同时工作 并且可以给实时线程分配适当的执行比例 当超过设置的比例的时候 调度器将不再调度实时线程工作 这样做保证了即便在实时线程不主动放弃CPU的情况下 CPU的占用率也不会到 100 保证了其它线程总