拷贝

蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了…

若如初见. 提交于 2020-01-21 18:52:08
"狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过" "哦,这个知识点,我之前应该有讲过,你没注意到?" "这东西工作中用不到,可能被我忽略了" "啧啧啧..." "哎,有空和我大概讲讲?" "先从简单开始,实现下这个场景:从一个文件中读出数据并将数据传到另一台服务器上?" "为啥写这个?" "你先写" "行..." 1分钟后 "我写了伪代码" File.read(file, buf, len); Socket.send(socket, buf, len); "这里涉及到了几次数据拷贝?" "2次?磁盘拷贝到内存,内存拷贝到Socket?" "emmm,怪不得挂了,一点不冤。" "这种方式一共涉及了4次数据拷贝,知道用户态和内核态的区别吗?" "了解" "行,文字有点干瘪,你先看这个图" image.png 1、应用程序中调用 read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。 2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候, read() 调用返回,且引发一次上下文切换(内核态->用户态)

Python深浅拷贝

强颜欢笑 提交于 2020-01-21 17:41:08
浅拷贝(shallow copy) 通俗易懂的说法为: 只复制容器,并不复制值。 浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。 浅拷贝有三种形式:切片操作、工厂函数、copy 模块中的 copy 函数。 copy 函数:b = copy.copy(a) 浅拷贝产生的列表 b 不再是列表 a 了,使用 is 判断可以发现他们不是同一个对象,使用 id 查看, 他们也不指向同一片内存空间。但是当我们使用 id(x) for x in a 和 id(x) for x in b 来查看 a 和 b 中元素的地址时,可以看到二者包含的元素的地址是相同的。 在上述情况下,列表 a 和 b 是不同的对象,修改列表 b 理论上不会影响到列表 a。 但是要注意的是,浅拷贝之所以称之为浅拷贝,是它仅仅只拷贝了一层,在列表 a 中有一个嵌套的list,如果我们修改了它,情况就不一样了。 比如:a[3].append(‘java’)。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并未发生变化,指向的都是用一个位置。 深拷贝(deep copy) 通俗易懂的说法: 复制容器也复制可变的值 深拷贝只有一种形式,copy 模块中的 deepcopy()函数。

windows拷贝文件到linux后中文文件名显示乱码

南笙酒味 提交于 2020-01-21 14:25:14
原因在于,Windows 的文件名中文编码默认为GBK,压缩或者上传后,文件名还会是GBK编码,而Linux中默认文件名编码为UTF8,由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。 解决办法(在linux系统上操作) 1.yum install convmv 2.convmv --notest --nosmart -f gbk -t utf8 -r 来源: CSDN 作者: noravinsc 链接: https://blog.csdn.net/sinat_26809255/article/details/104060409

如何在word中添加视频

南楼画角 提交于 2020-01-21 06:11:29
这两天由于工作需要,要写一关于 gis 功能的说明文档,为了能够更加形象,想要将一些操作过程录制为视频添加到 word 文档中。 刚开始的做法是将视频文件拖到 word 文档中,实践证明该视频确实可以在 word 中播放。满以为问题就这么简单。后来将 word 文件拷贝到另外一台计算机之后,再来尝试播放 word 文档中的视频,则无法播放了。原来这种所谓的插入只是插入一个链接而已。 于是尝试第二种方式:插入 -> 对象 -> 由文件创建 -> 浏览 -> 插入 ; 插入了视频文件之后,在 word 文件中可以播放,但是将 word 文件拷贝到另外一台计算机之后,则又播放失败。原来又是一个链接而已; 既然以上两种插入方式都不行,于是想着干脆在拷贝到其他计算机的时候连同视频一起拷贝,但是能够这样做的前提条件是插入的链接是相对路径。于是就想到第三种方式:将视频拷贝到文档所在目录的 video 子目录下,打开控件工具箱,单击右下角的 其他控件 ,选择 Windows media player ,右键点击插入的图元 -> 属性,在其属性页中找到 FileName 属性,修改该属性的值为 video\ 视频文件名称 .avi ,关闭属性设置对话框,并退出控件设计模式,此时确实可以在 word 中播放视频,但是在将该 word 文档连同视频(他们的相对路径不变)拷贝到另外一台计算机之后

java的深拷贝和浅拷贝

…衆ロ難τιáo~ 提交于 2020-01-21 03:05:56
我们知道拷贝就是生成一个新对象和原对象一模一样,但是拷贝也是分方式和程度的,我们来看一下什么是浅拷贝什么是深拷贝 浅拷贝 在Java中,java.lang.Object类的clone()方法用于克隆(浅拷贝,属性的指向是相同的)。 该方法创建一个对象的副本,并通过逐字段分配在其上对其进行调用并返回该对象的引用。 要实现浅拷贝需要实现Cloneable接口,该接口里面没有任何方法,它指向的是java.lang.Object类的clone() protected native Object clone() throws CloneNotSupportedException; 它是一个native方法,由C/C++实现 我们看看例子,理解下它为啥叫浅拷贝 首先有一个字典对象类,它实现了克隆的接口 @Data class Dictionary implements Cloneable { private String name ; private List < String > words ; @Override public Object clone ( ) { try { return super . clone ( ) ; } catch ( CloneNotSupportedException e ) { e . printStackTrace ( ) ; } return

浅析深拷贝与浅拷贝

牧云@^-^@ 提交于 2020-01-21 01:32:21
01 深拷贝与浅拷贝 1. 定义解释 简单理解, 深拷贝和浅拷贝就是拷贝内容的层次深度不同。深拷贝全部都是新的(递归),浅拷贝只有第一层是新的。 指向 a = [11, 22] 指在内存中开辟一个空间,存储[11, 22]这个列表,a 指向这个空间的内存地址。 b = a , 表示b 也指向这个内存地址,没有开辟新的内存空间。 id(a) = id(b) 另外: a == b (True) 内容相同, a is b (True) 内存地址相同 浅拷贝 浅拷贝只是单纯地拷贝要拷贝的东西的指向,但是不拷贝指向的内存地址中的内容。(拷贝C的快捷方式) import copy a = [11, 22] b = [33, 44] c = [a, b] e = copy.copy(c) id(e) = id(c) id(e) Out[41]: 2447913914184 id(c) Out[42]: 2447914220744 id(e[0]) Out[43]: 2447913762952 id(c[0]) Out[44]: 2447913762952 # 在c中新增一个数值,e不会改变 c.append(55) c Out[47]: [[11, 22], [33, 44], 55] e Out[48]: [[11, 22], [33, 44]] # 但是在a中新增一个数值,则e也会改变 a

FastDFS的安装以及与nginx整合

烈酒焚心 提交于 2020-01-20 21:54:15
1 FastDFS 安装 1.1 安装虚拟机 安装 CentOS7 虚拟机。 1.2 FastDFS–tracker 安装 分别在 192.168.101.3 和 192.168.101.4 上安装 tracker。 注:初次安装可只安装一台 tracker即192.168.101.3, 快速体验。 1.2.1 下载 tracker 和 storage 使 用 相 同 的 安 装 包 , 下载地址 本教程使用: FastDFS_v5.05.tar.gz 1.2.2 FastDFS 安装环境 FastDFS 是 C 语言开发,建议在 linux 上运行,本教程使用 Centos7 作为安 装环境。 安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果 没有 gcc 环境,需要安装 gcc: yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake 1.2.3 安装 libevent FastDFS 依赖 libevent 库,需要安装: yum - y install libevent 1.2.4 安装 libfastcommon libfastcommon 是 FastDFS 官方提供的, libfastcommon 包含了 FastDFS 运行所需要的一些基础库。将

原型模式

我怕爱的太早我们不能终老 提交于 2020-01-20 19:53:27
适用性: 1.当一个系统应该独立于它的产品创建,构成和表示时; 2.当要实例化的类是在运行时刻指定时,例如,通过动态装载; 3.为了避免创建一个与产品类层次平行的工厂类层次时; 4.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 说实话,我对于原型模式的理解还停留在哦Entity Mapper层面,我总是觉得它的转化也是一种原型模式,因为它也将对象拷贝到一个新的地址去了 使用原型模式代码实现如下: #region 抽象原型基类 public abstract class NormalActor { public abstract NormalActor clone(); public abstract NormalActor deepClone(); } public abstract class FlyActor { public abstract FlyActor clone(); } #endregion #region 实际需要克隆类 public class NormalActor_Active : NormalActor { public List<string> list = new List<string>(); int a = 0; public override NormalActor

总是想不明白的零拷贝

蓝咒 提交于 2020-01-20 17:48:24
linux 分用户态和内核态,两者权限不一样,逻辑地址空间不一样 以 write 为例,用户程序可能是把数据写入了自己的缓冲区,然后把用户进程缓冲区的数据拷入内核缓冲区,再刷到磁盘 read 则是,把内核缓冲区的数据拷入用户进程缓冲区,再从用户进程缓冲区取出数据 而对于零拷贝: mmap 针对文件 IO,我理解用户进程不再使用自己的缓冲区了,通过 mmap 的映射,它可以直接操作内核态的 page cache sendFile 针对网络 IO,用户进程也是不再使用自己的缓冲区了,直接把数据写入内核态的 socket 缓冲区中 所以,总结就是 不再使用用户进程的缓冲区 来源: https://www.cnblogs.com/allenwas3/p/12218522.html