摘要:1. 规范 根据规范,我们使用 - 表示 option,option后面可以加关联值arg wc -l 为了遵守该规则,linux提供了getopt getopt_long函数 2. getopt int getopt(int argc, char * const argv[], const cha
阅读全文
摘要:1. 匿名内存映射 p = mmap(NULL, 512*1024, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 在有些unix系统没有 MAP_ANONYMOUS ,则通过 /dev/zero 实现映射。 1.1 匿名内
阅读全文
摘要:1. 设备节点 设备节点是应用程序与设备驱动交互的特殊文件。 当应用程序在设备节点上进行一个 IO操作(如open close write read)时,内核将请求转发给设备驱动, 设备驱动处理IO操作,并向用户返回结果。 设备节点提供设备抽象,使应用程序不必了解特定设备或特殊接口。 设备节点是un
阅读全文
摘要:1.线程是什么? 1.1 线程和进程 进程:二进制程序的抽象,包括:加载的二进制程序,虚拟内存,内核资源(如打开的文件),关联用户等 线程:进程内的执行单元,包括:虚拟处理器,堆栈,程序状态。 进程是运行的二进制程序,线程是操作系统调度器可以调度的最小单元 1.2 虚拟内存和虚拟处理器 现代os包括
阅读全文
摘要:1. 进程调度 进程调度是内核子系统,用于将有限的处理器使用时间资源分配给各个进程,决定哪些进程可以运行及运行多久。 调度的目标: *最大化cpu利用率 尽可能提高系统交互响应速度 让每个进程都能被运行 2. 调度分类 协同式:进程自己主动放弃运行,让其他进程运行 抢占式:调度程序决定何时停止一个进
阅读全文
摘要:1. 前言 进程只运行的程序,由汇编语言,数据,资源,状态,虚拟计算机组成。 unix将运行程序分为 创建进程fork,加载二进制exec 1. exec 将二进制程序加载到内存,并开始新程序的执行。 一次成功的exec 会对进程有如下改变: 改变地址空间和进程映像 任何未决信号丢失 进程捕捉信号回
阅读全文
摘要:1. 为什么需要IO调度 由于cpu和磁盘的操作周期差 500万倍以上,所以若按照发出IO请求的顺序将IO请求传送给磁盘,效率将非常低, 所以内核会实现IO调度,调整IO请求顺序及时间,以减少磁盘查询次数和大小。 以尽可能降低磁盘访问对系统性能所造成的影响。 2. 磁盘寻址 磁盘虽然使用多级寻址,但
阅读全文
摘要:1. 什么是提供建议 通过 madvise() ,进程可以给内核提供建议,以提高文件IO性能。 2. 对映射用法提供建议 int madvise(void *addr, size_t len , int advice); @len : 若为0,则建议会应用到addr开始的整个映射。 @advice:
阅读全文
摘要:1. 什么是文件映射 将文件加载到页缓存,并将页缓存映射到用户虚拟空间,让应用程序直接访问页缓存。 2. api void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(
阅读全文
摘要:1. 为什么需要epoll select和poll的特点是:用户给内核一张 需要查看的文件描述符表,内核必须处理表中的每一个文件描述符,当这个表变大时,程序性能降低。 epoll将事件监视器的注册和事件监视工作分离,以避开这个问题。 2. api // @size : 用于提示内核要监控的文件描述符
阅读全文
摘要:1. 为什么需要向量IO 性能: 比较于线性IO,向量IO除了可以减少系统调用次数,还可以经内部优化提供性能改善 原子性: 进程可以单次向量IO,不会有与另一个进程操作交叉在一起的风险。 2. 使用说明 ssize_t readv(int fd, const struct iovec *iov, i
阅读全文
摘要:1. 写文件的互斥 不论是 多线程,多进程,同时写一个文件,在数据写入 页缓存时,都是原子的, 如进程a 写入 "aaaa" 进程b 写入 "bbbb",则内核可能会将 "aaaa" 完整的写入 页缓存,在将完整的 "bbbb" 写入页缓存, 不会出现 "aa" "bbbb" "aa" 的情况。 相
阅读全文
摘要:1.目的 验证 页缓存 和 写回机制 2.方法 分别用 write,mmap 写入文件,写入后进行sleep,用cat命令查看文件是否有数据,然后断电,重启后查看文件是否有数据。 为了方便测试将 回写时间阈值调整为 50000ms echo 50000 > /proc/sys/vm/dirty_wr
阅读全文
摘要:1. 思想 若要观察5个水管的出水情况,可以让五个人分别守着,也可以用安装监控,只需要一个人观察监控。 有了多路IO,编程思路大致如下: 设置需要监控的IO 睡眠 唤醒 处理可进行的IO 回到步骤1 linux 为 多路IO提供了3中机制:select, poll, epoll 2. select
阅读全文
摘要:1. 为什么需要缓冲IO 因为所有磁盘操作都 用 块 作为基本操作单位,所以IO要求数据大小 对齐块。 比如,应用程序 写 4.5个块大小的数据,则内核会 写5个块大小数据,读取最后一个块数据,更新(删除)后半部分数据,然后再将整个块写出去,所以若内核一定会保证所有操作都在 块大小整数倍上进行,必要
阅读全文
摘要:1. 引言 设计IO的内核实现,主要是三个子系统:虚拟文件系统,页面缓存,页面写回。 2. 虚拟文件系统 虚拟文件系统,也称为 虚拟文件切换系统(virtual file switch),让linux内核在调用文件系统函数时,不需要知道所使用的具体文件系统。 VFS的好处很多:单一系统调用可以读取任
阅读全文
摘要:1.前言 1.1 为什么要浪费时间在简单的文件上 是的,文件的各种操作很具体简单,但是这是针对普通文件,由于linux设计思想是一切皆文件,所以文件IO被实现为支持很多对象的操作,总之重要的不是文件,而是文件IO。 1.2 概述 在用户层,一切文件IO都是基于fd,而fd是 task_struct
阅读全文
摘要:1. 从磁盘说起 1.1 读写磁盘数据 众所周知,磁盘读写是通过 盘面,磁道,扇区 3D寻址,用磁极 NS 表示 01 ,且通过接口指令(如SATA)完成共工作。当然这些都不重要,对用户层系统编程而言,只需要记住 磁盘读写是以 数据块为单位,且读写速度慢。 1.2 读写磁盘上文件 文件由两部分组成:
阅读全文