在没有写/读的情况下命名当前表示为buffer的文件是不可能的。因为在计算机中,文件是用来存储和读取数据的,而buffer是用来临时存储数据的一块内存区域。在没有进行读写操作的情况下,文件并不存在,因此也无法对其进行命名。命名文件是为了在文件系统中标识和访问文件,而在没有读写操作的情况下,文件并没有被创建或存在,因此无法进行命名。
这个数组用于存储管道的两个文件描述符:pipefd[0]表示管道的读端,而pipefd[1]表示管道的写端。...管道中没有数据时,读端继续读取的默认行为是阻塞当前正在读取的进程。...最后就会读到返回值为0,表示读结束,类似读到了文件的结尾 读端关闭其文件描述符并且不再读取数据时,如果写端继续向管道写入数据,操作系统会发送一个SIGPIPE信号给写端进程。...默认情况下,这个信号会终止写端进程。SIGPIPE信号是一个用于处理管道写端在写操作时无读端接收的情况的信号。...这是一种保护机制,防止写端进程在没有读端的情况下无限期地等待或继续写入数据到一个不再被读取的管道中。
见一见管道文件 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 ---- mkfifo fifo 制作一个管道 ,并命名为 fifo 文件类型以p开头...文件的唯一性,使用路径表示的 让不同的进程通过文件路径+文件名看到同一个文件,并打开,就是看到了同一个资源 3..../fifo";//管道名字为当前路径创建的fifo mode_t mode=0666;//默认权限为0666 这样 server文件和client文件就会调用同一份文件路径了 server.cc 服务端...==0,说明读到文件结尾,当写端关闭时,读端才会读到文件结尾 若返回<0,说明读取失败,则返回错误码 3....<"client#"<<buffer<<endl; } else if(n==0)//读到文件结尾为0 { //写端关闭 cout
如下: 而 read 的返回值返回的是读到的数据大小,以字节为单位,当返回值为0时,父进程也就退出了循环,所以我们得出结论,读端正常读,写端关闭,读端就会读到0,表明读到了文件(pipe)结尾,不会被阻塞...命名管道 (1)命名管道的系统接口 上面我们学到的匿名管道是没有名字的,因为打开那个文件的时候并没有告诉我们文件名,也就是管道并没有命名。...我们直接以读方式写方式打开父子进程,各自拿一个读写端就可以通行。正是因为它没有名字,那么所以它必须得让我们对应的父子进程看到通信资源,它采用的是让父子继承的方案看到的。 那么有没有一种其他的方案呢?...我们先看手册的介绍,我们可以在当前的工作目录下建立命名管道: 例如我们在当前目录下创建一个命名管道,名字为 pipefifo: 如上,我们就创建了以 p 属性开头的管道文件,该管道就是命名管道。...我们创建两个终端,两个终端都在当前目录下,一个写,另一个读。观察现象: 如上图,当写端进行写入的时候,命令行会变成一个进程,向管道里写入,此时读端没有读取,所以写端正在阻塞。
一般要标定一个文件,是通过文件名来找到指定的文件的,可是当前这个管道文件没有名字,这也的管道文件,叫做匿名文件!...编写代码/实例代码 #include 功能:创建一无名管道 int pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端...这就证明了,如果管道中没有数据,读端在读的时候,默认阻塞当前在读的进程!...)填写的是这个文件的权限,一般为0666....编写代码 先创建2个cpp文件,表示两个没有亲属关系的进程,然后创建1个头文件,用于管道文件的创建。 两个cpp文件:server.cpp用于读取数据,client.cpp用于写入数据。
数据操作: Buffer的每一个子类都定义了两类get和put操作。 相对操作:读或写 一个或多个元素 从当前position位置开始并且会根据转换元素数量增加position的值。...将一个Channel中的数据给读到了多个buffer当中,它是按照顺序依次读入buffer当中的,而且总是当当前buffer已经写满了才会写下一个buffer。...还有数据,但缓冲区已经满的情况下,socketChannel.write(buffer)会返回已经写出去的字节数,此时为0。...selector,并且该channel open表示为false的情况下,才会去调用底层套接字的关闭操作。...b) 或者操作channel读/写的当前线程发生中断时。 ? 参考 圣思园netty课程
2.1.1 创建匿名管道 使用接口 pipe:创建一个管道,参数为输出型参数,打开两个文件描述符(fd),返回值为0表示打开失败。...当管道满的时候 O_NONBLOCK disable: write调用阻塞,直到有进程读走数据 O_NONBLOCK enable:调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭...即匿名管道的四种情况: 读端不读或读的慢,写端要等读端 读端关闭,写端收到SIGPIPE信号直接终止 写端不写或者写的慢,读端要等写端 写端关闭,读端会读完管道内的数据然后再读,...会读到0,表示读道文件结尾 2.2....命名管道有名字是为了保证让不同进程看到同一个文件。 匿名管道没有名字,是因为他是通过父子继承放入方式,看到同一份资源不需要名字。
所以根据传输方向的需要,关闭没有用的文件描述符。 问:为什么让父进程分别以读和写的方式打开同一个文件。 答:为了满足通信,通信双方会分别以读和写的方式打开同一个文件。...结论:当管道中没有数据时,且写端没有关闭写文件描述符时,读端会一直阻塞等待,直到写端有数据写入。 情况3 写端正常写入,读端每10秒钟读取一次数据。当管道被写满时,写端在做什么?...情况4 读端正常读取,写端在写入过程中突然将写文件描述符关闭 总结:当写端不再写入,并且关闭了pipe,那么读端将会把管道内的内容读完,最后就会读到返回值为0,表示读取结束,类似于读到了文件的结尾。...有没有一种能用于没有血缘关系的进程间的通信呢?有,命名管道。...,所以底层作为重定向是没问题的; 紧接着我们就尝试去写了,但当前呢它卡在这里的,什么都没做,我们再看一下当前这个管道文件里,当前显示的是零,好像没有写入啊; 这是因为管道文件有种特殊特性,虽然在磁盘当中创建了这个
功能: 创建一无名管道 参数: fd:文件描述符数组,是一个输出型参数,拿到打开的管道文件的问文件描述符,其中fd[0]表示读端文件,fd[1]表示写端文件 返回值:成功返回0,失败返回错误代码...:read调用返回-1,errno值为EAGAIN 写端不写,并将写端文件关闭 如果所有管道写端对应的文件描述符被关闭,则read返回0 读端不读,写端一直写 O_NONBLOCK disable...: write调用阻塞,直到有进程读走管道缓冲区的数据 O_NONBLOCK enable: write调用返回-1,errno值为EAGAIN 读端不读,并将读端文件关闭 如果所有管道读端对应的文件描述符被关闭...FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义 命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK...disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为读而打开该
,父进程以读写打开,子进程也是以读写打开(一般而言,管道只用来进行单向数据通信);关闭父子进程不需要的文件描述符,完成通信: 管道分为匿名管道和命名管道 2.2匿名管道 我们通过文件名区分文件,但是如果当前进程的文件没有名字...,读端在读,默认会直接阻塞当前正在读取的进程 ssize_t s = read(fds[0],buffer,sizeof(buffer)-1); if(s>0) buffer...子进程休眠时,不在写入,父进程在读取(如果管道中没有数据,读端在读,此时默认会直接阻塞当前正在读取的进程) 2.读慢写快 拿着管道读端不读,写端一直在写:写端往管道里写,而管道是有大小的,不断往写端写...3.写入关闭,读到0 子进程写入端关闭: 4.读取关闭,写入 管道是单向的:读端关闭,在写入就没有意义了:OS会终止写端,会给写进程发送信号,终止写端 管道特征 1.管道的生命周期随进程,进程退出...在当前路径下直接创建命名管道: mkfifo named_pipe 往管道文件写东西: 两个进程打开同一个文件:站在内核的角度,第二个文件不需要继续创建struct file对象,因为OS会识别到打开的文件被打开了
[0] 管道读端文件描述符 pipefd[1] 管道写端文件描述符 匿名管道的使用: 注意下图中的fd均指pipefd。...3.假设我们让子进程写,父进程读,所以我们要关闭不用的文件描述符,父进程关闭写端,子进程关闭读端。 ...(id,NULL,0);//父进程等待子进程,并回收 return 0; } 来看看运行结果: 管道的4种情况: 1.写端进程不写,读端进程一直读,那么此时会因为管道里面没有数据可读,对应的读端进程会被挂起...从上图可以算出管道的大小为512*8 = 4096字节。 命名管道: 刚才介绍的匿名管道,只可用于父子进程间通信,如果两个毫不相干的进程要实现通信该怎么办呢?接下来就需要介绍一下命名管道了。...mkfifo函数: mkfifo函数用于创建一个命名管道。 mkfifo的第一个参数表示要创建的命令管道文件,如果不带路径默认再当前文件夹下。 mkfifo的第二个参数表示管道的文件权限。
所有新数据加入到 buffer pool的时候,一律先放到冷数据区的head,不管是预读的,还是普通的读操作。所以如果有一些预读的数据没有被用到,会在oldsublist (冷区)直接被淘汰。...OK,预读的问题,通过冷热分离解决了,还有没有其他的问题呢? 我们先把数据放到冷区,用来避免占用热数据的存储空间。...否则的话就需要从磁盘加载到内存,再对内存的数据页进行操作。也就是说,如果没有命中缓冲池,至少要产生一次磁盘IO,有没有优化的方式呢?...3、双写缓冲(InnoDB的一大特性)∶InnoDB的页和操作系统的页大小不一致,InnoDB页大小一般为16K,操作系统页大小为4K,InnoDB的页写入到磁盘时,一个页需要分4次写。...跟redo log不一样,它的文件内容是可以追加的,没有固定大小限制。 在开启了binlog 功能的情况下,我们可以把 binlog 导出成SQL语句,把所有的操作重放一遍,来实现数据的恢复。
简单的来说,cat trace_pipe是堵塞读取,有数据就读,没数据就等待;而cat trace有没有数据都是直接返回的 3.3.3 tracing_on tracing_on:向 tracing_on...3.3.6 available_tracers available_tracers 文件中包含的是当前编译到内核的 tracer 列表,也表示当前内核支持的tracer列表。...per_cpu/cpuX/buffer_size_kb 记录 每个CPU buffer 大小,单位为 KB 。可通过写 buffer_size_kb 来改变 CPU buffer 的大小。...因为ftrace当打开时,在没有过滤的情况下,瞬间会抓取到内核所有的函数调用,为了更准确的抓取我们执行的命令,所以需要打开trace,执行完命令后,马上关闭。...如果函数命名没有规律,又想过滤该模块所有函数,该怎么办?
MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。...锁的分类 从对数据操作的类型分类: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行,不会互相影响 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据操作的粒度分类...):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作; MyISAM 表的读操作与写操作之间,...默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。...参数,表示记录下没有使用索引的查询。
如果cache中没有请求的数据,即cache未命中(cache miss),就必须从磁盘中读取数据。然后内核将读取的数据缓存到cache中,这样后续的读请求就可以命中cache了。...page可以只缓存一个文件部分的内容,不需要把整个文件都缓存进来。 写Cache 当内核发起一个写请求时(例如进程发起write()请求),同样是直接往cache中写入,后备存储中的内容不会直接更新。...writepage() 函数 对于文件映射(host指向一个inode对象),page每次修改后都会调用SetPageDirty(page)将page标识为dirty。...(对从用户空间拷贝到内核空间不是很理解,后期会重点学习Linux读、写文件的详细过程然后写一篇详细的blog介绍) Buffer Cache 在Block I/O的文章中提到用于表示内存到磁盘映射的buffer_head...在Linux2.4中,buffer cache和 page cache之间是独立的,前者使用老版本的buffer_head进行存储,这导致了一个磁盘block可能在两个cache中同时存在,造成了内存的浪费
,2-3表示WriteBuffer的Index,4-5是TempBuffer的Index,而6表示当前TempBuffer是否为Dirty,当有新写入新的数据后就会把这里Dirty位置为true,如果是...那么06按照这个格式来表示,就是指Temp Index为0,Write Index为1,而Read Index为2,因此,初始化状态指向的Buffer如下图所示。...如下图所示 检测之后如果为true,我们肯定是希望把已经写好的Buffer交换到ReadIndex上,而如果没有写好的Buffer就说明没有新内容可以读,就什么都不做。...可以看到下面这样的log,很多写入值没有读,证明了读过慢的问题: 那有没有办法解决这样的问题呢?先看写过慢读多次同样数据的问题。...其实我们看前面TripleBuffer源码知道dirty表示有没有新数据可以读,我们自己代码在读的地方我们没有管是否为dirty就直接读,那么必然会读到多次同样的数据,所以可以改为判断dirty,只要不是读过慢的情况下影就能解决多次读的问题
2、不要用file_descriptor[0]写数据,也不要用file_descriptor[1]读数据,其行为未定义的,但在有些系统上可能会返回-1表示调用失败。...可见,子进程读取了父进程写到filedes[1]中的数据,如果在父进程中没有sleep语句,父进程可能在子进程结束前结束,这样你可能将看到两个输入之间有一个命令提示符分隔。...父进程则相对简单,它首先关闭读管道,然后在写管道中写入数据,再关闭写管道就完成了它的任务。...五、关于管道关闭后的读操作的讨论 现在有这样一个问题,假如父进程向管道file_pipe[1]写数据,而子进程在管道file_pipe[0]中读取数据,当父进程没有向file_pipe[1]写数据时...当写数据的管道没有关闭,而又没有数据可读时,read调用通常会阻塞,但是当写数据的管道关闭时,read调用将会返回0而不是阻塞。
如果成功,返回值大于0表示与一个客户端TCP建立了连接;返回值是由kernel自动生成的一个全新描述符。在非阻塞模式下,accept()返回-1表示全连接队列中没有已完成的客户端接入。...flag参数说明: 参数 含义 SHUT_RDWR 值为2,表示关闭读写段 SHUT_WR 值为1,表示关闭本地写段,对端读段 SHUT_RD 值为0,表示关闭本地读段,对端写段 使用方式: //主动关闭...2.1 操作方式 2.1.1 阻塞模式 一般情况下,fd默认是阻塞的。阻塞模式会阻塞在网络线程。比如,当调用recv,读缓冲区没有数据时,则一直阻塞,直到有数据可读才返回。...设置了非阻塞模式后,调用IO函数时,不管有没有成功都返回。比如,当调用recv,读缓冲区没有数据时,返回-1,并设置errno,errno应该是EWOULDBLOCK。...当epoll返回EPOLLRDHUP表示服务器读端关闭了;当epoll返回EPOLLHUP表示服务器读写端都关闭了。 3.3 消息到达 epoll(IO多路复用器)检测客户端fd的读事件。
MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。...锁的分类 从对数据操作的类型分类: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行,不会互相影响 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据操作的粒度分类: 为了尽可能提高数据库的并发度...):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作; MyISAM 表的读操作与写操作之间,以及写操作之间是串行的...默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。...参数,表示记录下没有使用索引的查询。
但是,获取写锁需要等待所有的读锁和写锁释放。 RWMutex的基本方法包括: Lock- 获取写锁,阻塞直到没有其他读锁或写锁。 Unlock- 释放写锁。...在RWMutex内部,会有以下字段(注意,这是概念性描述,实际实现可能有所不同): 一个读计数器,表示当前持有读锁的 goroutine 数量。...一旦它时队列中的写一个写锁,并且没有活跃的读锁或写锁,它将获得写锁。 获得写锁后,减少等待写锁的数量。 读操作的逻辑: 当 goroutine 请求读锁时,如果有活跃的写锁或等待的写锁,则它将等待。...如果这是最后一个读锁,并且有写锁等待,会唤醒写锁。 这种设计使得 RWMutex 在读取操作频繁而写入操作较少的场合中表现优异。然而,写锁的请求者可能会遇到饥饿问题,尤其是在高读负载的情况下。...读锁释放顺序:与写锁不同,在释放读锁的时候没有严格要求 goroutine 以获取读锁的相反顺序来释放它们,任何持有读锁的 goroutine 都可以随时释放它。
和未被分配的内存之和,这就是系统当前实际可用内存。...对buffer cache的写分为两种: 直接写 这是程序在写buffer cache后也写磁盘,要读时从buffer cache上读 后台写 程序在写完buffer cache后并不立即写磁盘,因为有可能程序在很短时间内又需要写文件...Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。...在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。...Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。
领取专属 10元无门槛券
手把手带您无忧上云