Other

对进程、线程和协程的理解以及它们的区别

一、进程 先来了解一下操作系统的进程: 操作系统对正在运行程序的抽象,这个就是进程(process)。 比如运行一个 web 浏览器,一个 text 文本,都是运行的一个一个进程。 有的人说:进程是程序运行资源的集合。进程是系统资源分配的最小单位等等。 从静态的角度来说,进程确实是运行程序的各种资源集合。 如果你进一步思考,进程里的各种资源都有哪些呢?如下图所示: ​ (图1:进程资源) 内存管理相关 文件系统 调度相关 信号处理 内核栈 进程各种状态 进程运行时统计信息 进程标识 等等。 可以看出,进程中的资源是相当多的。 从 Linux 操作系统对进程的定义也可以看出。我以前对进程结构 task_struct 分析文章:Linux进程: task_struct结构体成员 多进程:操作系统有多个程序运行,那么就有多个进程,如下所示简图: ​ (图2:多进程简图) 二、线程 2.1 什么是线程? 《操作系统设计与实现》里说: 在传统操作系统中,每个进程中只存在一个地址空间和一个控制流(thread)。 然后,有些情况下,需要在相同地址空间中有多个控制流并行的运行,就像他们是单独的进程一样(只是他们共享相同的地址空间)。 这些控制流通常被称为线程(thread),有时也称为轻量级进程(lightweight process)。 尽管线程必须在进程中执行,但是线程和进程是可以分别对待处理的两个概念。进程用来集合资源,而线程是 CPU 调度的实体。 线程给进程模型增加的是,允许在同一个进程环境中有多个执行流,这些执行流在很大程度上相对独立。 也即是说,在进程中,程序执行的最小单位(执行流)是线程,可以把线程看作是进程里的一条执行流。 一个进程里可以有一条或多条线程。 ​ (图3:进程里的线程)

【MySQL高级】索引有哪些种类?

什么是数据库索引?索引有哪些种类? 在数据库操作中,经常需要查找特定的数据,例如,当执行“select * from student where id=10000”语句时,MySQL数据库必须从第1条记录开始遍历,直到找到id为10000的数据,这样的效率显然非常低。为此,MySQL允许建立索引来加快数据表的查询和排序。接下来,本节将针对数据库的索引进行详细讲解。 什么是数据库索引? 数据库的索引好比新华字典的音序表,它是对数据库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中数据的查询速度。 索引有哪些种类? MySQL中的索引分为很多种,具体如下。 1.普通索引  普通索引是由 key或 index定义的索引,普通索引MySQL中的基本索引类型,可以创建在任何数据类型中,其值是否唯一和非空由字段本身的约束条件所决定。例如,在grade表的stu_id字段上建立一个普通索引,查询记录时,就可以根据该索引进行查询了。 2.唯一性索引  唯一性索引是由 unique定义的索引,唯一索引所在字段的值必须是唯一的,字段具有唯一性约束。例如,在grade表的id字段上建立唯一性索引,那么,id字段的值就必须是唯一的。 3.全文索引  全文索引是由 fulltext定义的索引,全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且,现在只有MyISAM存储引擎支持全文索引。 4.单列索引  单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可。 5.多列索引(复合索引)  多列索引指的是在表中多个字段上创建索引,使用时要满足最左前缀原则;只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。例如,在grade表的id、name和score字段上创建一个多列索引,那么,只有查询条件中使用了id字段时,该索引才会被使用。 6.空间索引  空间索引是由 spatial定义的索引,空间索引只能创建在空间数据类型的字段上。MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和 POLYGON。需要注意的是,创建空间索引的字段,必须将其声明为NOT NULL,并且空间索引只能在存储引擎为 MyISAM的表中创建。  spatial 形容词,空间的; 注意:  需要注意的是,虽然索引可以提高数据的查询速度,但索引会占用一定的磁盘空间,并且在创建和维护索引时,其消耗的时间是随着数据量的增加而增加的。因此,使用索引时,应该综合考虑索引的优点和缺点。

VCSA 7.0 重置root密码

部署了VCSA 7.0,但是root密码却忘记了并且过期了,这里记录重置root密码步骤: 登录VCSA 7.0所在的esxi主机,给VCSA 7.0打一个快照。 打开VCSA 控制台,重启VCSA。 在 VCSA Photon OS 启动后,按 e 键进入 GNU GRUB 编辑菜单。 在以linux开头的行尾加上 rw init=/bin/bash 执行ctrl + x启动,进入以下界面。 重新挂载根分区 mount -o remount,rw / 重置root密码 写入文件 echo password > /.autorelabel 重启VCSA reboot

【Alpha阶段】会议记录 - 4.22例会 - 头发茂盛队 | week8

Scrum Meeting 2022-04-22 0. 说明 日期:2022-04-22 任务:周会2,总结近两日进度,为周日产品测试做准备 1. 进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 杨濡冰 PM&客户端 我的空间场景,拖动添加装饰#20 对接后端获取模型资源拖动逻辑debug#40 #41 模型加载方式碰撞问题 冯张驰 PM&服务端 持续集成,用户,学校,兴趣爱好等接口#17 #25 #26 #27 #32 #34 #37 服务器资源加载接口#51 暂无 罗杨一飞 客户端 实时语音连接服务器,Unity场景转换#18 #19 场景切换完善,语音聊天debug,文字聊天#42 #43 #44 调用服务器错误同时加载两个场景 顾晨宇 客户端 魔方改动成空心,向下旋转进入二级页面,选择高校,返回,首页UI#23 首页UI高校场景功能#45 #46 暂无 李浩宇 客户端 登录注册,对接后端,封装接口#21 将后端反馈可视化逻辑流程做完整完善界面#47 #48 #49 有一些bug 谭思齐 服务端 实时语音连接服务器debug#36 #38 继续研究实时语音服务器,完成部署#38 调用服务器错误压力测试 肖伟强 服务端 好友相关接口#16 #35 信息推送与双人聊天接口#50 暂无 郑积想 服务端 Vue知识学习#39 跑一下冯张驰的Demo学习Vue相关知识#39 暂无 2.

【Alpha阶段】会议记录 - 4.24例会 - 头发茂盛队 | week8

Scrum Meeting 2022-04-24 0. 说明 日期:2022-04-24 任务:例会3,总结近两日进度,产品测试,下周计划 1. 进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 杨濡冰 PM&客户端 我的空间场景基本框架搭建#20拖动逻辑debug#41对接后端获取模型资源#40 继续完善个人空间页面,加入一些功能 模型加载速度偏慢 冯张驰 PM&服务端 服务器资源加载接口#51 跑通验证码服务 服务器带宽资源不够 罗杨一飞 客户端 实时语音服务的尝试#18高校场景完善#19场景切换问题#42 多人聊天服务的对接 暂无 顾晨宇 客户端 实现了电影放映室,完善首页 完善首页功能,加入一些游戏功能 资源加载 李浩宇 客户端 UI基本框架#21 对接服务端好友数据 暂无 谭思齐 服务端 并发压力测试方案调研与构建#38 调研对象存储服务器,spring测试 暂无 肖伟强 服务端 好友聊天与消息推送接口#52 用户状态,对接好友相关的信息数据 暂无 郑积想 服务端 学习vue,在本地将showwebsite仓库的网站跑起来#39 完善门户网站,准备发布 暂无 2.

折腾人的ffmpeg源码与ndk

必要的条件,首先库和头文件是必须的,所有核心函数都在库里面,其次是,要实现类似命令行的操作,或者有一个输入文件路径的函数,几经查找,在雷霄骅大神的CSDN文章中找到了相关的答案。 https://blog.csdn.net/leixiaohua1020/article/details/39760711 不过虽然有大神的文章在手,这方面依旧是很棘手的,因为拷贝进来的文件都是ffmpeg的源代码,而非编译后被筛选出来和so库对应上的头文件,那就得具体问题具体分析,这些头文件对我有什么用。 根据网上查到的各种资料,需要从ffmpeg源码目录中提取的头文件和源文件有ffmpeg.h,ffmpeg.c,ffmpeg_filter.c,ffmpeg_opt.c,cmdutils.h,cmdutils.c,cmdutils_common_opts.h和comfig.h,但是我用的是4.3版本(之后由于自己误操作太多,下载了3.4-4.4的版本试了个遍,最后一次测试换成了4.2.2,不过错误依旧,但是4.3 应该也是OK的)的ffmpeg,没有cmdutils_common_opts.h。 经过实际测试,当把上述头文件和源文件导入项目进行编译会提示缺少头文件,ffmpeg编译产生的库需要的头文件中并没有这些缺少的头文件,那么这些头文件该不该导入,我觉得应该导入,但也需要进行修改,实际上因为我没有导入那些缺少的头文件,也出现了一些undefined的错误。 项目编译时遇到的还有这样的问题:ffmpeg的源码是C语言写的,整个项目都是C项目,按照C的标准,但是NDK进行编译的时候,是使用clang++进行编译的,虽然C和C++语法上接近,曾经我也认为C++是C的一次大升级,但是经过这次学习,我觉得我错了,C就是C,C++就是C++。比如说ffmpeg的源码中变量名有设置成class或template的,不过数量不多,一个个改得过来;但是遇到指针赋值就真的绝了,要知道C语言中允许void指针直接赋值给其他类型的指针,不用强转,而C++中要进行强转,起初我学C的时候还认为,直接把C按这个标准不就行了,但是事实证明我错了,ffmpeg中的指针值赋值全都是没有强转的,我在改了20多个后发现我改不过来,于是一个个撤回后,想着如果能把NDK的编译器改成clang就好了,但是我找不到方法,不过我想起来是可以使用extern C的,于是在include ffmpeg.h前后用extern C{}包起来,结果不报那些语法错误了。 最后是编译成功,结果在运行的时候崩溃了,log报错是这样: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol ff_interleaved_golomb_vlc_len referenced by /data/app/com.thankvinci.bilipv-i1oNwQACIKGBnxJZtso48Q==/base.apk!/lib/arm64-v8a/libavformat.so... 定位不到ff_interleaved_golomb_vlc_len,对于这个东西我是很蒙蔽的,我把整个项目导入的头文件和源文件都翻了一遍,没有调用这个函数或者变量的痕迹,甚至没有这个函数或变量的定义。这是一个解题的思路,他问题截止到libavformat.so,可能就是和avformat有关,翻源码比较麻烦,于是我就想到了objdump和nm,由于之前编译的静态库没用上一直放在桌面,我就就近原则用nm工具去查了静态库,结果真就在libavformat.a静态库里面找到了ff_interleaved_golomb_vlc_len,后来用objdump去查动态库,确实就是找不到。找到的过程和结果如下: ./nm /home/thankvinci/桌面/NDKcFFMPEG/ffmpeg-4.2.2/android/armv8-a/lib/libavformat.a >symbol.txt 直接去symbol.txt里面找: rtpenc_vc2hq.o: U avpriv_report_missing_feature U ff_interleaved_dirac_golomb_vlc_code U ff_interleaved_golomb_vlc_len U ff_interleaved_ue_golomb_vlc_code U ff_rtp_send_data0000000000000000 T ff_rtp_send_vc2hq U memcpy 我对编译链接还是有一点点理解的,不出意外的话,我会在libavformat目录下找到rtpenc_vc2hq.c源文件,一查还真的有,文件内容里有一条: #include libavcodec/golomb.h 我们找不到的刚好是ff_interleaved_golomb_vlc_len,都有golomb,这应该不是巧合,于是我把libavcodec目录下的golomb.h和golomb.c文件都拷贝到NDK项目的libavcodec目录下,编译运行,果然不报这个错了,,,报了另外一个ff_log2_tab的,是libavcodec.so。好吧,如法炮制,但是这次有点麻烦,在静态文件生成的,应该可以说是链接表吧,里面出现了5次ff_log2_tab,有点难找,最后也不是在文件中找到的,是找到libavutil目录下查log.c时碰巧找到log2_tab的头文件和源文件。最后的结果当然就是跑起来了(猛男落泪)。 

Leetcode 461. 汉明距离

461. 汉明距离 - 力扣(LeetCode) (leetcode-cn.com)   思路 1 使用内置方法:    func hammingDistance(x int, y int) int { return bits.OnesCount(uint(x^y)) }  思路 2 自己实现功能 1. x^y之后,检查结果最后一位是不是1 2. 如果最后一位是1,result+1 3. 结果整体后移一位 func hammingDistance(x int, y int) int { s := x ^ y var result int for s > 0 { result += s & 1 s >>= 1 } return result }  

Summernote编辑器的使用

1 <head> 2 <meta charset=UTF-8> 3 <title>Summernote</title> 4 <link href=http://www.jq22.com/jquery/bootstrap-3.3.4.css rel=stylesheet> 5 <script src=http://www.jq22.com/jquery/2.1.1/jquery.min.js></script> 6 <script src=http://www.jq22.com/jquery/bootstrap-3.3.4.js></script> 7 <link href=../../plugins/EditPlugin/summernote.css rel=stylesheet> 8 <script src=../../plugins/EditPlugin/summernote.js></script> 9 10 <script> 11 //初始化summernote编辑器 12 $(function () { 13 $('.summernote').summernote({ 14 height: 500, 15 tabsize: 2, 16 lang: 'zh-CN' 17 }); 18 }) 19 20 //获取Summernote编辑器的值,然后赋值给隐藏输入框,vue通过输入框的值,给后台 21 function InputContent() { 22 const inputTitle = $(#inputTitle).val(); 23 const InputContent = $(.summernote).summernote('code'); 24 if (InputContent === '<p><br></p>' || InputContent === '' || inputTitle === '') { 25 alert('请检查输入是否完整!

安卓微信数据库查看

1. 数据库密码组装 数据库密码是imei+uin组合然后取32位小写MD5值前7位,部分设备读取不到imei则是1234567890ABCDEF UIN值在/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml文件里面的_auth_uin值    2.打开数据库 微信数据库需要SQLiteStudio3.2.1,注意是3.2.1版本,高于这个版本打不开 设置如下图:  

vue+axios使用get请求

1 var _this = this; 2 axios.post('http://localhost:8080/login', { 3 params: { 4 user: this.user, 5 pass: this.pass 6 } 7 }).then(function (response) { 8 console.log(response); 9 if (response.status === 200 && response.data.toString() === 'success') { 10 _this.$message({ 11 message: '登录成功', 12 type: 'success' 13 }); 14 15 } else { 16 _this.$message.error('账号或密码错误!') 17 } 18 }).catch(function (err) { 19 console.log(err); 20 _this.$message.error('请求出现异常'+err.toString()) 21 });