Android Framework 常见解决方案(25-2)定制CPUSET解决方案-system修改及编译部分调整
1 原理说明
这个方案有如下基本需求:
- 构建自定义CPUSET,/dev/cpuset中包含一个全新的cpuset分组。且可以通过set_cpuset_policy和set_sched_policy接口可以设置自定义CPUSET。
- 开机启动后可以通过zygote判定来对特定的应用进程设置CPUSET,并一直保持,且保证自定义CPUSET不受其他CPUSET影响,持续独立。
原理上因为修改代码涉及部分较多,因此共分3个部分:
- framework修改:添加SCHED GROUP和THREAD GROUP(THREAD_GROUP_对应SP_)的支持,且支持开机启动后直接设置。applyOomAdjLSP的判定保持不变。
- system修改:添加SP_CUSTOM的支持及set_cpuset_policy和set_sched_policy接口等支持,同时修改task_profiles.json,添加SP_CUSTOM CPUSET的支持。
- init.rc修改及编译部分调整:对自定义cpuset节点进行操作,vndk部分编译需要重新调整方案以及不修改VNDK如何保证编译通过。
由于修改中涉及代码量过大,这里拆分成两节进行展示。本章节主要针对第2部分和第3部分修改进行说明。上一篇文章👇
Android Framework 常见解决方案(25-1)定制CPUSET解决方案-framework部分修改
主要对第1部分修改进行说明。
2 修改方案(Android S)
2.1 system部分修改
针对system分区修改。具体修改方案如下(这里以S版本修改为主,Q和R有一些差异但原理不变):
在$AOSP/system/core/libprocessgroup/include/processgroup/sched_policy.h文件中修改:
/* Keep in sync with THREAD_GROUP_* in frameworks/base/core/java/android/os/Process.java */
typedef enum {SP_DEFAULT = -1,SP_BACKGROUND = 0,SP_FOREGROUND = 1,SP_SYSTEM = 2,SP_AUDIO_APP = 3,SP_AUDIO_SYS = 4,SP_TOP_APP = 5,SP_RT_APP = 6,SP_RESTRICTED = 7,
+ SP_CUSTOM = 8,SP_CNT,SP_MAX = SP_CNT - 1,SP_SYSTEM_DEFAULT = SP_FOREGROUND,
} SchedPolicy;
这里注意,按照顺序填写修改相对简单,因为后续会用到SP_CNT和SP_MAX这两个变量,代码中还会有许多的遍历操作,因此最好采用累加方案,不要设置其他值。
本方案的修改比较全面,即支持set_cpuset_policy,也兼容到set_sched_policy,在实际操作中,可根据需要只修改其中一个即可。
在$AOSP/system/core/libprocessgroup/sched_policy.cpp文件中修改:
//修改set_cpuset_policy,添加SP_CUSTOM的处理
int set_cpuset_policy(int tid, SchedPolicy policy) {if (tid == 0) {tid = GetThreadId();}policy = _policy(policy);switch (policy) {case SP_BACKGROUND:return SetTaskProfiles(tid, {"CPUSET_SP_BACKGROUND", "BlkIOBackground"}, true) ? 0 : -1;case SP_FOREGROUND:return SetTaskProfiles(tid, {"CPUSET_SP_FOREGROUND", "BlkIOForeground"}, true) ? 0 : -1;case SP_AUDIO_APP:case SP_AUDIO_SYS:return SetTaskProfiles(tid, {"CPUSET_SP_FOREGROUND", "AudioAppCapacity", "BlkIOForeground"}, true) ? 0 : -1;case SP_TOP_APP:return SetTaskProfiles(tid, {"CPUSET_SP_TOP_APP", "BlkIOBackground"}, true) ? 0 : -1;case SP_SYSTEM:return SetTaskProfiles(tid, {"CPUSET_SP_SYSTEM", "BlkIOForeground"}, true) ? 0 : -1;case SP_RESTRICTED:return SetTaskProfiles(tid, {"CPUSET_SP_RESTRICTED"}, true) ? 0 : -1;
+ case SP_CUSTOM:
+ return SetTaskProfiles(tid, {"CPUSET_SP_CUSTOM"}, true) ? 0 : -1;default:break;}return 0;
}//修改set_sched_policy,添加SP_CUSTOM的处理
int set_sched_policy(int tid, SchedPolicy policy) {
//...
#if POLICY_DEBUG //注意:这一段的修改主要是调试使用,功能实现上可以不添加该部分
//...switch (policy) {case SP_BACKGROUND:SLOGD("vvv tid %d (%s)", tid, thread_name);break;case SP_FOREGROUND:case SP_AUDIO_APP:case SP_AUDIO_SYS:case SP_TOP_APP:SLOGD("^^^ tid %d policy %d (%s)", tid, policy, thread_name);break;case SP_SYSTEM:SLOGD("/// tid %d (%s)", tid, thread_name);break;case SP_RT_APP:SLOGD("RT tid %d (%s)", tid, thread_name);break;
+ case SP_CUSTOM:
+ SLOGD("CUSTOM|xxx tid %d (%s)", tid, thread_name);
+ break;default:SLOGD("??? tid %d (%s)", tid, thread_name);break;}
#endif
//...switch (policy) {case SP_BACKGROUND:return SetTaskProfiles(tid, {"SCHED_SP_BACKGROUND", "BlkIOBackground"}, true) ? 0 : -1;case SP_FOREGROUND:case SP_AUDIO_APP:case SP_AUDIO_SYS:return SetTaskProfiles(tid, {"SCHED_SP_FOREGROUND", "BlkIOForeground"}, true) ? 0 : -1;case SP_TOP_APP:return SetTaskProfiles(tid, {"SCHED_SP_TOP_APP", "BlkIOForeground"}, true) ? 0 : -1;case SP_SYSTEM:return SetTaskProfiles(tid, {"SCHED_SP_SYSTEM"}, true) ? 0 : -1;case SP_RT_APP:return SetTaskProfiles(tid, {"SCHED_SP_RT_APP", "BlkIOForeground"}, true) ? 0 : -1;
+ case SP_CUSTOM:
+ return SetTaskProfiles(tid, {"SCHED_SP_CUSTOM"}, true) ? 0 : -1;default:return SetTaskProfiles(tid, {"SCHED_SP_DEFAULT"}, true) ? 0 : -1;}return 0;}
//修改get_sched_policy_from_group,添加SP_CUSTOM的处理
static int get_sched_policy_from_group(const std::string& group, SchedPolicy* policy) {if (group.empty()) {*policy = SP_FOREGROUND;} else if (group == "foreground") {*policy = SP_FOREGROUND;} else if (group == "system-background") {*policy = SP_SYSTEM;} else if (group == "background") {*policy = SP_BACKGROUND;} else if (group == "top-app") {*policy = SP_TOP_APP;} else if (group == "restricted") {*policy = SP_RESTRICTED;} else if (group == "audio-app") {*policy = SP_AUDIO_APP;
+ } else if (group == "custom") {
+ *policy = SP_CUSTOM;} else {errno = ERANGE;return -1;}return 0;
}//修改get_sched_policy_name,添加SP_CUSTOM的处理
const char* get_sched_policy_name(SchedPolicy policy) {policy = _policy(policy);static const char* const kSchedPolicyNames[] = {[SP_BACKGROUND] = "bg", [SP_FOREGROUND] = "fg", [SP_SYSTEM] = " ",[SP_AUDIO_APP] = "aa", [SP_AUDIO_SYS] = "as", [SP_TOP_APP] = "ta",
- [SP_RT_APP] = "rt", [SP_RESTRICTED] = "rs",
+ [SP_RT_APP] = "rt", [SP_RESTRICTED] = "rs",[SP_CUSTOM] = "ct",};static_assert(arraysize(kSchedPolicyNames) == SP_CNT, "missing name");if (policy < SP_BACKGROUND || policy >= SP_CNT) {return nullptr;}return kSchedPolicyNames[policy];
}//修改get_cpuset_policy_profile_name,添加SP_CUSTOM的处理
const char* get_cpuset_policy_profile_name(SchedPolicy policy) {/** cpuset profile array for:* SP_DEFAULT(-1), SP_BACKGROUND(0), SP_FOREGROUND(1),* SP_SYSTEM(2), SP_AUDIO_APP(3), SP_AUDIO_SYS(4),
- * SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),
+ * SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7), SP_CUSTOM(8)* index is policy + 1* this need keep in sync with SchedPolicy enum*/static constexpr const char* kCpusetProfiles[SP_CNT + 1] = {"CPUSET_SP_DEFAULT", "CPUSET_SP_BACKGROUND", "CPUSET_SP_FOREGROUND","CPUSET_SP_SYSTEM", "CPUSET_SP_FOREGROUND", "CPUSET_SP_FOREGROUND",
- "CPUSET_SP_TOP_APP", "CPUSET_SP_DEFAULT", "CPUSET_SP_RESTRICTED"
+ "CPUSET_SP_TOP_APP", "CPUSET_SP_DEFAULT", "CPUSET_SP_RESTRICTED","CPUSET_SP_CUSTOM"};if (policy < SP_DEFAULT || policy >= SP_CNT) {return nullptr;}return kCpusetProfiles[policy + 1];
}//修改get_sched_policy_profile_name,添加SP_CUSTOM的处理
const char* get_sched_policy_profile_name(SchedPolicy policy) {/** sched profile array for:* SP_DEFAULT(-1), SP_BACKGROUND(0), SP_FOREGROUND(1),* SP_SYSTEM(2), SP_AUDIO_APP(3), SP_AUDIO_SYS(4),
- * SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),
+ * SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),SP_CUSTOM(8)* index is policy + 1* this need keep in sync with SchedPolicy enum*/static constexpr const char* kSchedProfiles[SP_CNT + 1] = {"SCHED_SP_DEFAULT", "SCHED_SP_BACKGROUND", "SCHED_SP_FOREGROUND","SCHED_SP_SYSTEM", "SCHED_SP_FOREGROUND", "SCHED_SP_FOREGROUND",
- "SCHED_SP_TOP_APP", "SCHED_SP_RT_APP", "SCHED_SP_DEFAULT"
+ "SCHED_SP_TOP_APP", "SCHED_SP_RT_APP", "SCHED_SP_DEFAULT","SCHED_SP_CUSTOM"};if (policy < SP_DEFAULT || policy >= SP_CNT) {return nullptr;}return kSchedProfiles[policy + 1];
}
以上2部分主要是逻辑的修改,接下来是配置文件的修改,在$AOSP/system/core/libprocessgroup/profiles/task_profiles.json文件中修改:
{"Attributes": [{"Name": "LowCapacityCPUs","Controller": "cpuset","File": "background/cpus"},...
+ {
+ "Name": "CustomCPUs",
+ "Controller": "cpuset",
+ "File": "custom/cpus"
+ },...{"Name": "FreezerState","Controller": "freezer","File": "cgroup.freeze"}],"Profiles": [{"Name": "HighEnergySaving","Actions": [{"Name": "JoinCgroup","Params":{"Controller": "cpu","Path": "background"}}]},...
+ {
+ "Name": "CustomPerformance",
+ "Actions" : [
+ {
+ "Name" : "JoinCgroup",
+ "Params" :
+ {
+ "Controller": "cpuset",
+ "Path": "custom"
+ }
+ }
+ ]
+ },...{"Name": "SystemMemoryProcess","Actions": [{"Name": "JoinCgroup","Params":{"Controller": "memory","Path": "system"}}]}],"AggregateProfiles": [{"Name": "SCHED_SP_DEFAULT","Profiles": [ "TimerSlackNormal" ]},...{"Name": "SCHED_SP_RT_APP","Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]},
+ {
+ "Name": "SCHED_SP_CUSTOM",
+ "Profiles": [ "CUSTOMPerformance" ]
+ },...
+ {
+ "Name": "CPUSET_SP_CUSTOM",
+ "Profiles": [ "CUSTOMPerformance" ]
+ },...{"Name": "Dex2OatBootComplete","Profiles": [ "Dex2oatPerformance", "LowIoPriority", "TimerSlackHigh" ]}]
}
至此,system相关修改就结束了。主要是SP_CUSTOM相关逻辑的添加,配置文件task_profiles.json的修改,接口set_cpuset_policy和set_sched_policy的支持等。
2.2 init.rc及编译部分调整
为添加cpuset相关节点,需要修改init.rc文件,这里根据android源码的需要调整到对应的rc中添加即可。具体init.rc修改内容如下:
#第一部分:on init中添加:
...
+#custom add start
+ mkdir /dev/stune/custom
+ chown system system /dev/stune/custom
+ chown system system /dev/stune/custom/tasks
+ chmod 0664 /dev/stune/custom/tasks
+ mkdir /dev/cpuset/custom
+ copy /dev/cpuset/cpus /dev/cpuset/custom/cpus
+ copy /dev/cpuset/mems /dev/cpuset/custom/mems
+ chown system system /dev/cpuset/custom
+ chown system system /dev/cpuset/custom/tasks
+ chown system system /dev/cpuset/custom/cgroup.procs
+ chmod 0664 /dev/cpuset/custom/tasks
+ chmod 0664 /dev/cpuset/custom/cgroup.procs
+#custom add end
...
#第二部分:系统启动完成后添加, 这里绑定的是456,可根据需要调整:
+#custom add start
+on property:sys.boot_completed=1
+ write /dev/cpuset/custom/cpus 4-6
+ write /dev/cpuset/custom/mems 0
+#custom add end
这里主要是通过init.rc文件添加cpuset相关节点,以及修改cpuset相关节点的权限和owner,以及写入值操作。这样,在开机启动后就可以在/dev/cpuset/目录下看到自定义cpuset对应的custom节点。
至此代码和配置文件都已经修改完了。
接下来就需要编译了,但是编译这里要避免vndk报错的问题,需要有先执行如下脚本内容:
source build/envsetup.sh && lunch xxx
cd ./development/vndk/tools/header-checker/utils/
#这里的xxx一般是指out/target/product之后的路径
./create_reference_dumps.py -l libprocessgroup -product xxx
重新编译vndk,否则会出现如下类似的编译错误,如下所示:
error: VNDK library: XXX
******************************************************
error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libprocessgroup
ninja failed with: exit status 1
#### failed to build some targets ####
相关文章:
Android Framework 常见解决方案(25-2)定制CPUSET解决方案-system修改及编译部分调整
1 原理说明 这个方案有如下基本需求: 构建自定义CPUSET,/dev/cpuset中包含一个全新的cpuset分组。且可以通过set_cpuset_policy和set_sched_policy接口可以设置自定义CPUSET。开机启动后可以通过zygote判定来对特定的应用进程设置CPUSET,并…...
OpenAI推出GPT商店和ChatGPT Team服务
🦉 AI新闻 🚀 OpenAI推出GPT商店和ChatGPT Team服务 摘要:OpenAI正式推出了其GPT商店和ChatGPT Team服务。用户已经创建了超过300万个ChatGPT自定义版本,并分享给其他人使用。GPT商店集结了用户为各种任务创建的定制化ChatGPT&a…...
3D建模素材分层渲染怎么操作?
在3D建模素材分层渲染过程中,需要将场景中的元素分到不同的层里,然后分别进行渲染。以下是一个简单的方法: 1、打开要渲染的3D建模素材。 2、在场景中选择要分层的元素,然后在软件的图层面板中新建图层,将元素拖拽到新…...
SAICP(模拟退火迭代最近点)的实现
SAICP(模拟退火迭代最近点)的实现 注: 本系列所有文章在github开源, 也是我个人的学习笔记, 欢迎大家去star以及fork, 感谢! 仓库地址: pointcloud-processing-visualization 总结一下上周的学习情况 ICP会存在局部最小值的问题, 这个问题可能即使是没有实际遇到过, 也或多…...
FineBI实战项目一(23):订单商品分类词云图分析开发
点击新建组件,创建订单商品分类词云图组件。 选择词云,拖拽catName到颜色和文本,拖拽cat到大小。 将组件拖拽到仪表板。 结果如下:...
DOS命令
当使用DOS命令时,可以在命令提示符下输入各种命令以执行不同的任务。以下是一些常见DOS命令的详细说明: dir (Directory): 列出当前目录中的文件和子目录。 用法: dir [drive:][path][filename] [/p] [/w] cd (Change Directory): 更改当前目录。 用法: …...
【Python】torch中的.detach()函数详解和示例
在PyTorch中,.detach()是一个用于张量的方法,主要用于创建该张量的一个“离断”版本。这个方法在很多情况下都非常有用,例如在缓存释放、模型评估和简化计算图等场景中。 .detach()方法用于从计算图中分离一个张量,这意味着它创建…...
二级域名分发系统源码 对接易支付php源码 全开源
全面开源的易支付PHP源码分享:实现二级域名分发对接 首先,在epay的config.php文件中修改您的支付域名。 随后,在二级域名分发网站上做相应修改。 伪静态 location / { try_files $uri $uri/ /index.php?$query_string; } 源码下载&#…...
二分查找与搜索树的高频问题(算法村第九关白银挑战)
基于二分查找的拓展问题 山峰数组的封顶索引 852. 山脉数组的峰顶索引 - 力扣(LeetCode) 给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i 1] > ... > arr[arr.length - 1…...
Python爬虫快速入门
Python 爬虫Sutdy 1.基本类库 request(请求) 引入 from urllib import request定义url路径 url"http://www.baidu.com"进行请求,返回一个响应对象response responserequest.urlopen(url)读取响应体read()以字节形式打印网页源码 response.read()转码 编码 文本–by…...
部署MinIO
一、安装部署MINIO 1.1 下载 wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio mv minio /usr/local/bin/ # 控制台启动可参考如下命令, 守护进程启动请看下一个代码块 # ./minio server /data /data --console-address ":9001"1.2 配…...
RK3566环境搭建
环境:vmware16,ubuntu 18.04 安装依赖库: sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool expect g patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakero…...
精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现
这是《百图解码支付系统设计与实现》专栏系列文章中的第(15)篇,也是流量控制系列的第(2)篇。点击上方关注,深入了解支付系统的方方面面。 上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis…...
Python展示 RGB立方体的二维切面视图
代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…...
03 顺序表
目录 线性表顺序表练习 线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。 线性表在逻辑上时线性结构,是连续的一条直线。但在物理结…...
2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)
随着科技的飞速发展,全球软件开发大会(QCon)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…...
ChatGPT 和 文心一言 的优缺点及需求和使用场景
ChatGPT和文心一言是两种不同的自然语言生成模型,它们有各自的优点和缺点。 ChatGPT(Generative Pre-trained Transformer)是由OpenAI开发的生成式AI模型,它在庞大的文本数据集上进行了预训练,并可以根据输入生成具有上…...
架构师之超时未支付的订单进行取消操作的几种解决方案
今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己尝试一把哈! 一、需求如下: 生成订单30分钟未支付,自动取消 生成订单60秒后,给用户发短信 对上述的需求,我们给…...
【容器固化】 OS技术之OpenStack容器固化的实现原理及操作
1. Docker简介 要学习容器固化,那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目,通过对应用软件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用软件&am…...
设置 SSH 通过密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更…...
1.6 面试经典150题 - 买卖股票的最佳时机
买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...
locust快速入门--使用分布式提高测试压力
背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…...
K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略
目录 pod亲和性与反亲和性 pod亲和性 pod反亲和性 pod状态与重启策略 pod状态 pod重启策略 本文主要介绍了pod资源与pod相关的亲和性,以及pod的重启策略 pod亲和性与反亲和性 pod亲和性(podAffinity)有两种 1.podaffinity,…...
免费的域名要不要?
前言 eu.org的免费域名相比于其他免费域名注册服务,eu.org的域名后缀更加独特。同时,eu.org的域名注册也比较简单,只需要填写一些基本信息,就可以获得自己的免费域名。 博客地址 免费的域名要不要?-雪饼前言 eu.org…...
高通sm7250与765G芯片是什么关系?(一百八十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
[Python进阶] Python操作MySQL数据库:pymysql
7.7 操作MySQL数据库:pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍: phpstudy是一款非常有用的PHP开发工具,旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面,使得用户能够方便地进…...
Vue3实现带点击外部关闭对应弹出框(可共用一个变量)
首先,假设您在单文件组件(SFC)中使用了Vue3,并且有两个div元素分别通过v-if和v-else来切换显示一个带有.elpopver类的弹出组件。在这种情况下,每个弹出组件应当拥有独立的状态管理(例如:各自的isOpen变量)。…...
可视化试题(一)
1. 从可视化系统设计的角度出发,通常需要根据系统将要完成的任务的类型选择交互技术。按照任务类型分类可以将数据可视化中的交互技术分为选择、( 重新配置 )、重新编码、导航、关联、( 过滤 )、概览和细节等八…...
RHCE 【在openEuler系统中搭建基本论坛(网站)】
目录 网站需求: 准备工作: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 测试: 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openla…...
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…...
教育网站建设的策划方案/成都关键词优化报价
基督教 赞美诗歌 Hymns Lyrics MP3 中文版 英文版 中英对照 MP3音频提取(自动播放): http://filer.blogbus.com/5320797/resource_53207971262594667h.mp3 (右击迅雷或目标另存为) 词曲: 写作背景介绍&…...
免费做网站tk/百度指数批量获取
第三章 常用命令1、mkdir : 创建目录,make directorys,-p 递归创建目录mkdir-p /a/b/c2、ls : -l(long)d(directory)显示目录或文件,全称list-l#列出文件的详细信息,如创建者,创建时间,文件的读写权限列表…...
wordpress 付费阅读/搜索引擎国外
引言 使用机器学习 (Machine Learning) 技术和方法来解决实际问题,已经被成功应用到多个领域,我们经常能够看到的实例有个性推荐系统,金融反欺诈,自然语言处理和机器翻译,模式识别,智能控制等。一个典型的机…...
珠海移动网站建设公司排名/地推团队去哪里找
有时候我们的网站程序在本地运行没有问题,但在上传到远程服务器后则报错。这就需要我们了解具体错误,但IIS默认只显示统一的运行时错误,想要知道具体错误就需要配置Web.config中customErrors mode选项为Off。不过有时候customErrors标签是被包…...
如何设置网站的关键词/开网店怎么开 新手无货源
在我们生活中不知道大家是否和我一样当遇到很多事情的事情,反而却无能为力的只能去黯然接受,也不知道究竟是从什么时候开始,大家口中说的那些正常,成为了不得不去接受的潜规则。最明显的几项我想我一说出来大家肯定会举双手赞成1.…...
北京工程质量建设协会网站/企业网站怎么制作
生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源。本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模型,单生产者-多消费者模型,多生…...