LWN:新增misc cgroup!

cgroup之内存子系统的使用 memory cgroup Cgroup的memory子系统,即memory cgroup(memcg),提供了对系统中一组进程的内存行为的管理,从而对整个系统中对内存有不用需求的进程或应用程序区分管理,实现更有效的资源利用和隔离。 在实际业务场景中,为了防止一些应用程序对资源的滥用(可能因为应用本身的bug,如内存泄露),导致对同一主机上其他应用造成影响,我们往往希望可以控制应用程序的内存使用量,这是memcg提供的主要功能之一,当然它还可以做的更多。 Memcg的应用场景,往往来自一些虚拟化的业务需求, 阅读详情

关注了就能看到更多这么棒的文章哦~

The misc control group

By Jake Edge
May 18, 2021
DeepL assisted translation
https://lwn.net/Articles/856438/

控制组(cgroups, control groups)是用来限制系统中的进程对共享资源的访问的。哪些资源呢?比如说用于指定虚拟机(VM)中的加密过的内存区域要使用的一个 ID 信息,例如 AMD 安全加密虚拟化(SEV,Secure Encrypted Virtualization)功能所使用的地址空间标识符(ASIDs,address-space identifiers)。Vipin Sharma 早在 9 月份的时候就着手为这些 ASIDs 增加一个 cgroup。不过后来收到反馈之后,他将这个想法扩展为一个可以跟踪和限制任何可以计数(count)的资源的 controller 了。这个 patch set 最终形成了 misc cgroup 的控制器,并且已经合入,会被包含在 Linux 5.13。

其基本思想是允许管理员(或云端管理系统)对 cgroup 中的进程所能使用的这些 ID 的数量实施限制。在云环境中,这些进程一般就是对应那些正在 KVM 下运行的虚拟机。在最初发布 ASIDs 的时候,Sean Christopherson 建议增大 controller 的管理范围来包含更多种类的加密 ID,而不仅仅局限于 AMD SEV 使用的 ID。英特尔也有一个类似的信任域扩展(TDX,Trust Domain Extension)功能,同样使用了 key ID,因此同样也是一个可能需要管理起来的有限资源。s390 架构也有类似的安全执行 ID(SEID,secure execution ID)。这些 ID 可能不如其他类似的 ID 那么稀缺,但是如果有一个 controller 来控制分配的话也是有好处的。

这些信息促使 Sharma 将原本计划实现的 controller 进行了扩展,变得更加通用以便让 TDX ID 和 SEID 也能用起来。到 1 月份的时候,"encryption ID controller" 这个 patch set 已经发出了第 4 个版本,但维护者 Tejun Heo 有点担心在 cgroup 子系统中增加这些特定硬件相关的控制开关:

我很不愿意接受跟特定厂商有关的接口,原因有几个,但其中最重要的是这些接口通常意味着之前没有充分做好抽象化,或者真实的需求没有充分分析和开发,而且这些接口在一段时间后往往会成为包袱。

他和 Sharma 在讨论中进行了不少交流,但最终 Heo 说,由于 encryption ID 的前景还不明确,他还是希望能换一个不同的方法来实现。与其让这个 controller 专门用于管理 encryption ID,不如把它变成一个用来管理某个 cgroup(或整个系统)中有数量限制的资源的通用 controller:"所以,最终结果上来说,与之前提出的代码并没有什么不同,只是让他变成了一个通用的 misc controller。"

Sharma 同意了这个计划,并在 2 月中旬发布了一个 misc controller 的 RFC 补丁。之后又发布了三个版本,不过 controller 的形式基本上再没有变过了。这些 patch 还增加了 SEV ASIDs 和相关的(但不是相同的概念)SEV Encrypted State(SEV-ES)IDs 的改动,把它们两个作为采用这种方式控制数量的资源。在具有相关功能的 AMD CPU 上,如果用 CONFIG_CGROUP_MISC 构建内核,那么 root control group 就会有一个 misc.capacity 文件,显示每个类别中的可用 ID 的数量:

$ cat misc.capacity
sev 50
sev_es 10

假如有个系统中有两个被此 controller 管理的资源,名称分别为 "res_a "和 "res_b",那么在 cgroup 目录结构中将会展示这两个值。其中 misc.capacity 这个 root file 是只读的,其中记录了整个系统中有多少数量的相关资源,另外有两个文件会出现在 non-root 的 cgroup 中,可以用来限制资源以及监控使用了多少:

$ cat misc.current
res_a 3
res_b 0

$ cat misc.max
res_a 10
res_b 4

从名字也可以看出,misc.current 指出了这个 group 当前的使用情况,而 misc.max 则指出了这个 group 中所允许的最大使用量被设置为多少。misc.max 与其他两个文件不同,它是一个可读可写的文件,所以如果要设置最大值的话可以这样写:

# echo res_a 1 > misc.max
# echo res_b max > misc.max

第一个命令会将 res_a 的最大值设置为 1,而第二个将 res_b 设置为这个 group 中所允许的最大值(由其父控制组进行限制的话就可能小于系统最大值)。

添加两种类型的 SEV ASID 的 patch 展示了如何向 controller 添加其他要管理的资源(比如 TDX ID 或 SEID)。先在 misc_res_types 这个 enum 中增加一项,并把相应的名字添加到 misc_res_names 数组中。在资源可被分配使用之前,必须先初始化一下来设置全系统有多少资源可用:

int misc_cg_set_capacity(enum misc_res_type type, unsigned long capacity);

当需要使用或者释放其中某个资源时,可以使用 charge(意指收费)以及 uncharge(意指不再收费) API:

int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg,
     unsigned long amount);
void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg,
    unsigned long amount);

有一点需要注意的是,按照 cgroup v2 的设计,在将一个进程迁移(migrate)到另一个不同的 cgroup 时并不改变统计信息。此进程之前分配获取到资源时候所在的 cgroup 会一直保持对这个进程的数据统计以及 charge 状态,直到资源被释放为止。调用者函数(caller)需要跟踪记录被 charge 的 cgroup,这样才能在后面对正确的 cgroup 进行 uncharge。在代码 review 过程中有讨论过要不要让 charge 关系跟随进程一起迁移。Jacob Pan 提出也把 charge 关系一起迁移,因为他正在考虑使用 misc controller 来限制通过 DMA 用于 I/O 的 ASIDs(IOASIDs)。Heo 明确指出不对 misc controller 进行 charge 关系的迁移:

请注意,cgroup2 总体上并不喜欢、支持 charge 关系的迁移,甚至连普通迁移也不赞同。我们在 cgroup1 上尝试了 memcg,结果很糟糕。文档中描述的预期使用场景是使用迁移来孵化一个 cgroup(或者甚至更理想的情况是使用新的 clone 系统调用来在指定的 cgroup 中启动进程),直到退出为止。所有现存的 controller 都假定是按这种使用模式来工作的,所以除非有一些非常有说服力的理由否则我应该不会赞同偏离这个方向的做法。

在进程获得 IOASIDs 之后,很可能没有什么真正使用场景需要迁移进程,所以 Pan 还是打算使用 misc contoller,至少目前是这样决定的。

事实上,正如 Heo 所说,misc 控制器有一点 "让步方案(cop-out)"的意思。他不相信这些硬件功能今后会 "永远" 存在,所以他不愿意将 cgroup 子系统跟它们永远关联起来:

我判断,这些底层的硬件特性还没有成熟到可以在它们上面建立合理的抽象。随着时间的推移,也许未来的发展会让硬件达到这样的程度,当然也许这些功能很快也就会消失于是人们都不会记得有这么个功能。

但是,不管是不是个让步方案,Misc controller 现在已经开始用起来了。看起来还会有其他几个地方可能打算使用这个 misc controller。在未来几个月里,很可能会出现更多的使用场景。对于简单的资源,也就是只需要对其数量进行跟踪和限制的话,那么 misc controller 可以很好地完成这项工作。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

Intel Trust Domain Extensions(TDX)介绍 通过Intel TDX提供的功能,可以构造出区别于传统VM的TD(Trusted Domain)TD运行在SEAM的non-root模式下,TDX module运行在SEAM的root模式下,通过调用SEAM call可以让CPU进入SEAM root模式,并且加载TDX module。 阅读详情

相关推荐

【CGroup原理篇】14. MISC子系统

Misc子系统,Miscellaneous CGroup,杂项控制器,提供了一种机制来对不能像其他CGroup一样进行抽象的资源进行限制的一种机制。

从0到1,突破自己 939

docker容器技术基础入门

1、LXC常用操作 2、容器的工作方式 为了使容器的使用更加易于管理,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。 LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进

qq_59324730的博客 3820

毕设分享|基于16单片机的指纹识别电子密码锁设计

我们今天的工作生活中,很多的场合都需要身份的认证,而传统的基于标志的身份认证技术由于受到证件伪造以及密码破解等手段的威胁,逐渐表现得有些力不从心。怎样保护自己的重要文件资料,如何保证自己的隐私不被泄露?在传统的身份认证中,我们往往使用密码加密法,但是这种方法只是"防君子不防小人"。在高明的黑客眼里,由几个字符组成的密码脆弱得不堪一击。现在,科技的发展让我们有了新的选择——生物识别技术。将生物识别技术应用于笔记本、门锁等方面,可以对文件、财产起保护作用,并且可以进行身份识别。

Sen_091的博客 1020

K8S & 微服务 —— misc

融数数据基于Kubernetes的微服务治理和构建平台 DNS: A——IP地址 CName ——主机名 PTR——与A相反 SRV——DNS SRV是DNS记录中一种,用来指定服务地址。与常见的A记录、cname不同的是,SRV中除了记录服务器的地址,还记录了服务的端口,并且可以设置每个服务地址的优先级和权重...

chenxuanhanhao的专栏 971

矩阵LED和矩阵按键

先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环

qq_46615634的博客 5789

基础的pdf病毒木马

基础的pdf病毒木马 环境: 攻击机:Kali 目标操作系统:Windows 10或Windows 7 (关闭防火墙和安全软件) 目标软件:Adobe Reader 8.1.2 msf框架搜索:adobe-pdf 1.打开msfconsole 2.搜索 adobe_pdf模块 3.加载攻击模块并设置payload 4.运行生成pdf 5.将pdf拖入到win10 6.打开msf,加...

小小猪的博客 4623

keil option中Misc Control实用功能

option中Misc Control中几个比较实用的功能 中文错误(又一次写工程不管我使用任何中文都报错,只能用本文本的文字,通过这个可以避免编码错误导致的报错) --locale=english 避免警告:很多时候未定义 未使用 不代表以后不使用,但是老是报告警告很烦,所以就使用该警告 例如下边,将警告类型的数字填上就可以了 --diag_suppress=177,167 ......

IT嵌入式小生 7395

在AVP28335(兼容德州仪器TMS320-28335) 上实现ModbusSlaveRTU-485源码及注释。

今天先把题目先给出来, 在近两天会把源码 (含详细注释 )及部署、测试结果给出来, 希望能给大家帮助。(全免费 我有点缺德,断了别人的一个财路)。

FOOLCODE的专栏 641

Misc controls 项设置,汇编文件执行位置调整

有没有哪位大侠知道Keil4中Options for Target 中的配置问题? 这些参数是什么含义? User页中 Run User Programs After Build/Rebuild 项里 Run #1: fromelf --bin ".\obj\@L.axf" --output ".\obj\@L.bin" Run #2: fromelf --text -c ".\ob

sun_z_x的专栏 9673

Carsim与AVL CRUISE联合仿真:从零搭建整车模型的实战指南

本文详细介绍了如何从零开始搭建Carsim与AVL CRUISE联合仿真整车模型,涵盖软件环境配置、接口设置、模型连接及调试技巧。通过联合仿真,可充分发挥Carsim在车辆动力学和AVL CRUISE在动力系统仿真方面的优势,为电动车和混合动力汽车的研发提供精准的整车模型分析。

weixin_29067143的博客 938

高电压技术的面试内容整理(详细版本:57题)

涵盖了高电压技术的关键领域,包括气体放电的物理过程、液体和固体介质的绝缘特性、高压外绝缘的分类与特性、电气设备绝缘试验的方法与原理、电力系统的防雷保护措施,以及内部过电压的产生、影响与限制方法,为理解和应对高电压环境下的电气问题提供了系统的知识框架。通过深入探讨气体放电理论、介质极化与损耗、绝缘子的电气特性、绝缘试验技术、防雷策略以及内部过电压的管理。

weixin_44808274的博客 775

MDK建立工程以及工程设置相关介绍

uvproj 和 uvprojx: 前者keil4的工程 后者keil5的工程 勾选Core Startup GD32E10x_libopt 和标准外设, 如果有缺的颜色是黄色的, 否则就是绿色的,根据实际需要的组件进行添加,比如文件系统啊等等 RTE就是选组件生成的文件 编译器这里选择的是V5的, V6的语法检查更严格,警告更多 使用MicroLIB,至于什么是和为什么用这个,省略 地址一般默认,除非加了bootloader或者其他情况需要调整 上面就是一些编译过程的一些文件,可以勾..

weixin_39608480的博客 1658

智能车图像处理5-入门级分析4 ---环岛的状态机与补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 8228

宋宝华:为了不忘却的纪念,评Linux 5.13内核

Linux 5.14于14小时之前发布了,而我5.13的总结还没有写出,我早觉得有写一点东西的必要了,这虽然于搬砖的码农毫不相干,但在追求进步的工程师那里,却大抵只能如此而已。为了不忘却的...

宋宝华 1万+

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 290

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

6 10 新建工程

版本说明:MDK5.24。

qq_45578181的博客 1028

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

关于Linux中控制群组cgroup(资源管理)的一些笔记

不加思考地滥读或无休止地读书,所读过的东西无法刻骨铭心,其大部分终将消失殆尽。——叔本华

山河已无恙 3126

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

linux快速用户空间互斥锁:futex浅析

Futex,Fast Userspace muTEXes,作为linux下的一种快速同步(互斥)机制,已经存在了很长一段时间了(since linux 2.5.7)。它有什么优势?又提供了怎样一些功能,本文就简单探讨一下。

flynetcn的专栏 840

keil如何支持C99

很简单,在PROJECT 选项中将C/C++的MISC CONTROL加上--c99选项,网上的连说的人都没有。 转载于:https://www.cnblogs.com/zhuzheic/p/3316929.html

weixin_30367945的博客 1292

MDK开发的一些问题和技巧

在main函数里面创建大的数组会失败,即使使用malloc, new也如此。需要将其创建为全局数组 C++开发设置:去掉C++--C99选项,在misc control 输入--cpp 使用printf需要Target 勾选use micrlib 下载设置Utility设置 reset and run ...

LuchangLi 的专栏 564

KEIL工程目标选项配置

KEIL工程目标选项配置

Justice Gao 2万+

[Keil]消除有未调用的函数而出现的警告办法 消除警告UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS

这样的一堆警告,函数写了没有调用不知道大家可能都遇见过,我们把没有用到的函数编译进去会占我们程序的空间,所以我们需要设置让他不被编译方法如下 首先点击我们的魔法棒 勾选这个 在LX51 Misc 页中的Misc Control中填入“REMOVEUNUSED” 这样就ok了! 但是我总是没有那么一帆风顺 我的报错了如下 其实这个的意思就是我们的keil没有注册。 我满脸问号,我不是注册了的嘛 问题所在 打开我的license 这个的注册是错误的,在注册机里面我们应该选这个选项 完成之后显示的注.

小灰的博客 8356

KEIL C51屏蔽警告方式

说明一下,这里是屏蔽警告,不是消除警告。目前我所知道的屏蔽警告的方式有四种。

m0_54346266的博客 4039

RK3566的dtsi文件解释

/dts-v1/; #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/pinctrl/rockchip.h> #include "tab07-rk66-qls-cnt-core.dtsi" #include "tab07-rk66-qls-cnt.dtsi" #include "tab07-rk66-qls-cnt-android.dtsi" #include "dt-bindings/display/media-bu

weixin_44597658的博客 935

keil 下支持C99扩展格式和GNU扩展格式

实现方法: 编译配置管理的c/c++选项卡中Misc control中填写 --c99(或者 --gnu ) 注意:“--c99”或“--gnu”实际上是在ARMCC中加入支持GNU或C99标准的扩展格式

pingxiaozhao的博客 3099

Windows Server 2012 如何部署trust domain?

想必大家都知道信任域分为单项信任域和双向信任域,那么什么是单项信任域呢?如何来部署呢?这里给大家做一个简单的介绍。   单项信任域是指Domain A如果配置trust,信任Domain B,那么DomainB里的AD User就可以有能力查看DomainA里的文件,比如两个Company是Partner的关系,Company B的部分员工需要有能力访问Company A公司的一些文件

为自己喝彩的博客 2791
上一篇: LWN: BPF可以调用内核函数了!
下一篇: LWN: Pyodide - 浏览器中的Python!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值