当前位置: 首页 > news >正文

如何建立网站链接深圳最新消息公布

如何建立网站链接,深圳最新消息公布,静安建设机械网站,python怎么搭建网站Linux I/O 接口 Linux I/O 接口可以分为以下几种类型#xff1a; 文件 I/O 接口#xff1a;用于对文件进行读写操作的接口#xff0c;包括 open()、read()、write()、close()、lseek() 等。 网络 I/O 接口#xff1a;用于网络通信的接口#xff0c;包括 socket()、conne…Linux I/O 接口 Linux I/O 接口可以分为以下几种类型 文件 I/O 接口用于对文件进行读写操作的接口包括 open()、read()、write()、close()、lseek() 等。 网络 I/O 接口用于网络通信的接口包括 socket()、connect()、bind()、listen()、accept() 等。 设备 I/O 接口用于对设备e.g. 字符设备、块设备进行读写操作的接口包括 ioctl()、mmap()、select()、poll()、epoll() 等。 其他 I/O 接口如管道接口、共享内存接口、信号量接口等。 Linux I/O 处理流程 下面以最常用的 read() 和 write() 函数来介绍 Linux 的 I/O 处理流程。 read() 和 write() read() 和 write() 函数是最基本的文件 I/O 接口也可用于在 TCP Socket 中进行数据读写属于阻塞式 I/OBlocking I/O即如果没有可读数据或者对端的接收缓冲区已满则函数将一直等待直到有数据可读或者对端缓冲区可写。 函数原型 fd 参数指示 fd 文件描述符。 buf 参数指示 read/write 缓冲区的入口地址。 count 参数指示 read/write 数据的大小单位为 Byte。 函数返回值 返回实际 read/write 的字节数。 返回 0表示已到达文件末尾。 返回 -1表示操作失败可以通过 errno 全局变量来获取具体的错误码。 #include unistd.hssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); 处理流程 下面以同时涉及了 Storage I/O 和 Network I/O 的一次网络文件下载操作来展开 read() 和 write() 的处理流程。 read() 的处理流程 Application 调用 read()CPU 模式从用户态切换到内核态。 Kernel 根据 file fd 查表进程文件符表找到对应的 file 结构体普通文件从而找到此文件的 inode 编号。 Kernel 将 buf 和 count 参数、以及文件指针位置等信息传递给 Device Driver磁盘驱动程序。 Driver 将请求的数据从 Disk Device 中 DMA Copy 到 Kernel PageCache Buffer 中。 Kernel 将数据从 Kernel PageCache Buffer 中 CPU Copy 到 Userspace Buffer 中Application 不能直接访问 Kernel space。 read() 最终返回读取的字节数或错误代码给 ApplicationCPU 模式从内核态切换到用户态。 write() 的处理流程 Application 调用 write()CPU 模式从用户态切换到内核态。 Kernel 根据 socket fd 查表找到对应的 file 结构体套接字文件从而找到该 Socket 的 sock 结构体。 Kernel 将 buf 和 count 参数、以及文件指针位置等信息传递给 Device Driver网卡驱动程序。 Driver 将请求的数据从 Userspace Buffer 中 CPU Copy 到 Kernel Socket Buffer 中。 Kernel 将数据从 Kernel Socket Buffer 中 DMA Copy 到 NIC Device。 write() 最终返回写入的字节数或错误代码给 ApplicationCPU 模式从内核态切换到用户态。 可见在一次常规的 I/Oread/write操作流程中 处理流程中总共需要涉及到 4 次 CPU 模式切换当 Application 调用 SCI 时CPU 从用户态切换到内核态当 SCI 返回时CPU 从内核态切换回用户态。 2 次 CPU CopyCPU 执行进程数据拷贝指令将数据从 User Process 虚拟地址空间 Copy 到 Kernel 虚拟地址空间。 2 次 DMA CopyCPU 向 DMA 控制器下达设备数据拷贝指令将数据从 DMA 物理内存空间 Copy 到 Kernel 虚拟地址空间。 相关视频推荐 90分钟搞定底层网络IO模型linux开发必须要懂得10种模型 手写用户态协议栈以及零拷贝的实现 epoll的原理与使用epoll比select/poll强在哪里 免费学习地址c/c linux服务器开发/后台架构师 需要C/C Linux服务器架构师学习资料加qun812855908获取资料包括C/CLinuxgolang技术NginxZeroMQMySQLRedisfastdfsMongoDBZK流媒体CDNP2PK8SDockerTCP/IP协程DPDKffmpeg等免费分享 I/O 性能优化机制 I/O buff/cache Linux Kernel 为了提高 I/O 性能划分了一部分物理内存空间作为 I/O buff/cache也就是内核缓冲区。当 Kernel 接收到 read() / write() 等读写请求时首先会到 buff/cache 查找如果找到则立即返回。如果没有则通过驱动程序访问 I/O 外设。 查看 Linux 的 buff/cache $ free -mhtotal used free shared buff/cache available Mem: 7.6G 4.2G 2.9G 10M 547M 3.1G Swap: 4.0G 0B 4.0G 实际上Cache缓存和 Buffer缓冲从严格意义上讲是 2 个不同的概念Cache 侧重加速 “读”而 Buffer 侧重缓冲 “写”。但在很多场景中由于读写总是成对存在的所以并没有严格区分两者而是使用 buff/cache 来统一描述。 Page Cache Page Cache页缓存是最常用的 I/O Cache 技术以页为单位的内容就是磁盘上的物理块用于减少 Application 对 Storage 的 I/O 操作能够令 Application 对文件进行顺序读写的速度接近于对内存的读写速度。 页缓存读策略当 Application 发起一个 Read() 操作Kernel 首先会检查需要的数据是否在 Page Cache 中 如果在则直接从 Page Cache 中读取。 如果不在则按照原 I/O 路径从磁盘中读取。同时还会根据局部性原理进行文件预读即将已读数据随后的少数几个页面通常是三个一同缓存到 Page Cache 中。 页缓存写策略当 Application 发起一个 write() 操作Kernel 首先会将数据写到 Page Cache然后方法返回即Write back写回机制区别于 Write Through写穿。此时数据还没有真正的写入到文件中去Kernel 仅仅将已写入到 Page Cache 的这一个页面标记为 “脏页Dirty Page”并加入到脏页链表中。然后由 flusherpdflushPage Dirty Flushkernel thread回写内核线程周期性地将脏页链表中的页写到磁盘并清理 “脏页” 标识。在以下 3 种情况下脏页会被写回磁盘 当空闲内存低于一个特定的阈值时内核必须将脏页写回磁盘以便释放内存。 当脏页在内存中驻留时间超过一个特定的阈值时内核必须将超时的脏页写回磁盘。 当 Application 主动调用 sync、fsync、fdatasync 等 SCI 时内核会执行相应的写回操作。 flusher 刷新策略由以下几个内核参数决定数值单位均为 1/100 秒 # flush 每隔 5 秒执行一次 $ sysctl vm.dirty_writeback_centisecs vm.dirty_writeback_centisecs 500# 内存中驻留 30 秒以上的脏数据将由 flush 在下一次执行时写入磁盘 $ sysctl vm.dirty_expire_centisecs vm.dirty_expire_centisecs 3000# 若脏页占总物理内存 10 以上则触发 flush 把脏数据写回磁盘 $ sysctl vm.dirty_background_ratio vm.dirty_background_ratio 10 综上可见Page Cache 技术在理想的情况下可以在一次 Storage I/O 的流程中减少 2 次 DMA Copy 操作不直接访问磁盘。 Buffered I/O 下图展示了一个 C 程序通过 stdio 库中的 printf() 或 fputc() 等输出函数来执行数据写入的操作处理流程。过程中涉及到了多处 I/O Buffer 的实现 stdio buffer在 Userspace 实现的 Buffer因为 SCI 的成本昂贵所以Userspace Buffer 用于 “积累“ 到更多的待写入数据然后再通过一次 SCI 来完成真正的写入。另外stdio 也支持 fflush() 强制刷新函数。 Kernel buffer cache处理包括上文以及提到的 Page Cache 技术之外磁盘设备驱动程序也提供块级别的 Buffer 技术用于 “积累“ 更多的文件系统元数据和磁盘块数据然后在合适的时机完成真正的写入。 零拷贝技术Zero-Copy 零拷贝技术Zero-Copy是通过尽量避免在 I/O 处理流程中使用 CPU Copy 和 DMA Copy 的技术。实际上零拷贝并非真正做到了没有任何拷贝动作它更多是一种优化的思想。 下列表格从 CPU Copy 次数、DMA Copy 次数以及 SCI 次数这 3 个方面来对比了几种常见的零拷贝技术。可以看见2 次 DMA Copy 是不可避免的因为 DMA 是外设 I/O 的基本行为。零拷贝技术主要从减少 CPU Copy 和 CPU 模式切换这 2 个方面展开。 1、Userspace Direct I/O Userspace Direct I/O用户态直接 I/O技术的底层原理由 Kernel space 中的 ZONE_DMA 支持。ZONE_DMA 是一块 Kernel 和 User Process 都可以直接访问的 I/O 外设 DMA 物理内存空间。基于此 Application 可以直接读写 I/O 外设而 Kernel 只会辅助执行必要的虚拟存储配置工作不直接参与数据传输。因此该技术可以减少 2 次 CPU Copy。 Userspace Direct I/O 的缺点 由于旁路了 要求 Kernel buffer cache 优化就需要 Application 自身实现 Buffer Cache 机制称为自缓存应用程序例如数据库管理系统。 由于 Application 直接访问 I/O 外设会导致 CPU 阻塞浪费 CPU 资源这个问题需要结合异步 I/O 技术来规避。 具体流程看下图Using Direct I/O with DMA 2、mmap() write() mmap() SCI 用于将 I/O 外设e.g. 磁盘中的一个文件、或一段内存空间e.g. Kernel Buffer Cache直接映射到 User Process 虚拟地址空间中的 Memory Mapping Segment然后 User Process 就可以通过指针的方式来直接访问这一段内存而不必再调用传统的 read() / write() SCI。 申请空间函数原型 addr 参数分配 MMS 映射区的入口地址由 Kernel 指定调用时传入 NULL。 length 参数指示 MMS 映射区的大小。 prot 参数指示 MMS 映射区的权限可选PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE 类型。 flags 参数标志位参数可选 MAP_SHARED映射区所做的修改会反映到物理设备磁盘上。 MAP_PRIVATE映射区所做的修改不会反映到物理设备上。 fd 参数指示 MMS 映射区的文件描述符。 offset 参数指示映射文件的偏移量为 4k 的整数倍可以映射整个文件也可以只映射一部分内容。 函数返回值 成功更新 addr 入口地址。 失败更新 MAP_FAILED 宏。 void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset); 释放空间函数原型 addr 参数分配 MMS 映射区的入口地址由 Kernel 指定调用时传入 NULL。 length 参数指示 MMS 映射区的大小。 函数返回值 成功返回 0。 失败返回 -1。 int munmap(void *addr, size_t length) 可见mmap() 是一种高效的 I/O 方式。通过 mmap() 和 write() 结合的方式可以实现一定程度的零拷贝优化。 // 读 buf mmap(diskfd, len); // 写 write(sockfd, buf, len); mmap() write() 的 I/O 处理流程如下。 mmap() 映射 Application 发起 mmap() 调用进行文件操作CPU 模式从用户态切换到内核态。 mmap() 将指定的 Kernel Buffer Cache 空间映射到 Application 虚拟地址空间。 mmap() 返回CPU 模式从内核态切换到用户态。 在 Application 后续的文件访问中如果出现 Page Cache Miss则触发缺页异常并执行 Page Cache 机制。通过已经建立好的映射关系只使用一次 DMA Copy 就将文件数据从磁盘拷贝到 Application User Buffer 中。 write() 写入 Application 发起 write() 调用CPU 模式从用户态切换到内核态。 由于此时 Application User Buffer 和 Kernel Buffer Cache 的数据是一致的所以直接从 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer并最终从 NIC 发出。 write() 返回CPU 模式从内核态切换到用户态。 可见mmap() write() 的 I/O 处理流程减少了一次 CPU Copy但没有减少 CPU 模式切换的次数。另外由于 mmap() 的进程间共享特性非常适用于共享大文件的 I/O 场景。 mmap() write() 的缺点当 mmap 映射一个文件时如果这个文件被另一个进程所截获那么 write 系统调用会因为访问非法地址被 SIGBUS 信号终止SIGBUS 默认会杀死进程并产生一个 coredump。解决这个问题通常需要使用文件租借锁实现。在 mmap 之前加锁操作完之后解锁。即首先为文件申请一个租借锁当其他进程想要截断这个文件时内核会发送一个实时的 RT_SIGNAL_LEASE 信号告诉当前进程有进程在试图破坏文件这样 write 在被 SIGBUS 杀死之前会被中断返回已经写入的字节数并设置 errno 为 success。 3、sendfile() Linux Kernel 从 v2.1 开始引入了 sendfile()用于在 Kernel space 中将一个 in_fd 的内容复制到另一个 out_fd 中数据无需经过 Userspace所以应用在 I/O 流程中可以减少一次 CPU Copy。同时sendfile() 比 mmap() 方式更具安全性。 函数原型 out_fd 参数目标文件描述符数据输入文件。 in_fd 参数源文件描述符数据输出文件。该文件必须是可以 mmap 的。 offset 参数指定从源文件的哪个位置开始读取数据若不需要指定传递一个 NULL。 count 参数指定要发送的数据字节数。 函数返回值 成功返回复制的字节数。 失败返回 -1并设置 errno 全局变量来指示错误类型。 #include sys/sendfile.hssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfile() 处理流程 Application 调用 sendfile()CPU 从用户态切换到内核态。 Kernel 将数据通过 DMA Copy 从磁盘设备写入 Kernel Buffer Cache。 Kernel 将数据从 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer。 Kernel 将数据从 Kernel Socket Buffer 中 DMA Copy 到 I/O 网卡设备。 sendfile() 返回CPU 从内核态切换到用户态。 4、sendfile() DMA Gather Copy 上文知道 sendfile() 还具有一次 CPU Copy通过结合 DMA Gather Copy 技术可以进一步优化它。 DMA Gather Copy 技术底层有 I/O 外设的 DMA Controller 提供的 Gather 功能支撑所以又称为 “DMA 硬件辅助的 sendfile()“。借助硬件设备的帮助在数据从 Kernel Buffer Cache 到 Kernel Socket Buffer 之间并不会真正的数据拷贝而是仅拷贝了缓冲区描述符fd size。待完成后DMA Controller可以根据这些缓冲区描述符找到依旧存储在 Kernel Buffer Cache 中的数据并进行 DMA Copy。 显然DMA Gather Copy 技术依旧是 ZONE_DMA 物理内存空间共享性的一个应用场景。 sendfile() DMA Gather Copy 的处理流程 Application 调用 sendfile()CPU 从用户态切换到内核态模式。 Kernel 将数据通过 DMA Copy 从磁盘设备写入 Kernel Buffer Cache。 Kernel 将数据的缓冲区描述符从 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer几乎不费资源。 基于缓冲区描述符CPU 利用 DMA Controller 的 Gather / Scatter 操作直接批量地将数据从 Kernel Buffer Cache 中 DMA Copy 到网卡设备。 sendfile() 返回CPU 从内核态切换到用户态。 5、splice() splice() 与 sendfile() 的处理流程类似但数据传输方式有本质不同。 sendfile() 的传输方式是 CPU Copy且具有数据大小限制 splice() 的传输方式是 Pipeline打破了数据范围的限制。但也要求 2 个 fd 中至少有一个必须是管道设备类型。 函数原型 fd_in 参数源文件描述符数据输出文件。 off_in 参数输出偏移量指针表示从源文件描述符的哪个位置开始读取数据。 fd_out 参数目标文件描述符数据输入文件。 off_out 参数输入偏移量指针表示从目标文件描述符的哪个位置开始写入数据。 len 参数指示要传输的数据长度。 flags控制数据传输的行为的标志位。 #define _GNU_SOURCE /* See feature_test_macros(7) */#include fcntl.hssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags); splice() 的处理流程如下 Application 调用 splice()CPU 从用户态切换到内核态。 Kernel 将数据通过 DMA Copy 从磁盘设备写入 Kernel Buffer Cache。 Kernel 在 Kernel Buffer Cache 和 Kernel Socket Buffer 之间建立 Pipeline 传输。 Kernel 将数据从 Kernel Socket Buffer 中 DMA Copy 到 I/O 网卡设备。 splice() 返回CPU 从内核态切换到用户态。 6、缓冲区共享技术 缓冲区共享技术是对 Linux I/O 的一种颠覆所以往往需要由 Application 和设备来共同实现。 其核心思想是每个 Applications 都维护着一个 Buffer Pool并且这个 Buffer Pool 可以同时映射到 Kernel 虚拟地址空间这样 Userspace 和 Kernel space 就拥有了一块共享的空间。以此来规避掉 CPU Copy 的行为。
http://www.w-s-a.com/news/84504/

相关文章:

  • 公司网站建设维保协议wordpress会员可看
  • 合肥百度网站排名优化深圳集团网站开发公司
  • 可以直接打开网站的方法手机回收站
  • 山西免费网站制作中天建设集团有限公司第九建设公司
  • 好的网站有哪些企业微信开发者工具
  • 网站通栏代码老外做的中国汉字网站
  • 东莞公司建站哪个更便宜wordpress宝塔伪静态
  • 六安网站建设价格做网站好吗
  • 中小企业网站建设咨询湖南省邵阳建设局网站
  • 分类网站一天做几条合适南安网络推广
  • 案例学 网页设计与网站建设百度竞价关键词出价技巧
  • 做公司网站要那些资料南雄网站建设
  • 自己做的网站发布到网上视频播放不了网页游戏奥奇传说
  • 网站效果用什么软件做品牌网站建设等高端服务
  • 四川省成华区建设局网站网站专业制作
  • 网站建设如何开票网站后台怎么做超链接
  • 教育网站设计方案建设网站技术公司电话号码
  • 建网站要定制还是第三方系统传奇网站模板psd
  • 免费搭建企业网站什么叫网站定位
  • 网站建设cms程序员培训班
  • 网站seo技术wordpress editor ios
  • 红酒网站设计成立公司需要哪些手续
  • 广州做网站哪个好网站建网站建设网站站网站
  • 如何快速提升网站pr短剧个人主页简介模板
  • 上海网站建设 永灿百度权重3的网站值多少
  • 公司展示网站模板模板工
  • 网站建设收费详情舟山公司做网站
  • 深圳宝安区住房和建设局网站html模板大全
  • 和田哪里有做网站的地方wordpress地址更改
  • 恒通建设集团有限公司网站企业网站百度指数多少算竞争大