【Linux详解】缓冲区优化 | 进度条的实现 | Linux下git 的上传 ...

打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

目次
一. 缓冲区
1. 缓冲区概念
2. 缓冲区作用
2.1 提升读写效率
2.2 减少等候时间
3. 缓冲区刷新策略
3.4 特殊策略
4. 缓冲区存储位置
5. 总结
二. 实现进度条
引入:倒计时
process.c
三. Linux下git的上传
sum

一. 缓冲区

1. 缓冲区概念

缓冲区是盘算机内存的一部分,用于暂时存储数据。它在数据传输过程中起到一个缓冲桥梁的作用,资助协调数据传输的速率差异。缓冲区可以是磁盘缓存,网络传输中的数据缓存等。
2. 缓冲区作用

缓冲区的作用非常广泛和重要,主要体现在以下几个方面:
   2.1 提升读写效率

  当进程要举行文件读写操作时,数据会起首存储在缓冲区中,而不是直接写入磁盘。缓冲区根据特定的刷新策略定期或在特定条件下将数据写入磁盘。这样可以减少磁盘的频繁读写动作,从而提升整体系统的效率。
  2.2 减少等候时间

  在没有缓冲区的情况下,每次文件读写操作都需要等候外设(如磁盘)停当,这大概会导致显著的等候时间。缓冲区减少了这种等候时间,因为数据可以暂时存储在内存中,进程可以继承实行其他任务,而无需等候外设操作完成。
  实验
先说一下 unistd.h 库中的 sleep 函数,它可以按照秒去休眠

我们可以
  1. man sleep
复制代码
相识到如上内容,代码演示:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main(void) {
  4.     printf("hello\n");  
  5.     sleep(2);                 
  6.     return 0;
  7. }
复制代码
会发当代码是自上而下,正常运行的,那假如我们实验去掉hello后面的\n会发生什么呢


现实上,printf 已经先实行了,只是这个 "Helo,World" 没有立马被显示出来罢了!
当我们 sleep 时也没有显示,当我们 sleep 完乃至到步伐退出后,这个 "Helo,World" 才显示出来。
说明带有\n会马上刷新,那么不带的时候,那2s 代码又存在那里呢?
   就是存在我们的缓冲区啦, return 退出的时候,这个数据才显示出来,所以才看到了我们现在看到的现象 
  3. 缓冲区刷新策略

缓冲区的刷新策略决定了何时将缓冲区中的数据真正写入到目的存储器,如磁盘或显示器。主要有以下几种策略:
   3.1 无缓冲(Unbuffered)
  数据一写入缓冲区就立刻刷新写入目的装备。这种方式适合对时间敏感的操作,但大概导致系统资源的低效利用。
  3.2 行缓冲(Line Buffered)
  当缓冲区检测到换行符(\n)时,立刻刷新写入目的装备。这种方式常用于终端显示器,以保证一行行的输出效果。比方,在终端或控制台输出时,行缓冲能确保即时显示用户输入的一行内容。
  3.3 全缓冲(Fully Buffered)
  只有当缓冲区满了时,才会将数据刷新写入目的装备。这种方式适合大量数据的写入操作,能提高整体的写入效率。比方,在将数据写入磁盘文件时,通常利用全缓冲策略。
  3.4 特殊策略

  

  • 用户欺压刷新
    用户可以显式调用刷新函数(如 fflush(FILE *stream))来欺压刷新缓冲区内容。
  • 进程退出刷新
    当进程正常退出时,缓冲区会自动刷新,以确保所有已写入缓冲区但尚未写入目的装备的数据都被处理完毕。
  假如我们想让上面的hello马上打印,就可以举行如下操作啦
  1. #include <stdio.h>
  2. int fflush(FILE* stream);
复制代码

效果:

4. 缓冲区存储位置

标准输入输出流(stdin、stdout、stderr)和文件流都是 FILE* 类型,它们在缓冲区管理中扮演了重要角色。当我们打开一个文件时,系统会返回一个 FILE* 类型的指针,文件的读写和关闭操作都需要该指针作为参数。
内部结构
struct FILE 封装了文件形貌符(fd)、缓冲区以及缓冲区刷新策略。这使得文件操作变得高效和透明,开发者无需关心低级别的文件操作细节。
5. 总结

缓冲区是提高系统数据读写效率的重要机制。理解和有效利用缓冲区及其刷新策略,可以显著提升步伐性能和资源利用效率。

二. 实现进度条

引入:倒计时

   换行:/n
  回车:/r
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()
  4. {
  5.     int cnt=10;
  6.     while(cnt>=0)//循环判断的条件
  7.     {
  8.         printf("倒计时:%2d\r",cnt);//输出倒计时的数字
  9.         sleep(1);//间隔一秒
  10.         fflush(stdout);//刷新缓冲区
  11.         cnt--;//倒计时
  12.     }
  13.     printf("\n");//刷新缓冲区,换行               
  14.     return 0;
  15. }
复制代码

进度条
process.c

  1. #include<stdio.h>   
  2. #include<unistd.h>   
  3. #include<string.h>   
  4. #define MAX 100   
  5. int main()   
  6. {   
  7.   int i=0;   
  8.   char bar[MAX+5];//设置进度条字符数组   
  9.   memset(bar,0,sizeof(bar));//初始化   
  10.   const char* arr="|\\-/";    //旋转字符数组
  11.   while(i<=100)   
  12.   {   
  13.    
  14.     printf("[%-100s][%3d%%] %c\r",bar,i,arr[i%4]);//防止越界                                                                                                           
  15.     fflush(stdout);//马上刷新                                                               
  16.     bar[i] = '=';
  17.     bar[i+1] = '>';//进度条符号                                                                                       
  18.     i++;                                                                                                                                
  19.     usleep(50000);//0.5秒的缓冲时间                                                                                                                     
  20.   }                                                                                                                                                                                                                                                              
  21.   printf("\n");//换行刷新                                                                                                                        
  22.   return 0;                                                                                                                             
  23. }
复制代码

 留意:

1.打印样式的代码实现
2.fflush实现不停刷新

三. Linux下git的上传

在之前有写过【必备工具】gitee上传-保姆级教程
是借助小乌龟上传的,接下来我们将用指令来实现
1.
复制地点

2. 
克隆
   git clone
  这样就是克隆成功啦

3.
添加
   git add [file name]
  

4.
上传
   git commit -m     # -m选项代表的是本次的提交日志
# 提交时应该表明提交日志、形貌改动的具体内容,务必培养这个好风俗。
  

5.
推入
   git push
  


上传成功啦!



sum




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表