内存映射

Windows线程+进程通信

丶灬走出姿态 提交于 2020-03-01 08:15:48
一 Windows线程进程 1)定义 按照MS的定义, Windows中的进程简单地说就是一个内存中的可执行程序, 提供程序运行的各种资源. 进程拥有虚拟的地址空间, 可执行代码, 数据, 对象句柄集, 环境变量, 基础优先级, 以及最大最小工作集. Windows中的线程是系统处理机调度的基本单位. 线程可以执行进程中的任意代码, 包括正在被其他线程执行的代码. 进程中的所有线程共享进程的虚拟地址空间和系统资源. 每个线程拥有自己的例外处理过程, 一个调度优先级以及线程上下文数据结构. 线程上下文数据结构包含寄存器值, 核心堆栈, 用户堆栈和线程环境块. 2) 如下图: 3)线程与进程的关系 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。 在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。 4) 进程和线程的区别   (1)、进程是资源管理的基本单位,它拥有自己的地址空间和各种资源,例如内存空间、外部设备;线程只是处理机调度的基本单位,它只和其他线程一起共享资源,但自己没有任何资源。   (2)、以进程为单位进行处理机切换和调度时,由于涉及到资源转移以及现场保护等问题,将导致处理机切换时间变长,资源利用率降低

简述:Unix/Linux内存管理

人盡茶涼 提交于 2020-03-01 03:58:48
一、底层结构 采用三层结构,实际使用中可以方便映射到两层或者三层结构,以适用不同的硬件结构。最下层的申请内存函数get_free_page。之上有三种类型的内存分配函数: 1.kmalloc类型。内核进程使用,基于切片(slab)技术,用于管理小于内存页的内存申请。思想出发点和应用层的内存缓冲池同出一辙。但它针对内核结构,特别处理应用场景固定,不考虑释放。 2.vmalloc类型。内核进程使用。用于申请不连续内存。 3.brk/mmap类型。用户进程使用。malloc/free实现的基础。 二、内存管理的相关函数图 STL -> 内存自动分配和自动回收(C++) | C++ -> new分配内存,delete回收内存 | C -> malloc分配内存,free回收内存 | Unix 系统函数 -> sbrk/brk 分配和回收内存 | Unix底层系统函数 -> mmap/munmap分配回收 (用户层) ---------------------------------------------------------------------------- (内核层) Unix内核函数 kmalloc/vmalloc/get_free_page 三、进程与内存 a.所有进程(执行的程序)都必须占用一定数量的内存 b.对任何一个普通进程来讲,它都会涉及到5种不同的数据段

MappedByteBuffer--FileChannel--RandomAccessFile

萝らか妹 提交于 2020-03-01 00:29:17
内存映射文件 内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件。有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问。这种解决办法能大大简化修改文件的代码。 fileChannel.map(FileChannel.MapMode mode, long position, long size)将此通道的文件区域直接映射到内存中。注意,你必须指明,它是从文件的哪个位置开始映射的,映射的范围又有多大;也就是说,它还可以映射一个大文件的某个小片断。 MappedByteBuffer是ByteBuffer的子类,因此它具备了 ByteBuffer的所有方法,但新添了force()将缓冲区的内容强制刷新到存储设备中去、load()将存储设备中的数据加载到内存中、 isLoaded()位置内存中的数据是否与存储设置上同步。这里只简单地演示了一下put()和get()方法,除此之外,你还可以使用 asCharBuffer( )之类的方法得到相应基本类型数据的缓冲视图后,可以方便的读写基本类型数据。 import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class

[转]海量数据处理的面试题的方法总结

喜你入骨 提交于 2020-02-29 16:36:20
处理海量数据问题,无非就是: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之hadoop/mapreduce。 本文接下来的部分,便针对这5种方法模式结合对应的海量数据处理面试题分别具体阐述。 密匙一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 既然是海量数据处理,那么可想而知,给我们的数据那就一定是海量的。针对这个数据的海量,我们如何着手呢?对的,无非就是分而治之/hash映射 + hash统计 + 堆/快速/归并排序,说白了,就是先映射,而后统计,最后排序: 分而治之/hash映射:针对数据太大,内存受限,智能是:把大文件化成(取模映射)小文件,即16字方针:大而化小,各个击破,缩小规模,逐个解决 hash统计:当大文件转化了小文件,那么我们便可以采用常规的hashmap(ip,value)来进行频率统计。 堆/快速排序:统计完了之后,便进行排序(可采取堆排序),得到次数最多的IP。 具体而论,则是: “首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000

linux UART串口驱动开发文档

*爱你&永不变心* 提交于 2020-02-29 09:39:11
内容简介: 介绍了Linux下的串口驱动的设计层次及接口, 并指出串口与TTY终端之间的关联层次(串口可作TTY终端使用), 以及Linux下的中断处理机制/中断共享机制, 还有串口缓冲机制当中涉及的软中断机制; 其中有关w83697/w83977 IC方面的知识, 具体参考相关手册, 对串口的配置寄存器有详细介绍, 本文不再进行说明. 目录索引: 一. Linux的串口接口及层次. 二. Linux的中断机制及中断共享机制. 三. Linux的软中断机制. 四. TTY与串口的具体关联. 一. Linux的串口接口及层次 . 串口是使用已经非常广的设备了, 因此在linux下面的支持已经很完善了, 具有统一的编程接口, 驱动开发者所要完整的工作就是针对不同的串口IC来做完成相应的配置宏, 这此配置宏包括读与写, 中断打开与关闭(如传送与接收中断), 接收状态处理, 有FIFO时还要处理FIFO的状态. 如下我们就首先切入这一部分, 具体了解一下与硬件串口IC相关的部分在驱动中的处理, 这一部分可以说是串口驱动中的最基础部分, 直接与硬件打交道, 完成最底层具体的串口数据传输. 1. 串口硬件资源的处理 . W83697及W83977在ep93xx板子上的映射的硬件物理空间如下: W83697: 0x20000000起1K空间. W83977: 0x30000000起1K空间.

[轉]sendpage漏洞分析 CVE-2009-2692

我的未来我决定 提交于 2020-02-26 19:20:24
之前看了《 新爆内核高危漏洞sock_sendpage的利用分析的讨论 》这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末。现与大家分享(引用自 我的空间 )。 有什么不足之处还望多多指教~ 内核的BUG 这个BUG首先得从sendfile系统调用说起。 考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取 的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核 (send)。 而sendfile就将整个发送过程封装在一个系统调用中,避免了多次系统调用,避免了数据在内核空间和用户空间之间的大量拷贝。 ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); 虽然这个系统调用接收in和out两个fd,但是有所限制,in只能是普通文件,out只能是socket(这个限制不知道后来的内核版本有没有放宽)。 sendfile系统调用在内核里面是怎么实现的呢?这个还是比较复杂,它在内核里面做了原来要在用户态做的事情:创建一个pipe对象作buffer用、从in_fd中读数据到pipe中、将pipe中的数据写到out_fd

2020年,MyBatis常见面试题总结

空扰寡人 提交于 2020-02-26 04:49:49
Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 Mybatis 的技术架构和重要组成部分,以及基本运行原理。 博客写的很辛苦,但是写出来却不一定好看,所谓开始很兴奋,过程很痛苦,结束很遗憾。要求不高,只要读者能从系列博客中,学习到一点其他博客所没有的技术点,作为作者,我就很欣慰了,我也读别人写的博客,通常对自己当前研究的技术,是很有帮助的。 尽管还有很多可写的内容,但是,我认为再写下去已经没有意义,任何其他小的功能点,都是在已经介绍的基本框架和基本原理下运行的,只有结束,才能有新的开始。写博客也积攒了一些经验,源码多了感觉就是复制黏贴,源码少了又觉得是空谈原理,将来再写博客,我希望是“精炼博文”,好读好懂美观读起来又不累,希望自己能再写一部开源分布式框架原理系列博客。 有胆就来,我出几道 Mybatis 面试题,看你能回答上来几道(都是我出的,可不是网上找的)。 1、#{}和${}的区别是什么? 注:这道题是面试官面试我同事的。 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。 #

大文件拷贝,试试NIO的内存映射

不想你离开。 提交于 2020-02-25 18:59:35
最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有NIO、Apache提供的工具类、JDK自带的文件拷贝方法 IO拷贝 public class IOFileCopy { private static final int BUFFER_SIZE = 1024; public static void copyFile(String source, String target) { long start = System.currentTimeMillis(); try(InputStream in = new FileInputStream(new File(source)); OutputStream out = new FileOutputStream(new File(target))) { byte[] buffer = new byte[BUFFER_SIZE]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } System.out.println(String.format("IO file copy cost %d

JPA的多表设计

拟墨画扇 提交于 2020-02-23 13:31:44
表之间关系的划分 数据库中多表之间存在着三种关系,如图所示。 从图可以看出,系统设计的三种实体关系分别为:多对多、一对多和一对一关系 。注意:一对多关系可以看为两种: 即一对多,多对一。所以说四种更精确。 明确: 我们今天只涉及实际开发中常用的关联关系,一对多和多对多。而一对一的情况,在实际开发中几乎不用。 1 在 JPA 框架中表关系的分析步骤 在实际开发中,我们数据库的表难免会有相互的关联关系,在操作表的时候就有可能会涉及到多张表的操作。而在这种实现了 ORM 思想的框架中(如 JPA ),可以让我们通过操作实体类就实现对数据 库表的操作。所以今天我们的学习重点是:掌握配置实体之间的关联关系。 第一步:首先确定两张表之间的关系。 如果关系确定错了,后面做的所有操作就都不可能正确。 第二步:在数据库中实现两张表的关系 第三步:在实体类中描述出两个实体的关系 第四步:配置出实体类和数据库表的关系映射(重点) 2 JPA 中的一对多 2.1 示例分析 我们采用的示例为客户和联系人。 客户:指的是一家公司,我们记为 A 。 联系人:指的是 A 公司中的员工。 在不考虑兼职的情况下,公司和员工的关系即为一对多。 2.2 表关系建立 在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表。在数据库中建立一对多的关系,需要使用数据库的外键约束。 什么是外键? 指的是从表中有一列

mybatis和hibernate的特点

本秂侑毒 提交于 2020-02-23 07:28:59
第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择 mybatis 就会加快许多,而且语句的管理也比较方便。 第二方面:开发工作量的对比 Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。 第三方面:sql优化方面 Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的