fsync

fsync转载:https://www.jb51.net/article/101062.htm脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数…

大家好,又见面了,我是你们的朋友全栈君。

转载:https://www.jb51.net/article/101062.htm

脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。

内存映射:内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

//摘录自百度百科

延迟写(delayed write): 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。 当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则 并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时, 再将该缓冲排入到输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式就被称为延迟写。

//摘录自《UNIX环境高级编程第三版》P65

二、正文

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。

1、sync函数

sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。

2、fsync函数

fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。

fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

3、fdatasync函数

fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。

4、fflush:标准IO函数(如fread,fwrite等)会在内存中建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其真正写入磁盘,还需要调用fsync。(即先调用fflush然后再调用fsync,否则不会起作用)。fflush以指定的文件流描述符为参数(对应以fopen等函数打开的文件流),仅仅是把上层缓冲区中的数据刷新到内核缓冲区就返回,

因此相对于fsync而言不是很安全,还需要再调用一下fsync来把数据真正写入硬盘。使用函数

?
1
int fileno(FILE *stream);

把文件流描述符(fp)转换为文件描述符(fd),以方便fsync的调用,那么,在Linux操作系统上,怎样才能保证数据被正确地写入外部永久存储介质?

1. write不能满足要求,需要fsync

对于write函数,我们认为该函数一旦返回,数据便已经写到了文件中。但是这种概念只是宏观上的,一般情况下,对硬盘(或者其他持久存储设备)文件的write操作,更新的只是内存中的页缓存(page cache),而脏页不会立即更新到硬盘中,而是由操作系统统一调度,如flusher内核线程在满足一定条件时(一定时间间隔、内存中
的脏页达到一定比例)将脏页面同步到硬盘上(放入设备的IO请求队列)。因为write调用不会等到硬盘IO完成之后才返回,设想如果操作系统在write调用之后、硬盘同步之前崩溃,则数据可能丢失。虽然这样的时间窗口很小,但是对于需要保证事务的持久化(durability)和一致性(consistency)的数据库程序来说,write()所提供的“松散的异步语义”是不够的,通常需要操作系统提供的同步IO(synchronized-IO)原语来保证:

函数原型:

?
1
int fsync(int fd);

fsync的功能是确保文件fd所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成。

PS:如果采用内存映射文件的方式进行文件IO(使用mmap,将文件的page cache直接映射到进程的地址空间,通过写内存的方式修改文件),也有类似的系统调用来确保修改的内容完全同步到硬盘之上:

?
1
2
#incude <
sys
/mman.h>
int msync(void *addr, size_t length, int flags)

msync需要指定同步的地址区间,如此细粒度的控制似乎比fsync更加高效(因为应用程序通常知道自己的脏页位置),但实际上(Linux)kernel中有着十分高效的数据结构,能够很快地找出文件的脏页,使得fsync只会同步文件的修改内容。

2. fsync与fdatasync区别

除了同步文件的修改内容(脏页),fsync还会同步文件的描述信息(metadata,包括size、访问时间等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,多余的一次IO操作,根据Wikipedia的数据,当前硬盘驱动的平均寻道时间(Average seek time)大约是3~15ms,7200RPM硬盘的平均旋转延迟(Average rotational latency)大约为4ms,因此一次IO操作的耗时大约为10ms左右。Posix同样定义了fdatasync,放宽了同步的语义以提高性能:

?
1
int fdatasync(int fd);

fdatasync的功能与fsync类似,但是仅仅在必要的情况下才会同步,因此可以减少一次IO写操作。

“fdatasync does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be corretly handled.”

举例来说,文件的尺寸(st_size)如果变化,是需要立即同步的,否则OS一旦崩溃,即使文件的数据部分已同步,由于metadata没有同步,依然读不到修改的内容。而最后访问时间(atime)/修改时间(mtime)是不需要每次都同步的,只要应用程序对这两个时间戳没有苛刻的要求,基本没有问题。

补充:函数open的参数O_SYNC/O_DSYNC有着和fsync/fdatasync类似的含义:使每次write都会阻塞等待硬盘IO完成。

O_SYNC 使每次write等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/O。

O_DSYNC 使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需等待文件属性被更新。

注意区别:

O_DSYNC和O_SYNC标志有微妙的区别:

仅当文件属性需要更新以反映文件数据变化(例如,更新文件大小以反映文件中包含了更多数据)时,O_DSYNC标志才影响文件属性。而设置O_SYNC标志后,数据和属性总是同步更新。当文件用O_DSYN标志打开,在重写其现有的部分内容时,文件时间属性不会同步更新。于此相反,文件如果是用O_SYNC标志打开的,那么对于该文件的每一次write都将在write返回前更新文件时间,这与是否改写现有字节或追加文件无关。相对于fsync/fdatasync,这样的设置不够灵活,应该很少使用。

3. 使用fdatasync优化日志同步

为了满足事务要求,数据库的日志文件是常常需要同步IO的。由于需要同步等待硬盘IO完成,所以事务的提交操作常常十分耗时,成为性能的瓶颈。在Berkeley DB下,如果开启了AUTO_COMMIT(所有独立的写操作自动具有事务语义)并使用默认的同步级别(日志完全同步到硬盘才返回),写一条记录的耗时大约为5~10ms级别,基本和一次IO操作(10ms)的耗时相同。

我们已经知道,在同步上fsync是低效的。但是如果需要使用fdatasync减少对metadata的更新,则需要确保文件的尺寸在write前后没有发生变化。日志文件天生是追加型(append-only)的,总是在不断增大,似乎很难利用好fdatasync。

Berkeley DB是处理日志文件的步骤:

1.每个log文件固定为10MB大小,从1开始编号,名称格式为“log.%010d”

2.每次log文件创建时,先写文件的最后1个page,将log文件扩展为10MB大小

3.向log文件中追加记录时,由于文件的尺寸不发生变化,使用fdatasync可以大大优化写log的效率

4.如果一个log文件写满了,则新建一个log文件,也只有一次同步metadata的开销

三、总结

1、如果是对所有的缓冲区发出写硬盘的命令,应该使用sync函数,但应该注意该函数仅仅只是把该命令放入队列就返回了,在编程时需要注意。

2、如果是要把一个已经打开的文件所做的修改提交到硬盘,应调用fsync函数,该函数会在数据实际写入硬盘后才返回,因此是最安全最可靠的方式。

3、如果是针对一个已经打开的文件流操作,则应该首先调用fsync函数把修改同步到内核缓冲区,然后再调用fsync把修改真正的同步到硬盘。

四、附man手册关于fsync,fdatasync部分

fsync() transfers (“flushes”) all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file

descriptor fd to the disk device (or other permanent storage device) so that all changed information can be retrieved even after the sys‐

tem crashed or was rebooted. This includes writing through or flushing a disk cache if present. The call blocks until the device

reports that the transfer has completed. It also flushes metadata information associated with the file (see stat(2)).

Calling fsync() does not necessarily ensure that the entry in the directory containing the file has also reached disk. For that an

explicit fsync() on a file descriptor for the directory is also needed.

fdatasync() is similar to fsync(), but does not flush modified metadata unless that metadata is needed in order to allow a subsequent

data retrieval to be correctly handled. For example, changes to st_atime or st_mtime (respectively, time of last access and time of last

modification; see stat(2)) do not require flushing because they are not necessary for a subsequent data read to be handled correctly. On

the other hand, a change to the file size (st_size, as made by say ftruncate(2)), would require a metadata flush.

The aim of fdatasync() is to reduce disk activity for applications that do not require all metadata to be synchronized with the disk.

Linux、unix在内核中设有缓冲区、高速缓冲或页面高速缓冲,大多数磁盘I/O都通过缓冲进行,采用延迟写技术。

sync:将所有修改过的快缓存区排入写队列,然后返回,并不等待实际写磁盘操作结束;

fsync:只对有文件描述符制定的单一文件起作用,并且等待些磁盘操作结束,然后返回;

fdatasync:类似fsync,但它只影响文件的数据部分。fsync还会同步更新文件的属性;

fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。

以上就是小编为大家带来的函数sync、fsync与fdatasync的总结整理(必看篇)全部内容了,希望大家多多支持脚本之家~

                    <div class="art_xg">
                    
                    </div>
					<div style="padding: 10px 0 20px 0;color:red;font-weight:bold;">如对本文有所疑义或者对本文内容提供补充建议,请联系小编<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=2998481778&amp;site=jb51net&amp;menu=yes" target="_blank"><img border="0" src="https://pub.idqqimg.com/qconn/wpa/button/button_111.gif" alt="点击这里给我发消息" title="点击这里给我发消息"></a>,本站会保留修改者版权</div><div class="lbd_bot clearfix">
					<script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-6384567588307613" data-ad-slot="3921475131" data-adsbygoogle-status="done"><ins id="aswift_0_expand" style="display:inline-table;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:728px;background-color:transparent;"><ins id="aswift_0_anchor" style="display:block;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:728px;background-color:transparent;"><iframe width="728" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left:0;position:absolute;top:0;border:0px;width:728px;height:90px;"></iframe></ins></ins></ins><script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

					</div>
				<div class="jb51ewm"><div class="fl"><img src="//files.jb51.net/skin/2018/images/jb51ewm.png"></div><div class="fr"><p>微信公众号搜索 “ <span>脚本之家</span> ” ,选择关注</p><p>程序猿的那些事、送书等活动等着你</p></div></div></div><!--endmain-->
				<div class="tags clearfix">
					<i class="icon-tag"></i>
					<ul class="meta-tags">
					  <li class="tag item"><a href="http://common.jb51.net/tag/sync/1.htm" target="_blank" title="搜索关于sync的文章" rel="nofollow">sync</a></li>
  • fsync
  • fdatasync
  • 					</ul>
    				</div>
    				<div class="lbd clearfix">
    					<a href="http://vip.xiaziyuan8.com/weixin.html" target="_blank"><img src="//files.jb51.net/image/tb_all.gif?1217" class="nohref"></a>
    
    				</div>
    				<div id="shoucang"></div>
    				<div class="xgcomm clearfix">
    					<h2>相关文章</h2>
    					<ul><li class="lbd clearfix"><div id="_bmjqr5kupl" style="width: 100%;"><em class="swncqomxbviyekp" style="display:none;margin-left:0px;"></em><iframe width="820" frameborder="0" height="120" scrolling="no" src="https://pos.baidu.com/s?hei=120&amp;wid=820&amp;di=u4806172&amp;ltu=https%3A%2F%2Fwww.jb51.net%2Farticle%2F101062.htm&amp;psi=746b85aa715e0726c0286472119f03c8&amp;cfv=0&amp;cdo=-1&amp;col=zh-CN&amp;ari=2&amp;ccd=24&amp;tpr=1577241166845&amp;pis=-1x-1&amp;cec=GBK&amp;tcn=1577241167&amp;ps=1780x0&amp;dai=2&amp;cpl=3&amp;prot=2&amp;ant=0&amp;pcs=1519x723&amp;ti=%E5%87%BD%E6%95%B0sync%E3%80%81fsync%E4%B8%8Efdatasync%E7%9A%84%E6%80%BB%E7%BB%93%E6%95%B4%E7%90%86(%E5%BF%85%E7%9C%8B%E7%AF%87)_Linux_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&amp;chi=1&amp;cmi=4&amp;dri=0&amp;dtm=HTML_POST&amp;dc=3&amp;dis=0&amp;par=1536x826&amp;cce=true&amp;tlm=1577241166&amp;cja=false&amp;pss=1519x7478&amp;psr=1536x864&amp;drs=1&amp;exps=111000,110011"></iframe></div><script type="text/javascript" src="//jscode.jbzj.com/site/g/bx_d/production/hak_cq.js"></script>
    
  • 新手入门级linux系统常用命令大全

    新手入门级linux系统常用命令大全

    本文为大家分享了Linux常用命令,这些命令几乎每天都要用到,记录下来方便以后查询使用

    2018-10-10

  • Ubuntu18.04(linux)安装MySQL的方法步骤

    Ubuntu18.04(linux)安装MySQL的方法步骤

    本篇文章主要介绍了Ubuntu18.04(linux)安装MySQL的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    2018-05-05

  • linux进程监控与自动重启的简单实现方法

    linux进程监控与自动重启的简单实现方法

    这篇文章主要给大家介绍了关于linux进程监控与自动重启的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用linux具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    2019-07-07

  • Linux中tail命令用法详解

    Linux中tail命令用法详解

    tail命令也是一个非常常用的文件查看类的命令,接下来通过本篇文章给大家介绍linux中tail命令的用法详解,感兴趣的朋友一起看看吧

    2016-09-09

  • 学习在kernel态下使用NEON对算法进行加速的方法

    学习在kernel态下使用NEON对算法进行加速的方法

    这篇文章主要介绍了学习在kernel态下使用NEON对算法进行加速的方法,一起来学习下,大大提高数据运算的效率。

    2017-11-11

  • Ubuntu/Linux 有关权限修改的命令解析

    Ubuntu/Linux 有关权限修改的命令解析

    这篇文章主要介绍了Ubuntu/Linux 有关权限修改的命令的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

    2016-11-11

  • CentOS7下GitLab跨大版本升级的方法

    CentOS7下GitLab跨大版本升级的方法

    这篇文章主要介绍了CentOS7下GitLab跨大版本升级的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    2019-07-07

  • 解决linux下zip文件解压乱码问题

    解决linux下zip文件解压乱码问题

    本篇文章主要介绍了解决linux下zip文件解压乱码问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    2017-05-05

  • Serverless 架构如何演进详细介绍

    Serverless 架构如何演进详细介绍

    这篇文章主要介绍了Serverless 架构如何演进详细介绍的相关资料,需要的朋友可以参考下

    2017-03-03

  • xampp Apache启动后无法访问站点解决方法汇总

    xampp Apache启动后无法访问站点解决方法汇总

    本文给大家总结了3种xampp Apache启动后无法访问站点解决方法,均能够解决此问题,有需要的小伙伴可以参考下

    2015-03-03

  • 				</div>
    				<a href="#comments"></a>
    				<div id="comments">
    					<h2>最新评论</h2>
    					<div class="pd5"><div id="SOHUCS" sid="art_101062"></div></div>
    				</div>
    			  </div><!--endborder-->
    		  </div><!--end fl-->
    	  
    		<div class="main-right">
    			<div id="sidebar-right">
    				<div class="r300 clearfix"><script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:inline-block;width:300px;height:250px" data-ad-client="ca-pub-6384567588307613" data-ad-slot="4845332105" data-adsbygoogle-status="done"><ins id="aswift_1_expand" style="display:inline-table;border:none;height:250px;margin:0;padding:0;position:relative;visibility:visible;width:300px;background-color:transparent;"><ins id="aswift_1_anchor" style="display:block;border:none;height:250px;margin:0;padding:0;position:relative;visibility:visible;width:300px;background-color:transparent;"><iframe width="300" height="250" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_1" name="aswift_1" style="left:0;position:absolute;top:0;border:0px;width:300px;height:250px;"></iframe></ins></ins></ins><script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
    

    fsync

    fsync

    fsync

    fsync

    在线工具

    代码格式化等

    高防主机

    600G 防护

    枫信科技

    IDC服务商

    				</div>
                    <div class="sidebox bor-blue">
    					<div class="bor-default pb10">
    						<h4 class="blue">常用在线小工具</h4>
    						<ul class="newsListA"><li><a href="http://tools.jb51.net/code/css" target="_blank"><font color="red">CSS代码工具</font></a></li><li><a href="http://tools.jb51.net/code/js" target="_blank"><font color="red">JavaScript代码格式化工具</font></a></li><li><a href="http://tools.jb51.net/code/xmlformat" target="_blank">在线XML格式化/压缩工具</a></li><li><a href="http://tools.jb51.net/code/phpformat" target="_blank"><font color="red">php代码在线格式化美化工具</font></a></li><li><a href="http://tools.jb51.net/code/sqlcodeformat" target="_blank">sql代码在线格式化美化工具</a></li><li><a href="http://tools.jb51.net/transcoding/html_transcode" target="_blank">在线HTML转义/反转义工具</a></li><li><a href="http://tools.jb51.net/code/json" target="_blank">在线JSON代码检验/检验/美化/格式化</a></li><li><a href="http://tools.jb51.net/regex/javascript" target="_blank">JavaScript正则在线测试工具</a></li><li><a href="http://tools.jb51.net/transcoding/jb51qrcode" target="_blank">在线生成二维码工具(加强版)</a></li><li><a href="http://tools.jb51.net/" target="_blank">更多在线工具</a></li>
    

    fsync

    云服务器

    					</div>				</div>			  </div>		  </div><!--end fr-->	  </div>  </div>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138142.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 护眼色的RGB值_护眼豆沙绿rgb

    护眼色的RGB值_护眼豆沙绿rgb网上流行护眼色的RGB值和颜色代码在搜索引擎搜“护眼色”,就会搜出一堆关于保护眼睛的屏幕颜色文章,说的统统是一种颜色,有点像绿豆沙的颜色。方法就是在屏幕设置里,色调:85;饱和度:123;亮度:2

  • Ai智慧社区_AI社区医院

    Ai智慧社区_AI社区医院前言前不久进入了智慧社区、智慧园区和智慧校园行业,于是打算就智慧社区下的智慧小区写两篇文章,一篇是介绍智慧小区,一篇是关于如何构建智慧小区管理系统。本篇是智慧小区文章的第一篇,纯介绍性,如果对智慧小区有一定了解的可以移步。为什么我会讲智慧小区而非智慧社区,原因之一是智慧社区有很多社会属性的单位,比如医疗卫生、派出所、城管、社区居委会等等,涉及到政务、治安、党建、医疗、市政等很多方面,…

    2022年10月17日
  • MySQL对group by原理和理解

    MySQL对group by原理和理解写在前面的话:用了好久groupby,今天早上一觉醒来,突然感觉groupby好陌生,总有个筋别不过来,为什么不能够select*fromTablegroupbyid,为什么一定不能是*,而是某一个列或者某个列的聚合函数,groupby多个字段可以怎么去很…

  • django权限管理例子_django admin 自定义页面

    django权限管理例子_django admin 自定义页面前言上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问权限源码分析源码入口:APIView.py文件下的initial方法下的check_per

  • linux下手动释放内存

    linux下手动释放内存

  • frp内网穿透服务使用

    frp内网穿透服务使用frp是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。frp是一个开源的内网穿透应用,有客户端软件和服务端软件,大概工作过程如下服务端运行在具有公网IP的服务器上,比如Linux上,并监听某个端口,等待客户端连接。客户端运行在需要穿透的内网机器上,比如本地电脑上,连接到服务器之后,服务器开始监听客户端需要穿透的指定端口。……………………

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号