linux分为几大块学习

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
LINUX学习资料1
下载积分:2500
内容提示:LINUX学习资料1
文档格式:DOC|
浏览次数:3|
上传日期: 09:56:26|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2500 积分
下载此文档
该用户还上传了这些文档
LINUX学习资料1
官方公共微信博客访问: 45502
博文数量: 13
博客积分: 386
博客等级: 一等列兵
技术积分: 240
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
• VFS
虚拟文件系统(VFS)在文件系统的上一层,它封装了文件系统的实现,对于VFS更上一层来说,就不用知道操作的是何种具体的文件系统了。
我们知道真正存放信息的是储存媒介(如磁盘)
文件系统相当于媒介储存信息的协议(ext3、ntfs等)
所谓mount指的是使用某种文件系统去操作储存媒介
我们关心某个文件中的内容,但是对文件本身的信息(如创建日期、权限、大小)等也感兴趣,这些信息成为file metadata,在VFS中用inode(index node)结构体表示,每个文件只有唯一的一个inode。
文件系统也有相应的描述信息,VFS中用superblock超级块结构体来表示。
目录在VFS中是一种特殊的文件,用dentry(directory entry)结构体来表示。
总的来说,VFS关心以下几种结构体:
The superblock object represents a specific
mounted filesystem.
The inode object represents a specific
The dentry object, which represents a
directory entry, is a single component of a path.
The file object represents an open file as
associated with a process.
注意这里的file指的不是文件系统中的某一个文件,而是在一个进程中打开的文件,可以想象成是文件描述符。一个文件可以被多个进程打开,从而有多个file结构体,但是inode只有一个。每当一个文件被一个进程打开就需要一个file的一个可能的原因是,假设多个进程都在读一个文件中的内容,若每个都有file结构,那每个进程读取的位置都可以不一样。
对上述这几种结构体的操作为:
The super_operations object contains the
methods that the kernel can invoke on a specific filesystem, such as
write_inode() and sync_fs()
The inode_operations object contains the
methods that the kernel can invoke on a specific file, such as create() and
The dentry_operations object contains the
methods that the kernel can invoke on a specific directory entry, such as
d_compare() and d_delete()
The file_operations object contains the
methods that a process can invoke on an open file, such as read() and write()
具体的结构体成员和操作函数就不列举了。
一个进程保存着已打开的文件和文件系统信息——files_struct,
fs_struct。
• 块设备
VFS是高层,这里再从底层讲起。VFS的下层是真实的文件系统,真实的文件系统下面是block IO层,接着下面是块设备驱动层,最下面是真实某种块设备。块设备是指可以随机读写访问,并且每次最小只能访问固定数量的数据。硬件的最小单位是扇区sector(通常512字节或更大)。
与字符设备的file_operations结构体一样,块设备对上层也有统一的接口,用block_device_operations结构体表示。对于内核来说,块设备只是一块块sector的数据,不同的文件系统对这些数据有着不同的操作方法。
块设备驱动要实现一个request的方法:
request(request_queue_t *queue);
每当需要对块设备进行读写等操作的时候就会调用这个方法,所以它是块设备操作的源头。每个块设备有一个request队列,为了提高块设备的有效性,每个读写操作的request都加入这个队列,并在队列中按一定算法进行reordering(比如将几个连续地址的间隔读操作request放在一起)。
这种reordering的算法称为block IO rescheduler(也有叫elevator的)。算法的一种思路是“deadline scheduler”,它为每个request设置deadline,在deadline之前必须完成;另一种思路是“anticipatory scheduler”,它假设对连续sector的操作紧接着当前的操作。
request是用一种叫bio的数据结构来描述的。也就是说,VFS或者某个文件系统要对块设备进行操作时,将该操作用bio来描述,bio包括了操作所需的相关信息。块IO层会对bio新建一个request或者合并到某一个现有的request中去。
• 页缓存
为避免频繁的磁盘访问,从而提出了页缓存。
页缓存的回写策略有:
若写,则直接写磁盘,并标志页无效
若写,则不光写磁盘,而且写(更新)写,这个叫write-through
若写,则写页,不立即写磁盘,标记页为dirty(其实指的是磁盘上的数据为dirty),并将dirty的页放入dirty页list,周期性的回写至磁盘(相关的flusher内核线程来做),这个叫write-back
一个页(page)可以缓存多个磁盘上的block,因为一个page通常为4KB,磁盘上的一个block可能只有512B。一个文件在页缓存上的描述用struct address_space来表示。
详细查看mmap应用。
阅读(2139) | 评论(0) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
CPU寄存器保存着最常用的数据。
主存储器(简称主存)暂时存放存储在容量较大的、慢速磁盘上的数据。
高速缓存存储器作为一部分存储在主存中的数据和指令的缓冲区域。
访问周期由小到大:CPU&高速缓存&主存&磁盘
随机访问存储器(RAM)
其分为两类:
静态RAM(SRAM)
作为高速缓存存储器
可在CPU芯片上,也可以在芯片下
动态RAM(DRAM)
作为主存以及图形系统的帧缓冲区
SRAM比DRAM更快而且贵。
其将每个位存储在一个双稳态的存储器单元里。每个单元是用一个六晶体管电路来实现的。
六晶体管电路的属性:它可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都不稳定的。可通过p383的倒转的钟摆进行理解。
原则上钟摆可以在垂直的为止无限期地保持平衡,但这种状态是亚稳态,最细微的扰动都可以破坏它的平衡,而且一旦破坏就无法恢复到垂直的位置。
DRAM将每个位存储为对一个电容的充电。该电容大小非常小,通常大约为30x10-15法拉。
DRAM对干扰非常敏感。当电容的电压被扰乱后,它就永远不会恢复了。
暴露在光线下会导致电容电压改变。
数码相机的传感器本质就是DRAM单元的阵列。
两者的对比
供电状态下,SRAM保持不变,而DRAM需要刷新。
存取速度方面,SRAM&DRAM
干扰敏感度方面,SRAM对诸如光和电噪声灯干扰不敏感
晶体管使用量方面,SRAM单元比DRAM单元使用更多的晶体管,从而密集度低,贵,功耗大。
传统的DRAM
DRAM芯片中的单元(位)被分成d个超单元,每个超单元都由w个DRAM单元组成。一个dxw的DRAM总共存储dw位信息。
超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元有形如(i,j)的抵制,这里i表示行,j表示列。
选择行(RAS请求) 选择列(CAS请求) 通过行列的选择读取一个超单元内容。
二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
存储器模块
DRAM芯片包装在存储器模块中,它是插到主板的扩展槽上的。
168个引脚的双列直插存储器模块,它以64位为块传送数据到存储器控制器和从存储器控制器传出数据
72个引脚的单列直插存储器模块,它以32位为块传送数据。
增强的DRAM
快页模式DRAM(FPM DRAM):允许对同一行连续地访问可以直接从行缓冲区得到服务。例如读第i行四个超单元,只需发送第一个RAS/CAS请求,后面跟着三个CAS请求即可。
扩展数据输出DRAM(EDO DRAM):允许单独的CAS信号在时间上靠得更紧密一点。
同步DRAM(SD DRAM):用于驱动存储器控制器相同的外部时钟信号的上升沿来替代许多这样的控制信号。
常规的、FPM和EDO DRAM与存储控制器通信使用一组异步的控制信号。
双倍数据速率同步DRAM(DDR SDRAM):对SDRAM的一种增强,通过使用两个时钟沿作为控制信号,从而时DRAM的速度翻倍。
按照预取缓冲区的大小来划分:DDR(2位),DDR2(4位),DDR3(8位)
Rambus DRAM(RDRAM):它的最大带宽比DDR SDRAM更高。
视频RAM(VRAM):用在图形系统的帧缓冲区中。
与FPM的区别:
VRAM的输出是通过依次对内部缓冲区的整个内容进行移位得到的。
VRAM允许对存储器并行地读和写。
非易失性存储器
易失:如果断点,DRAM和SRAM会丢失它们的信息。
非易失性存储器:即使在关电后,仍然保存着它们的信息。
ROM(只读存储器):Read-Only Memory,其中有些类型是既可以读也可以写的。
按照能够被重编程(写)的次数和对它们进行冲编辑所用的机制区分:
PROM:只能被编程一次。
可擦写可编程ROM(EPROM):允许光到达存储器,数量级可以达到1000次。
电子可擦除PROM(EEPROM):可以直接在印制电路卡上棉城,数量级可以达到10^5次。
闪存(flash memory):基于EEPROM重要的存储计数,例如数码相机、手机灯都运用到它。
固态硬盘(SSD):基于闪存的磁盘驱动器,能够提供相对于传统旋转磁盘更快速、更强健和更低能耗的选择。
存储在ROM设备中的程序成为固件
数据通过成为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。
总线是一组并行地导线,能够携带地址、数据和控制信号。
每次CPU和主存之间的数据传送通过总线事务来完成的。
读事务:从主存传送数据到CPU
写事务:从CPU传送数据到主存
磁盘驱动器(磁盘)是由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装里。
每个盘片都有两面或者成为表面,表面覆盖着磁性记录材料
每个表面都由一组磁道的同心圆组成。
每个磁道被划分为一组扇区,扇区之间用一些间隙分隔开。(间隙不存储数据位,而用来表示扇区的格式化位)
盘片中央由一个可以旋转的主轴,使得盘片以固定的旋转速率旋转。
磁盘制造商用柱面来描述多个盘片驱动器的构造。
旋转磁盘与固态磁盘是两种不同的工作方式
一个磁盘上可以记录的最大位数成为它的最大容量,简称容量。
由一下技术因素决定
计算公式: 磁盘容量=(字节数/扇区)(平均盘区数/磁道)(磁道数/表面)(表面数/盘片)(盘片数/磁盘)
对于与DRAM和SRAM容量相关的计量单位:K=2^10 M=2^20 G=2^30 T=2^40
对于磁盘和I/O设备容量相关的伎俩单位:k=10^3 M=10^6 G=10^9 T=10^12(字节)
磁盘用读/写头来读写存储在磁性表面的位
读写头连接到一个传动臂的一端来寻道
对扇区的访问时间由三个主要部分:p392
逻辑磁盘块
磁盘控制器:维护着逻辑块号和实际磁盘扇区之间的映射关系
当操作系统想要执行一个I/O操作时,操作系统会发送一个命令到磁盘控制器,让它读某个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)的三元组,该三元组唯一地表示了对应的物理扇区。
格式化容量比最大容量要小
连接到I/O设备
三个不同类型的设备连接到总线
通用串行总线(USB)
图形卡或适配器
主机总线适配器
插入主板上空的扩展槽进行使用,例如网络适配器
CPU使用存储器映射I/O技术来向I/O设备发出命令。
I/O端口:地址空间中有一块地址是为了与I/O设备通信保留的。
读取一个磁盘扇区的步骤
CPU同故宫将命令、逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读
磁盘控制器读扇区,并执行到主存的DMA传送
当DMA传送完成时,磁盘控制器用中断的方式通知CPU
一个SSD包由一个或多个闪存芯片和闪存翻译层组成。
闪存芯片对应传统旋转磁盘中的机械驱动器
闪存翻译器对应传统旋转磁盘中的磁盘控制器
一个闪存由B个块的序列组成
一个块由P页组成
页的大小是512~4KB
块由32~128页组成,大小为16~512KB
数据是以页为单位读写的。
SSD的优点:
由半导体存储器构成,没有移动的部件
随机访问时间比旋转磁盘快,能耗更低,同时结实
SSD的缺点:
反复写之后,闪存块会磨损。
SSD每字节比旋转磁盘贵大约100倍,因此常用的存储容量是旋转磁盘的1%
计算机程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
该倾向成为局部性原理。
局部性的两种不同形式:
时间局部性
空间局部性
步长为k的引用模式:每隔k个元素进行访问
步长为1的引用模式是程序中空间局部性常见和重要的来源。随着步长的增加,空间局部性下降。
重复引用同一个变量的程序有良好的时间局部性。
对于取指令来说,循环有号的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
存储器层次结构p405
存储技术:不同的存储技术的访问时间差异很大
计算机软件:一个编写良好的程序倾向于展示处良好的局部性
存储器层次结构:硬件和软件的基础属性互相补充的完美,使人想到一种组织存储器系统的方法。
存储器层次结构中的缓存
高速缓存(cash)是一个小而快速的存储设备,使用高速缓存的过程成为缓存
最小的缓存——CPU寄存器集合
数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝。
缓存命中:当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中的情况。
缓存不命中:第k层中没有缓存数据对象d的情况
强制性不命中或冷不命中:k层的缓存是空的——冷缓存
冲突不命中:限制性的放置策略引起的不命中
容量不命中:工作集的大小超过缓存的大小时。
替换或驱逐:替换一个现存的块的过程。
牺牲快:被驱逐的这块。
替换策略:控制决定该替换哪个块的策略
利用时间的局部性:由于时间局部性,同一数据对象可能会被多次使用。
利用空间的局部性:块通常包含有多个数据的对象。
高速缓存存储器
CPU寄存器文件和主存之间插入一个小的SRAM高速缓存存储器——L1高速缓存(一级缓存)
在L1高速缓存和主存之间插入一个更大的高速缓存——L2高速缓存
比L2更大的高速缓存——L3高速缓存
通用的高速缓存存储器结构
每个寄存器地址有m位,形成M=2^m个不同的抵制
高速缓存被组织成一个有S=2^s个高速缓存组的数组
每个组包含E个高速缓存行
每个行由一个B=2^b字节的数据块组成的
一个有效位指明这个行是否包含有意义的信息
t=m-(b+s)个标记位是当前块的存储器地址的位的子集
高速缓存的大小C:指的是所有块的大小的和,标记位和有效位不包含在内,C=S×E×B
直接映射高速缓存
E=1的高速缓存称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程:
如果缓存不命中,需要从存储器层次结构中的下一层取出被请求的块。然后将新的块存储在组索引位指示的组中的一个高速缓存行中。
组相联高速缓存
每个组都保存有多于一个的高速缓存行。
一个1&E&C/B的高速缓存通常称为E路组相联高速缓存。
它的组选择与直接映射高速缓存的组选择一样,组索引位标志组。
最不常使用(LFU)策略会替换在过去某个时间窗口内引用次数最少的那一行。
最近最少使用(LRU)策略会替换最后依次访问时间最久远那一行。
全相联高速缓存
由一个包含所有高速缓存行的组(E=C/B)组成的。
它只有一个组,地址中没有组索引位,地址只被划分成了一个标志和一个块偏移。
关于写的问题
如何更新w在层次结构中紧接着低一层中的拷贝:
直写:立即将w的高速缓存块写回到紧接着的低一层中。
写回:尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到紧接着的低一层中。
如何处理写不命中:
写分配:加载相应的低一层的块到高速缓存中,然后更新这个高速缓存块。写回高速缓存为写分配。
非写分配:避开高速缓存,直接把这个字写到低一层中。直写高速缓存为非写分配。
i-cache:只保存指令的高速缓存
d-cache:只保存程序数据的高速缓存
统一的高速缓存:保存指令和程序数据的高速缓存。
高速缓存参数的性能影响:
不命中率:不命中数量/引用数量
命中率:1-不命中率
命中时间:从高速缓存传送一个字到CPU所需的时间
不命中处罚:由于不命中所需要的额外的时间
较大的高速缓存可能会提高命中率,但使大存储器运行得更快总是要难一些。
较大的的块能利用程序中可能存在的空间局部性,帮助提高命中率。但会损害时间的局部性比空间局部性更好的程序中的命中率,并且传送时间会变长。
较高的相联度(E的值越大)能够降低高速缓存由于冲突不命中出现抖动的可能性。但也会产生造成较高的成本。
高速缓存越往下层,越可能使用写回而不是直写。
高速缓存行、组和块的区别p423
编写高速缓存友好的代码
让最常见的情况运行得快。
在每个循环内部缓存不命中数量最小。
高速缓存对程序性能的影响
读吞吐量(读带宽):一个程序从存储系统中读数据的速率
读带宽的时间和空间局部性的二维函数,称为存储器山
程序中利用局部性
将注意力集中在内循环上,大部分计算和存储器访问都发生在这里。
通过按照数据对象存储在存储器中的顺序、以步长为1的来读数据。从而使得程序中的空间局部性最大
一旦从存储器中读入一个数据对象,尽可能地使用它,从而使得程序中的时间局部性最大。
遇到的问题
对于存储器山的概念不是很明白,各条山脊线所表示的内容,步长的变化引起读吞吐量的变化也并未搞清楚。
希望通过再阅读相关内容来进行理解。
《Computer.Systems.A.Programmer's.》教材
《内存山介绍和图解析》
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
模块内容加载中...
近期我们开发的一个工具在调用c++ sort函数对数组进行排序时居然会导致进程崩溃,此问题细节我觉得对于类似我这种不常用stl的同学可能不容易觉察,这里简单总结下。 出错代码 因为代码太复杂不好展示,我这里就用下面这个简单的示例来描述。
不知你是否直觉上也会觉得这段代码没什么问题,但是这段代码运行后会core dump。查看core文件可以看到内存里的栈被写坏了,这说明sort调用导致了内存越界访问,在这么少的代码行下,不难判定应该是comp函数实现可能不符合c++标准库的某种规则(C++ STL是基于concept的设计和实现)。
在 C 语言 中可用的API:
支持Transport Stream传输流,该类文件扩展名包括.ts、.tp、.m2ts、.tod、.m2t、mts。TS中支持下述格式的视频、音频、字幕。 视频MPEG-1 Video:stream_type为0x01MPEG-2 Video:stream_type为0x02AVC(H264):stream_type为0x1bVC-1:stream_type为0xea音频Mpeg-1 Audio:stream_type为0x03Mpeg-2 Audio:stream_type为0x04Mpeg-2 AAC:stream_type为0x0fMpeg-4 AAC:stream_type为0x11LPCM:stream_type为0x80AC3:stream_type为0x81或0x06DTS:stream_type为0x82
Beanstalkd 是一个高性能的消息队列中间件,本博文宅鸟将介绍一下这个东东的使用。
一、先通过概念让大家了解Beanstalkd的特性和工作场景。
消息系统的作用:异步处理、削减峰值、减少组件之间的耦合。 选择消息系统根据业务需要需要考虑以下几个方面: 是否持久化吞吐能力高可用分布式扩展能力兼容现有协议易于维护其他,如消息丢失和重复的处理避免单点故障负载均衡 常见消息系统协议: STOMPAMQP类似 MEMCACHE 的协议HTTP自定格式 1、2 是不错的可选开源组件: 1. Kafka/MetaQ: 广泛用于 Linkedin 内部 (类似有 Java 版本的国产 MetaQ) 由于优先考虑吞吐,更加适合大数据量的消息收集和处理,比如日志分析、用户行为信息实时报表、集群状态信息收集和分析。 优先考虑持久化的设计,依靠 page cache 管理内存高吞吐 112MB/s 11K msgs/s (比 beanstalkd &70x 吞吐能力)
1. CURL 发送磁盘上面的JSON文件curl&-X&POST&&-H&'content-type:&application/json'&&-d&@myjsonfile.txt&http://some.url/param&&2. CURL在命令行直接发送JSON结构数据curl&-i&-H&'content-type:&application/json'&-X&POST&-d&'{\"screencast\":{\"subject\":\"tools\"}}'&http://localhost:3570/index.php&&3.CURL 上传附件
每次都搞不清这些开源许可证。收藏这张图。
乌克兰程序员Paul Bagwell,画了一张分析图,下面是阮一峰制作的中文版。
最近在研究Zookeeper Storm Kafka, 顺便在本地搭了一套集群, 遇到了Zookeeper日志问题输出路径的问题, 发现zookeeper设置log4j.properties不能解决日志路径问题, 发现解决方案如下: 1. 修改log4j.properties, 这个大家都应该会改, 红色加粗处是我修改的, 但是改了这边还是不生效 # Define some default values that can be overridden by system properties
专题直播:   日至15日,第七届移动互联网国际研讨会在北京国际会议中心隆重举行,本次大会以“4G移动互联网时代的创新与变革”为主题,围绕 4G网络技术及未来发展、虚拟运营商、移动互联网应用、信息安全、物联网、融合通信等产业热点展开。以下为中国移动通信研究院绿色通信技术研究中心C- RAN项目经理段然在“更软更绿的未来网络”分论坛发表演讲。
spawn-fcgi -a 127.0.0.1 -p 9000 -C 25 -f /var/www/cgi-bin/cgiServer -F 1
最后登录加载中...
this.p={b:2,ua:34, ub:'http://img.bimg.126.net/photo/hRG1YSugCC3V1wsBadp8AQ==/5624320.jpg',us:'他', friendstatus:'none',followstatus:'unFollow',hmcon:'0',aShowT:'0',guideId:6};
积分 ${data.totalScore} 分,距离下一等级还有 ${data.nextGradeNeedScore}分
我要留言 & &
& 留言列表加载中...
this.p={b:2,nv:false,cn:5,ct:5};
博友列表加载中...
this.p={b:2,m:0};
模块内容加载中...
模块内容加载中...
模块内容加载中...
模块内容加载中...
评论列表加载中...
this.p={b:2,bn:5,bt:5,pn:5,pt:5};
& & & & & &
网易公司版权所有&&
{list x.l as y}
{/list} {/list}
{if defined('wl')} {list wl as x}{/list} {/if}

我要回帖

 

随机推荐