缓冲区分析

《驱动调试 - printk源码分析和应用实例》

醉酒当歌 提交于 2019-12-01 19:10:12
1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“ console=tty1 ”时,表示printk()输出在开发板的LCD屏上 当uboot的命令行里的“ console=ttySAC0,115200 ”时,表示printk()输出在串口UART0上,波特率=115200 当uboot的命令行里的“ console=tty1 console=ttySAC0,115200 ”时,表示printk()同时输出在串口上,以及开发板的LCD屏上 显然printk(),还是根据命令行参数来调用不同控制台的硬件处理函数 内核又是怎么根据上面命令行参数来确定printk()的输出设备? 2.我们以“console=ttySAC0,115200”为例,进入linux-2.6.22.6\kernel\printk.c 找到以下一段: __setup("console=", console_setup); 若uboot传递进来的命令行字符串里含有“ console= ”,便调用 console_setup() 函数,并对“console=”后面带的字符串" ttySAC0,115200 "进行分析 3. 我们以*str= "ttySAC0,115200" 为例,console_setup() 函数如下所示 static int __init console

Oracle体系结构和用户管理

南笙酒味 提交于 2019-12-01 02:14:51
通过博文 部署Oracle 12c企业版数据库 已经可以部署Oracle数据库了,本篇博文主要介绍Oracle的体系结构,包括存储结构、内存结构和进程结构进行初步了解。对进一步学习Oracle数据库有很大的帮助。 博文大纲: 一、Oracle体系结构 1.Oracle体系结构概述 2.Oracle服务器 3.Oracle存储结构 4.Oracle内存结构 5.Oracle进程结构 二、CDB与PDB的基本操作 三、用户管理 四、数据库权限管理 五、导入测试数据 一、Oracle体系结构 数据库的体系结构是指数据库的组成、工作过程、以及数据库中数据的组织与管理机制,要了解Oracle数据库的体系结构,必须理解Oracle系统的主要组件和重要概念。 1.Oracle体系结构概述 Oracle体系结构包含一系列组件,如图: 图中显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。 从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的两个概念。 作为一个DBA管理者,维护实例和数据库本身的正常运行是最基本的技能。 (1)实例 Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle实例启动时,将分配一个系统全局区(SGA

牛客 C++刷题day22

血红的双手。 提交于 2019-11-30 10:04:24
switch 语句中执行顺序: 如果某一个case中不加break,那么假如某一次切换到该case则按照语句顺序,执行接下来的所有case句子,直到遇到break,注意,switch语句中的语句顺序非常重要。 原子操作( Atomic operations)不可中断的一个或一系列操作。 标准库里面的string在多线程下并不保证是都是安全的,只提供两种安全机制: 1.多个线程同时读取数据是安全的。 2.只有一个线程在写数据是安全的。 局部变量局部使用是安全的 为什么?因为每个thread 都有自己的运行堆栈,而局部变量是生存在堆栈中,大家不干扰。 2.全局原生变量多线程读写是不安全的 , 全局变量是在堆(heap)中。 3.函数静态变量多线程读写也是不安全的。 4.volatile能保证全局整形变量是多线程安全的么? 不能。 volatile仅仅是告诫compiler不要对这个变量作优化,每次都要从memory取数值,而不是从register 5.InterlockedIncrement保证整型变量自增的原子性 写好多线程安全的法宝就是封装,使数据有保护的被访问到 安全性: 局部变量 > 成员变量 > 全局变 函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto Cin的用法 1.cin简介 cin是C++编程语言中的标准输入流对象,即istream类的对象

PHP_header location 使用注意事项

帅比萌擦擦* 提交于 2019-11-30 09:13:08
header("Location:login.php")应该注意的几个问题 header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出 但是很多时候在header前我们已经输出了好多东西了,此时如果再次header的话,显然是出错的,在这里我们启用了一个ob的概念,ob的意思是在服务器端先存储有关输出,等待适当的时机再输出,而不是像现在这样运行一句,输出一句,发现header语句就只能报错了。 具体的语句有: ob_start(); ob_end_clean();ob_flush();......... 2、在header("Location:")后要及时exit 否则他是会继续执行的,虽然在浏览器端你看不到相应的数据出现,但是如果你进行抓包分析的话,你就会看到下面的语句也是在执行的。而且被输送到了浏览器客户端,只不过是没有被浏览器执行为html而已(浏览器执行了header进行了转向操作)。 所以,标准的使用方法是: ob_start(); ........ if ( something ){ ob_end_clean(); header("Location: yourlocation"); exit; else{ .......... ob_flush(); //可省略 要想在header前有输出的话

MapReduce工作机制详解

爱⌒轻易说出口 提交于 2019-11-29 19:08:55
MapReduce工作机制详解 文章目录 MapReduce工作机制详解 MapTask 工作机制 简单概述: 详细步骤: ReduceTask 工作机制 简单概述: 详细步骤: Shuffle 机制 MapReduce 并行度机制 FileInputFormat 切片机制 Reducetask 并行度机制 Task 并行度经验之谈 MapTask 工作机制 简单概述: input File 通过 split 被逻辑切分为多个 split 文件,通过 Record 按行读取内容给 map(用户自己实现的)进行处理,数据被 map 处理结束之后交给 OutputCollector 收集器,对其结果 key 进行分区(默认使用 hash 分区),然后写入 buffer,每个 map task 都有一个内存缓冲区,存储着 map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个 map task 结束后再对磁盘中这个 map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task 来拉数据。 详细步骤: 首先,读取数据组件 InputFormat(默认 TextInputFormat)会通过 getSplits 方法对输入目录中文件进行 逻辑切片规划 得到 splits,有多少个 split 就对应启动多少个

生产者-消费者问题

烂漫一生 提交于 2019-11-29 16:28:12
目录 1. 概述 定义 缓冲区 2. 典型模型 模型一 模型二 可选需求 3. 数据结构队列C语言实现 4. 代码实现——互斥锁 + 条件变量 5. 代码实现——互斥锁 + Posix有名信号量 6. 代码实现——互斥锁 + Posix无名信号量 7. 效率对比 结论 奇怪的问题 1. 概述 定义 生产者消费者问题是线程同步的经典问题,也称为有界缓冲区问题,问题描述大致如下: 生产者和消费者之间共享一个有界数据缓冲区 一个或多个生产者(线程或进程)向缓冲区放置数据 一个或多个消费者(线程或进程)从缓冲区取出数据 缓冲区 生产者消费者问题中的缓冲区,包括队列缓冲区和环形缓冲区,它们都按照先进先出的顺序处理数据,我们现在只考虑队列缓冲区: 队列缓冲区通常使用普通的队列数据结构 队列内部实现可以是链表或数组 缓冲区有两个极端状态:缓冲区空,缓冲区满。链表队列和数组队列缓冲区空的含义相同,都是队列中没有一个元素的情形,但两者缓冲区满的含义不同: 数组队列在初始化时就必须指定最大容量,缓冲区满的条件很清晰 链表队列没有最大容量的概念,需要人为指定 此外,Posix消息队列也可以作为队列缓冲区,Posix当以无优先级消息的方式使用时,也是按照先进先出的顺序进行处理的。 本文只讨论第一种数据结构队列缓冲区,基于Posix消息队列缓冲区的生产者消费者问题,会在后续Posix消息队列中单独讲解。 2

06文件操作

为君一笑 提交于 2019-11-28 23:08:44
文件操作 文件操作函数在内容中使用的 ZwXXXX 系列,下面是函数一览表 函数名 功能 ZwCreateFile 打开文件 ZwReadFile 读取文件内容 ZwWriteFile 将数据写入文件 ZwQueryInformationFile 查询文件信息 ZwDeleteFile 删除文件 ZwClose 关闭文件 打开/创建文件 在内核中打开文件比较繁琐, 该函数使用了比较多的API: 要打开的文件路径必须设置在 OBJECT_ATTRIBUTES 对象中, 此外, OBJECT_ATTRIBUTES 结构体的对象属性一般可以设置为 OBJ_CASE_INSENSITIVE (不区分大小写) , OBJ_KERNEL_HANDLE( 内核句柄) NTSTATUS createFile(wchar_t * filepath,/*文件路径*/ ULONG access, /*访问权限,: GENERIC_READ, GENERIC_XXX*/ ULONG share,/*文件共享方式: FILE_SHARE_XXX*/ ULONG openModel,/* 打开方式: FILE_OPEN_IF,FILE_CREATE ...*/ BOOLEAN isDir,/*是否为目录*/ HANDLE * hFile /*成功打开的文件句柄*/){​ NTSTATUS status =

缓冲流

坚强是说给别人听的谎言 提交于 2019-11-28 08:22:50
BufferedOutputStream ————字节缓冲输出流 继承自父类的共性方法 public void close()——关闭此输出流并释放与此流相关联的任何系统资源。 public void flush()——刷新此输出流并强制任何缓冲的输出字节被写出。 public void write(byte[ ] b)——将b.length字节从指定的字节数组写入到此输出流。 public void write(byte[ ] b,int off,int len)——从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。 public abstract void write(int b)——将指定的字节输出流。 构造方法 BufferedOutputStream (OutputStream out)——创建一个新的缓冲输出流,以将数据写入指定的底层输出流。 BufferedOutputStream (OutputStream out,int size)——创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。 参数 OutputStream out————字节输出流 我们可以传递FileOutPutStream,缓冲流会给FileOutPutStream增加一个缓冲区,提高FileOutPutStream的写入效率。 int size———————

深入了解scanf()/getchar()和gets()/cin等函数

≡放荡痞女 提交于 2019-11-28 02:11:31
转:问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include <stdio.h> int main() { char ch1, ch2; scanf("%c", &ch1); scanf("%c", &ch2); printf("%d %d\n", ch1, ch2); return 0; } 或者是: #include <stdio.h> int main() { char ch1, ch2; ch1 = getchar(); ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; } 程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢? 【分析】: 首先我们呢看一下输入操作的原理, 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区

AM--消息队列

允我心安 提交于 2019-11-26 12:19:05
kafka rocketMq零拷贝对比 https://cloud.tencent.com/developer/news/333695 还有Linux目录下的基本原理 RocketMQ Kafka Consumer消费消息过程,使用了零拷贝,零拷贝包含以下两种方式 1. 使用 mmap + write 方式 RocketMQ 选择了这种方式,mmap+write 方式,因为有小块数据传输的需求,效果会比 sendfile 更好。但是RocketMQ控制mmap映射的内存分配与释放的地方非常复杂,稍有不慎就会出问题。 优点:即使频繁调用,使用小块文件传输,效率也很高。 缺点:不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂,需要避免 JVM Crash问题。 2. 使用 sendfile 方式 优点:可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全性问题。 缺点:小块文件效率低于 mmap 方式,只能是 BIO 方式传输,不能使用 NIO。 sendfile:FileChannel.transferTo()只有源为FileChannel才支持transfer这种高效的复制方式,其他如SocketChannel都不支持transfer模式。当然,目的Channel没有这种限制。所以一般可以做FileChannel-