空间数据

linux 内核与用户空间通信之netlink使用方法

邮差的信 提交于 2020-01-19 13:49:19
1 引言 Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,用户空间进程之间可以完成互相通信。为了完成内核空间与用户空间通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。 本文第2节概述相关研究工作,第3节与其他IPC机制对比,详细介绍Netlink机制及其关键技术,第4节使用KGDB+GDB组合调试,通过一个示例程序演示Netlink通信过程。第5节做总结并指出Netlink通信机制的不足之处。 2 相关研究 到目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file

Theano教程:Python的内存管理

跟風遠走 提交于 2020-01-19 04:43:29
在写大型程序时候的一大挑战是如何保证最少的内存使用率。但是在Python中的内存管理是比较简单的。Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所占的内存就会被释放。理论上听起来很不错,也很简单,但是在实践中,我们需要知道一些Python内存管理的知识从而让程序在运行过程中能够更加高效地使用内存。其中一个方面我们需要知道的是基本的Python对象所占空间的大小,另一方面我们需要知道的是Python在内部到底是如何管理内存的。 基本对象 一个 int 对象占多大空间呢? C/C++程序员会说它是由具体的机器决定的,可能是32为或者64位,因此它最多占8个字节(一个字节8位)。那么在Python中也是如此吗? 下面写一个函数来揭示出对象占多大的空间(某些情况下需要递归,比如某一个对象类型不是基本的数据类型): 1 import sys 2 3 def show_sizeof(x, level=0): 4 5 print "\t" * level, x.__class__, sys.getsizeof(x), x 6 7 if hasattr(x, '__iter__'): 8 if hasattr(x, 'items'): 9 for xx in x.items(): 10 show_sizeof(xx, level + 1) 11

解决vue修改路由的查询字符串(query)url不改变,页面不刷新问题

百般思念 提交于 2020-01-18 13:33:06
我个人猜测可能是对路由的数据检测深度不够吧,单纯修改query里面的属性是不能触发数据驱动的,因此要直接给query赋值新的对象才能驱动数据更新,做法如下 第一种 var query=JSON.parse(JSON.stringify(this.$route.query)) query.id="success" this.$router.push({path:'/url',query:query}) 第二种 var query={id:'123456'} this.$router.push({path:'/',query:query}) 两种方法都大同小异,原理都是给query新的对象,而不是修改query的属性值,因为query本质是一个对象地址,指向存放这个对象的堆空间,堆空间改变,query值并没有改变,因此route会认为数据没有改变而没有更新路由。 来源: https://www.cnblogs.com/shuen/p/10929837.html

i/o模型

五迷三道 提交于 2020-01-17 06:58:27
I/O模型 简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只涉及了基本操作,下面分析一下这张图。 用户空间和内核空间 一个计算机通常有一定大小的内存空间,如一台计算机有4GB的地址空间,但是程序并不能完全使用这些地址空间,因为这些地址空间是被划分为用户空间和内核空间的。 程序只能使用用户空间的内存 ,这里所说的使用是指程序能够申请的内存空间,并不是真正访问的地址空间。下面看下什么是用户空间和内核空间: 1、用户空间 用户空间是常规进程所在的区域,什么是常规进程,打开任务管理器看到的就是常规进程: JVM就是常规进程,驻守于用户空间,用户空间是非特权区域,比如在该区域执行的代码不能直接访问硬件设备。 2.内核空间   内核空间运行时所使用的用于程序调度,虚拟内存的使用或者连接硬件资源等的程序逻辑。内核代码有特别的特权,能与设备控制器通讯,控制着整个用于整个区域进程的运行状态,所有io都直接或间接通过内核空间。 划分内核空间和用户空间是为了保证操作系统的稳定性和安全性。用户程序不可以直接访问硬件资源,如果用户程序需要访问硬件资源必须调用系统提供的接口,这个调用接口的过程也就是系统调用。每次系统调用都会存在两个内存空间直接的切换。通常的网络传输也是一次系统调用,通过网络传输的数据 是先从内核空间接收到远程主机的数据

Linux中应用层通过v4l2框架提供的接口操作camera传递到内核的数据的过程

拥有回忆 提交于 2020-01-16 21:30:48
在Linux中应用层获取图像的数据都是通过固定的框架实现的。首先试想一下,应用层获取一帧一帧的图像数据,需要做哪些步骤?如果我们想从Linux的内核中获取数据,最直接的方法就是mmap内存映射获取一帧图像数据在应用层的操作空间的首地址,这样应用层就可以直接读取这个首地址就获取到了图像的数据了。 代码参考:https://www.jianshu.com/p/0ac427d267d4 这里主要是讲解v4l2中应用层怎样从内核中获取数据的方法。至于之前的初始化中的获取camera的属性,或者视频格式的设置等。请参考:https://blog.csdn.net/u010299133/article/details/103737645 1.就像上面分析的那样,首先需要将位于内核的首地址映射到用户空间,并且内核以多大的缓冲空间存取视频帧的数据,是需要应用层决定的,操作方法如下: struct v4l2_requestbuffers req; // 申请帧缓冲 req.count=FRAME_NUM;// 这个需要用户决定,在内核中申请的帧缓冲的个数,一般以应用层能够处理的过来即可。 4 个或者 5 个 req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory=V4L2_MEMORY_MMAP; if(ioctl(fd,VIDIOC_REQBUFS,

ch06 面向对象特性

不问归期 提交于 2020-01-16 05:50:25
文章目录 面向对象特性 理解面向对象概念 类和对象 多态性 继承 创建类、属性和操作 类结构 构造函数 析构函数 类的实例化 使用类属性 调用类操作 使用private和public关键字控制访问 编写访问器函数 在PHP中实现继承 通过继承使用private和protected控制可见性 覆盖 使用final关键字进制继承和覆盖 多重继承 接口 Trait 类设计 自定义类代码 面向对象高级功能 使用类级别常量 实现静态方法 检查类类型和类型提示 延迟静态绑定 对象克隆 使用抽象类 __call()重载方法 __autoload()方法 迭代器和迭代 生成器 将类转换成字符串 使用反射API 名称空间 子名称空间 全局名称空间 名称空间的导入和别名 面向对象特性 理解面向对象概念 面向对象(OO)开发方法会在系统中引入对象的分类、关系和属性,从而帮助程序开发和代码重用。 类和对象 面向对象软件由一系列具有属性和操作的自包含对象组成,这些对象之间能够交互,从而达到我们的要求。对象属性是与对象相关的特性或变量。操作则是对象可以执行的用来改变其自身或对外部产生影响的方法、行为或函数(属性可以与成员变量和特性这些词交替时通,而操作也可以与方法交替使用)。 面向对象软件的一个重要优点是支持和鼓励封装的能力,封装也叫数据隐藏。从本质上讲,访问一个对象中的数据只能通过对象的操作来实现

在不占用额外空间的情况下,找出只出现一次的元素

╄→гoц情女王★ 提交于 2020-01-16 01:27:55
问题: 有一组数据,假设除了某一个元素出现了一次外,其余元素都出现了两次,怎么在 不占用额外空间 的情况下找出这个元素。 如: array[] = {2, 3, 2, 5, 1, 4, 6, 3, 1, 6, 4} 在这个数组中,怎么找出这个只出现了一次的5呢? 不限制空间的解答: 找出一组数据中只出现一次的数据 解法: 利用异或 异或是使用数据所对应的二进制值进行安慰异或,相同为0,不同为1。 因此当一组数据中所有的数据异或时,两两相同的数据会抵消,只剩下一个只出现一次的。 代码: # include <stdio.h> # include <string.h> int main ( int argc , char const * argv [ ] ) { int array [ ] = { 2 , 3 , 2 , 5 , 1 , 4 , 6 , 3 , 1 , 6 , 4 } ; int i = 0 ; int length = 0 ; length = sizeof ( array ) / sizeof ( array [ 0 ] ) ; for ( i = 1 ; i < length ; i ++ ) array [ 0 ] = array [ 0 ] ^ array [ i ] printf ( "%d\n" , array [ 0 ] ) return 0

Java BIO NIO 与 AIO

二次信任 提交于 2020-01-15 22:39:14
回顾 上一章我们介绍了操作系统层面的 IO 模型。 阻塞 IO 模型。 非阻塞 IO 模型。 IO 复用模型。 信号驱动 IO 模型(用的不多,知道个概念就行)。 异步 IO 模型。 并且介绍了 IO 多路复用的底层实现中,select,poll 和 epoll 的区别。 几个概念 我们在这里在强调一下几个概念。 一个 IO 操作的具体步骤: 对于操作系统来说,进程是没有直接操作硬件的权限的,所以必须请求内核来帮忙完成。 等待数据准备好,对于一个套接字上得操作,这一步骤关系到数据从网络到达,并将其复制到内核某个缓冲区。 将数据从内核缓冲区复制到进程缓冲区。 同步和异步的区别在于第二个步骤是否阻塞,如果从内核缓冲区复制到用户缓冲区的过程阻塞,那么就是同步 IO,否则就是异步 IO。所以上面提到的前四种 IO 模型都是同步 IO,最后一种是异步 IO。 阻塞和非阻塞的区别在于第一步,发起 IO 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 IO,否则就是非阻塞 IO。所以上面提到的第一种 IO 模型是阻塞 IO,其余的都是非阻塞 IO。 Java IO API 介绍完操作系统层面的 IO 模型,我们来看看,Java 提供的 IO 相关的 API。 Java 中提供三种 IO 操作的 API,阻塞 IO(BIO,同步阻塞),非阻塞 IO(NIO,同步非阻塞)和异步 IO (AIO

Mongodb 安装部署

时光毁灭记忆、已成空白 提交于 2020-01-15 12:10:30
一、简介 MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 二、什么是mongodb 1.mongodb是有C++语言编写,是一个机遇分布式文件存储的开源数据库系统。 2.在高负载的情况下,随时添加更多的节点,可以保证服务器性能。 3.mongodb旨在为WEB应用提供可扩展的高性能数据存储解决方案。 4.mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成。 5.mongodb文档类似于json对象,字段值可以包含其他文档,数组及文档数组。 三、mongodb的优缺点 优点: 文档结构的存储方式,能够更便捷的获取数据 内置GridFS,支持大容量存储 海量数据下,性能优越 动态查询 全索引支持,扩展到内部对象和内嵌数组 查询记录分析 快速,就地更新 高效存储二进制大对象(照片,视频等等) 复制(副本集)和支持自动故障恢复

嵌入式面试题(C/C++)

故事扮演 提交于 2020-01-15 11:38:27
目录 概念区分 编程 概念区分 变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。 说明:很多时候一个变量,只是声明,不分配内存空间,知道具体使用时才初始化,分配内存空间,如外部变量。 sizeof和strlen的区别 sizeof 是一个操作符 ( 关键词 ) ,strlen是库函数。 sizeof 的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\ 0 ‘的字符串作参数。 编译器在编译时就计算出了 sizeof 的结果。而strlen函数必须在运行时才能计算出来。 sizeof 计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。 写一个“标准”宏MIN # define min(a,b) ((a)<=(b)?(a):(b)) //加圆括号,保护数据 一个指针可以是volatile吗? 可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用 volatile 来修饰这个指针。 a 和 &a 有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。 # include <stdio.h> int