<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lingsheng_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lingsheng_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lingsheng_]]></copyright><item><title><![CDATA[字符设备和块设备的区别]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122179469</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122179469</guid><author>lingsheng_</author><pubDate>Mon, 27 Dec 2021 20:04:35 +0800</pubDate><description><![CDATA[设备文件分为Block Device Driver和Character Device Drive两类。Character Device Drive又被称为字符设备或裸设备raw devices; Block Device Driver通常成为块设备。而Block Device Driver是以固定大小长度来传送转移资料 ；Character Device Driver是以不定长度的字元传送资料 。且所连接的Devices也有所不同，Block Device大致是可以随机存取(Random Access)资料]]></description><category></category></item><item><title><![CDATA[[Linux性能调优] 磁盘I/O队列调度策略]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122170803</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122170803</guid><author>lingsheng_</author><pubDate>Mon, 27 Dec 2021 14:04:14 +0800</pubDate><description><![CDATA[傻瓜化说明

简单地说，对于磁盘I/O，Linux提供了cfq, deadline和noop三种调度策略

cfq: 这个名字是Complete Fairness Queueing的缩写，它是一个复杂的调度策略，按进程创建多个队列，试图保持对多个进程的公平（这就没考虑读操作和写操作的不同耗时）
	deadline: 这个策略比较简单，只分了读和写两个队列（这显然会加速读取量比较大的系统），叫这个名字是内核为每个I/O操作都给出了一个超时时间
	noop: 这个策略最简单，只有单个队列，只有一些简单合并操作
]]></description><category></category></item><item><title><![CDATA[操作系统——读者写者问题]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122170567</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122170567</guid><author>lingsheng_</author><pubDate>Mon, 27 Dec 2021 13:55:30 +0800</pubDate><description><![CDATA[一、问题描述



要求：

1、允许多个读者可以同时对文件执行读操作。

2、只允许一个写者往文件中写信息。

3、任一写者在完成写操作之前不允许其他读者或写者工作。

4、写者执行写操作前，应让已有的读者和写者全部退出。

二、问题分析



读者写者问题最核心的问题是如何处理多个读者可以同时对文件的读操作。

三、如何实现




semaphore rw = 1;   //实现对文件的互斥访问
int count = 0;
semaphore mutex = 1;//实现对count变量的互斥访..]]></description><category></category></item><item><title><![CDATA[写时复制技术（COW）]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122170344</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122170344</guid><author>lingsheng_</author><pubDate>Mon, 27 Dec 2021 13:47:45 +0800</pubDate><description><![CDATA[写入时复制(Copy-on-write)是一个被使用在程序设计领域的最佳化策略。其基础的观念是，如果有多个呼叫者(callers)同时要求相同资源，他们会共同取得相同的指标指向相同的资源，直到某个呼叫者(caller)尝试修改资源时，系统才会真正复制一个副本(private copy)给该呼叫者，以避免被修改的资源被直接察觉到，这过程对其他的呼叫只都是通透的。此作法主要的优点是如果呼叫者并没有修改该资源，就不会有副本(private copy)被建立。


第一代Unix系统实现了一种傻瓜式的进程创建：当.]]></description><category></category></item><item><title><![CDATA[网络七层协议的形象说明]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122149267</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122149267</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 21:51:14 +0800</pubDate><description><![CDATA[第一层，物理层
OSI模型最低层的“劳苦大众”。它透明地传输比特流，就是传输的信号。该层上的设备包括集线器、发送器、接收器、电缆、连接器和中继器。
第二层，数据链路层
这一层是和包结构和字段打交道的和事佬。一方面接收来自网络层（第三层）的数据帧并为物理层封装这些帧；另一方面数据链路层把来自物理层的原始数据比特封装到网络层的帧中。起着重要的中介作用。
数据链路层由IEEE802规划改进为包含两个子层：介质访问控制（MAC）和逻辑链路控制（LLC）。
智能集线器、网桥和网络接口卡（NIC）等就驻扎在这一层。但.]]></description><category></category></item><item><title><![CDATA[从硬盘开始，一步步认识linux的文件系统]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122147919</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122147919</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 20:04:53 +0800</pubDate><description><![CDATA[Linux上的文件系统一般来说就是EXT2或EXT3，但这篇文章并不准备一上来就直接讲它们，而希望结合Linux操作系统并从文件系统建立的基础——硬盘开始，一步步认识Linux的文件系统。

1.机械硬盘的物理存储机制

现代计算机大部分文件存储功能都是由机械硬盘这种设备提供的。（现在的SSD和闪存从概念和逻辑上都部分继承自机械硬盘，所以使用机械硬盘来进行理解也是没有问题的）

机械硬盘能实现信息存储的功能基于：磁性存储介质能够被磁化，且磁化后会长久保留被磁化的状态，这种被磁化状态能够被读取出来，同时这种磁]]></description><category></category></item><item><title><![CDATA[在linux文本流中，如何使用管道连接多个进程？]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122145514</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122145514</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 16:48:27 +0800</pubDate><description><![CDATA[我们在Linux信号基础中已经说明，信号可以看作一种粗糙的进程间通信(IPC, interprocess communication)的方式，用以向进程封闭的内存空间传递信息。为了让进程间传递更多的信息量，我们需要其他的进程间通信方式。这些进程间通信方式可以分为两种:

管道(PIPE)机制。我们提到可以使用管道将一个进程的输出和另一个进程的输入连接起来，从而利用文件操作API来管理进程间通信。在shell中，我们经常利用管道将多个进程连接在一起，从而让各个进程协作，实现复杂的功能。
	传统IPC (int]]></description><category></category></item><item><title><![CDATA[linux系统中文件和目录的访问许可权限是什么]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122144531</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122144531</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 15:51:51 +0800</pubDate><description><![CDATA[一些重要的Page指令

虽然Page公开了很多属性，让我们可以在运行时调整它的状态与行为，但是，还有些重要的参数却是以“指令”方式提供的，需要在设计时就指定。
下面是我整理的一些我认为 比较重要并且经常需要使用 的指令：

@ Page 指令
		Async
			指示页面要不要以异步页的方式运行。默认值为 false。
			注意：如果需要开发一个异步页，必须要设置这个指令属性，以便在编译页面时实现IHttpAsyncHandler接口。
		AsyncTimeOut
			定义在处理异步任务时使用的超]]></description><category></category></item><item><title><![CDATA[Linux文件夹文件创建、删除]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122142732</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122142732</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 13:57:04 +0800</pubDate><description><![CDATA[Linux删除文件夹命令

 linux删除目录很简单，很多人还是习惯用rmdir，不过一旦目录非空，就陷入深深的苦恼之中，现在使用rm -rf命令即可。
直接rm就可以了，不过要加两个参数-rf 即：rm -rf 目录名字

删除目录、文件 rm(remove)

功能说明：删除文件或目录。
语　　法：rm[-dfirv][--help][--version][文件或目录...]
补充说明：执行rm指令可删除文件或目录，如欲删除目录必须加上参数”-r”，否则预设仅会删除文件。
参　　数：
　-...]]></description><category></category></item><item><title><![CDATA[linux文件操作篇打开和关闭文件]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122142567</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122142567</guid><author>lingsheng_</author><pubDate>Sat, 25 Dec 2021 13:45:48 +0800</pubDate><description><![CDATA[2.1 打开文件和关闭文件


			
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;fcntl.h&gt;
			
			头文件
		int open(const char *pathname, int flags);
			打开一个文件
		intclose(int fildes);
			关闭一个文件
		




1.打开文件


int open(const char *pathname, int f..]]></description><category></category></item><item><title><![CDATA[B树和B+树的插入、删除图文详解]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122131733</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122131733</guid><author>lingsheng_</author><pubDate>Fri, 24 Dec 2021 16:54:48 +0800</pubDate><description><![CDATA[1. B树

1. B树的定义

B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数，阶数表示了一个结点最多有多少个孩子结点，一般用字母m表示阶数。当m取2时，就是我们常见的二叉搜索树。

一颗m阶的B树定义如下：

1）每个结点最多有m-1个关键字。

2）根结点最少可以只有1个关键字。

3）非根结点至少有Math.ceil(m/2)-1个关键字。

4）每个结点中的关键字都按照从小到大的顺序排列，每个关键字的左子树中的所有关键字都小于它，而右子树中的所有关键字都大于它。

5）]]></description><category></category></item><item><title><![CDATA[Linux 内核空间与用户空间]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122129949</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122129949</guid><author>lingsheng_</author><pubDate>Fri, 24 Dec 2021 15:54:19 +0800</pubDate><description><![CDATA[对 32 位操作系统而言，它的寻址空间（虚拟地址空间，或叫线性地址空间）为 4G（2的32次方）。也就是说一个进程的最大地址空间为 4G。操作系统的核心是内核(kernel)，它独立于普通的应用程序，可以访问受保护的内存空间，也有访问底层硬件设备的所有权限。为了保证内核的安全，现在的操作系统一般都强制用户进程不能直接操作内核。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分，一部分为内核空间，另一部分为用户空间。针对 Linux 操作系统而言，最高的 1G 字节(从虚拟地址 0xC0000000 ]]></description><category></category></item><item><title><![CDATA[nodejs中的fs文件系统的使用方法及实例]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122127875</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122127875</guid><author>lingsheng_</author><pubDate>Fri, 24 Dec 2021 14:45:26 +0800</pubDate><description><![CDATA[在nodejs中，可以通过fs（file system）模块进行文件的I/O操作。

下面进行fs文件系统的使用实例：

1、模块调用声明：


var fs= require('fs');


 var path = require('path');

fs为文件模块，path为系统路径模块。

2、可以使用writeFile方法，将数据写入文件到某个文件夹下。

fs.writeFile(filename, data, [options], callback)

filename为具体的文件保存路径地.]]></description><category></category></item><item><title><![CDATA[linux内核数据结构之kfifo]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122126430</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122126430</guid><author>lingsheng_</author><pubDate>Fri, 24 Dec 2021 13:51:02 +0800</pubDate><description><![CDATA[1、前言

　　最近项目中用到一个环形缓冲区（ring buffer），代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到，通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B，进程B需要对进程A传的数据进行处理并写入文件，如果B没有处理完，则A要延迟发送。为了保证进程A减少等待时间，可以在A和B之间采用一个缓冲区，A每次将数据存放在缓冲区中，B每次冲缓冲区中取。这是典型的生产者和消费者模型，缓冲区中数据满足FIFO特性，因此可以采用队列进行实现。Lin]]></description><category></category></item><item><title><![CDATA[细说文件读写操作（读写锁）]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122126205</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122126205</guid><author>lingsheng_</author><pubDate>Fri, 24 Dec 2021 13:39:32 +0800</pubDate><description><![CDATA[开发过程中，我们玩玩需要大量与文件交互，读文件，写文件已成家常便饭，本地运行完美，但一上到投产环境，往往会出现很多令人措手不及的意外，或开发中的烦恼，因此，我对普通的C#文件操作做了一次总结，问题大部分如下：

1：写入一些内容到某个文件中，在另一个进程/线程/后续操作中要读取文件内容的时候报异常，提示System.IO.IOException: 文件“XXX”正由另一进程使用，因此该进程无法访问此文件。

2：在对一个文件进行一些操作后（读/写），随后想追加依然报System.IO.IOExcepti..]]></description><category></category></item><item><title><![CDATA[分布式缓存架构示例参考资料分享总结]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122117849</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122117849</guid><author>lingsheng_</author><pubDate>Thu, 23 Dec 2021 22:23:21 +0800</pubDate><description><![CDATA[一、linux系统将设备分为3类：字符设备、块设备、网络设备。使用驱动程序：



1、字符设备：是指只能一个字节一个字节读写的设备，不能随机读取设备内存中的某一数据，读取数据需要按照先后数据。字符设备是面向流的设备，常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
2、块设备：是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。

　　每一个字符设备或块设备都在/dev目录下对应一个设备文件。linux用户程序通过设备文件（或称设备节点）来使用驱动程序操作字符设备]]></description><category></category></item><item><title><![CDATA[浅谈wpf中的路由事件]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122110779</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122110779</guid><author>lingsheng_</author><pubDate>Thu, 23 Dec 2021 16:26:49 +0800</pubDate><description><![CDATA[路由事件简介

　　谈到路由事件，我想首先我们就需要问自己一个问题。在.net已经支持事件的情况下，为什么WPF还额外提供了对路由事件的支持？这是因为在WPF开发模型下，原始的CLR事件已经不能满足开发的要求，从而导致对事件的处理异常繁琐：

　　首先就是控件的封装。WPF中，我们可以将一个控件作为另一个控件的子控件，从而呈现丰富的效果。例如我们可以在一个Button中包含一个图像。在这种情况下，对图像的点击实际上应该是对按钮的点击。正因为如此，我们期望真正触发被点击事件的控件是Button，而不是嵌在其中]]></description><category></category></item><item><title><![CDATA[缓存在分布式应用：缓存架构示例参考资料分享总结]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122109281</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122109281</guid><author>lingsheng_</author><pubDate>Thu, 23 Dec 2021 15:42:38 +0800</pubDate><description><![CDATA[缓存是分布式系统中的重要组件，主要解决高并发，大数据场景下，热点数据访问的性能问题。提供高性能的数据快速访问。

本文是缓存在分布式应用第二篇文章，介绍分布式缓存，Memcache，Redis，本地缓存（硬盘缓存，内存缓存）以及缓存在分布式系统中的架构示例。本文主要是自己的学习总结和网络文章摘录，供学习之用。

本次分享大纲

缓存概述
	CDN缓存
	反向代理缓存
	分布式缓存
	本地缓存
	缓存架构示例
	参考资料
	分享总结
四、分布式缓存

CDN,反向代理缓存，主要解决静态文件，或用户请求资源的缓]]></description><category></category></item><item><title><![CDATA[cpu高速缓存（cachememory）与多级缓存一致性协议]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122106748</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122106748</guid><author>lingsheng_</author><pubDate>Thu, 23 Dec 2021 14:33:41 +0800</pubDate><description><![CDATA[CPU高速缓存（Cache Memory）

CPU为何要有高速缓存

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展，然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题，CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。

在CPU访问存储设备时，无论是存取数据抑或存取指令，都趋于聚集在一片连续的区域中，这就被称为局部性原理。


时间局部性（Temporal Locali]]></description><category></category></item><item><title><![CDATA[提高程序性能、何为缓存——从存储器结构说起]]></title><link>https://blog.youkuaiyun.com/lingsheng_/article/details/122105828</link><guid>https://blog.youkuaiyun.com/lingsheng_/article/details/122105828</guid><author>lingsheng_</author><pubDate>Thu, 23 Dec 2021 14:07:35 +0800</pubDate><description><![CDATA[存储器层次结构

我们知道，计算机里的存储器有:硬盘、主存、高速缓存（其中又有一级高速缓存、二级高速缓存等等）、在往上就是寄存器。

存储器在计算机内部的组织方式如下图所示：



相信上图大家并不陌生。wiki对The memory hierarchy 的介绍的时候也有此图。

我们发现，越往上，存储器的容量越小、成本越高、速度越快。

为什么会出现这样的结构呢？早起的存储器层次结构只有三层：cpu寄存器、DRAM主存以及磁盘存储。

由于CPU和主存之间巨大的速度差异，系统设计者被迫在CPU寄存器和主存]]></description><category></category></item></channel></rss>