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

用花瓣网站上的图片做游戏行吗广州网络推广服务商

用花瓣网站上的图片做游戏行吗,广州网络推广服务商,天津品牌网站设计,wordpress 下载功能自动驾驶的关键路径如下,传感器的数据发送给感知模块;感知模块根据传感器数据来确定车辆所处的环境,比如前方有没有障碍物,是不是和车道线保持着适当的距离等;感知处理之后的数据传递给规控模块,规控根据车…

自动驾驶的关键路径如下,传感器的数据发送给感知模块;感知模块根据传感器数据来确定车辆所处的环境,比如前方有没有障碍物,是不是和车道线保持着适当的距离等;感知处理之后的数据传递给规控模块,规控根据车辆当前所处的环境来规划车辆的路线和加减速等;最后规控的结果要发送到底盘/动力来做真正的执行。

在自动驾驶的关键路径中,对确定性要求是非常高的,因为车辆是一个安全产品,一旦某个环节消耗的时间不符合确定性的要求,那么会造成比较大的影响。比如车辆前方有行人,那么车辆就需要及时刹停,不可延误。

确定性,考虑的是最恶劣的情况,假如规控模块要求,每次处理规控任务的处理时间不能超过2ms,那么就是要求无论系统运行在什么环境下,当前系统的负载是怎么样的,规控任务的处理时间都不能超过2ms。也就是说如果车辆连续运行了一周,假如规控运行的次数是1000万次,那么也不允许有一次超过2ms的。

1获取线程实际消耗的cpu时间

如下代码,如果要获取planning函数执行消耗的时间。在相当长的一段时间,都是直接获取CLOCK_BOOTTIME这种clock id的时间,这种时间都是墙上时间。在很多时候用这种时间来表示任务消耗的也是没有问题的,但是如果进程中发生了睡眠,发生了阻塞,使用这种时间就不准确了,这种时间不能表示任务实际消耗的cpu时间。

通过函数pthread_getcpuclockid获取的clock,表示cpu时间,也就是线程实际占用的cpu的时间。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <pthread.h>void planning() {int counter = 0;for(int i = 0; i < 10000; i++) {counter++;}for (int i = 0; i < 5; i++) {sleep(1);}
}int main() {clockid_t clock_id;struct timespec start_time1;struct timespec end_time1;struct timespec start_time2;struct timespec end_time2;pthread_getcpuclockid(pthread_self(), &clock_id);clock_gettime(clock_id, &start_time1);clock_gettime(CLOCK_BOOTTIME, &start_time2);planning();clock_gettime(clock_id, &end_time1);clock_gettime(CLOCK_BOOTTIME, &end_time2);printf("real time:%ldns\n", (end_time1.tv_sec * 1000 * 1000 * 1000 + end_time1.tv_nsec) - (start_time1.tv_sec * 1000 * 1000 * 1000 + start_time1.tv_nsec));printf("wall time:%ldns\n", (end_time2.tv_sec * 1000 * 1000 * 1000 + end_time2.tv_nsec) - (start_time2.tv_sec * 1000 * 1000 * 1000 + start_time2.tv_nsec));return 0;
}

运行结果如下,cpu clock id显示的时间是线程实际消耗的时间,是514微秒左右;wall time是5秒。

2获取线程调度次数

在linux中进程的status文件中显示了线程调度的次数。最后两行表示线程调度次数,voluntary_ctxt_switches表示线程主动调度的次数,比如当线程睡眠,IO阻塞时,会触发线程调度,这时的调度就是自愿调度;nonvoluntary_ctxt_switches表示线程非自愿调度的次数,比如当线程的时间片用完,被调度器强制调度,这种情况就是非自愿调度。

可以通过该文件获取调度次数,可以在调用planning之前获取线程的调度次数,返回之后再次获取调度次数,两者的调度次数差就基本上能表示在planning执行过程中发生的调度次数。这里之所以说是基本上,而不是绝对,因为在获取调度次数到planning真正被执行,以及planning返回到获取调度次数之间,也有可能发生调度。

root@wangyanlong-virtual-machine:/home/wangyanlong/test# cat /proc/12744/status
Name:   a.out
Umask:  0022
State:  S (sleeping)
Tgid:   12744
Ngid:   0
Pid:    12744
PPid:   2374
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 999
NStgid: 12744
NSpid:  12744
NSpgid: 12744
NSsid:  2294
VmPeak:     2712 kB
VmSize:     2644 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      1024 kB
VmRSS:      1024 kB
RssAnon:               0 kB
RssFile:            1024 kB
RssShmem:              0 kB
VmData:       92 kB
VmStk:       132 kB
VmExe:         4 kB
VmLib:      1796 kB
VmPTE:        36 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
CoreDumping:    0
THP_enabled:    1
Threads:        1
SigQ:   0/15188
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 000001ffffffffff
CapEff: 000001ffffffffff
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
NoNewPrivs:     0
Seccomp:        0
Seccomp_filters:        0
Speculation_Store_Bypass:       thread vulnerable
SpeculationIndirectBranch:      conditional enabled
Cpus_allowed:   ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:      0-127
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        42
nonvoluntary_ctxt_switches:     0
root@wangyanlong-virtual-machine:/home/wangyanlong/test#

有时候,当我们统计出来wall time比较大的时候,就说这个任务消耗的时间多,这样的说服力是比较弱的。这个时候我们就需要获取线程实际消耗的时间结合调度次数,来进行分析。

(1)如果real time和wall time都比较大,那么说明就是任务执行实际消耗的时间长,需要对任务本身的逻辑进行优化。

(2)如果real time比较小,wall time比较大,那么可能有两种情况

①在任务执行期间发生了调度,这个时候就需要通过绑核或者提高线程的优先级等方式来保证在任务执行期间不会发生调度。

②任务中存在阻塞的操作,等待一个条件满足,比如等待一个IO条件,等待一个mutex等,要结合代码进一步分析。

http://www.ds6.com.cn/news/119831.html

相关文章:

  • 手机网站建设 广州网站开发平台有哪些
  • 内含各种专业的网站搭建模板seo服务
  • 上海网站如何制作百度惠生活推广怎么收费
  • 一个网站开发成本个人网站的制作
  • 建站公司是外包吗视频营销案例
  • 巴彦淖尔专业做网站的整站seo外包
  • 德阳网站建设网站建设免费开发软件制作平台
  • 专门做网站的公司与外包公司深圳网络推广代运营
  • 旅游找什么网站好优帮云查询数据云查询
  • 中小企业怎么优化网站网络营销推广微信hyhyk1效果好
  • 哪个网站可以找题目给小孩做深圳seo优化排名优化
  • ps做淘宝网站导航栏长沙seo霸屏
  • 网络营销的起源seo网站是什么意思
  • 北京国贸网站建设镇江网站建设推广
  • 美国cms是什么机构青海seo关键词排名优化工具
  • ps制作网站首页网站关键词优化推广
  • seo快速优化软件网站百度ai人工智能
  • 樟木头东莞网站建设做企业网站哪个平台好
  • 做网站的怎么挣钱谷歌seo价格
  • 公司招聘网站续费申请企业品牌推广营销方案
  • 垦利县企业型网站建设关键词搜索指数
  • 网站与网站链接怎么做湖南seo优化服务
  • 查询注册过的网站seo技术教程
  • dw做网站常用标签邀请注册推广赚钱的app
  • 网站建设合同黑客攻击网站seo专员招聘
  • 郑州百姓网交友征婚免费seo网站推广价格
  • dw做的网站如何让文字换行天天seo站长工具
  • dede程序数据库还原图文教程★适合dede网站迁移网络推广长沙网络推广
  • 景德镇网站制作餐饮营销手段13种手段
  • 成都倒闭的网站建设公司名单百度广告推广平台