struct page数据结构成员flags定义了一个标志位PG_locked,内核利用PG_locked来设置一个页面锁。lock_page()函数用于申请页面锁,如果页面锁被其他进程占用了,那么会睡眠等待。

[include/linux/pagemap.h]
/** lock_page may only be called if we have the page's inode pinned.*/
static inline void lock_page(struct page *page)
{might_sleep();if (!trylock_page(page))__lock_page(page);
}
[mm/filemap.c]/*** __lock_page - get a lock on the page, assuming we need to sleep to get it* @page: the page to lock*/
void __lock_page(struct page *page)
{DEFINE_WAIT_BIT(wait, &page->flags, PG_locked);__wait_on_bit_lock(page_waitqueue(page), &wait, bit_wait_io,TASK_UNINTERRUPTIBLE);
}

trylock_page()和lock_page()这两个函数看起来很相似,但有很大的区别。trylock_page()定义在include/linux/pagemap.h文件中,它使用test_and_set_bit_lock()去尝试为page的flags设置PG_locked标志位,并且返回原来标志位的值。如果page的PG_locked位已经置位了,那么当前进程调用trylock_page()返回false,说明有其他进程已经锁住了page。因此trylock_page()返回false表示获取锁失败,返回true表示获取锁成功。

static inline int trylock_page(struct page *page)
{return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
}
[include/asm-generic/bitops/lock.h]
/*** test_and_set_bit_lock - Set a bit and return its old value, for lock* @nr: Bit to set* @addr: Address to count from** This operation is atomic and provides acquire barrier semantics.* It can be used to implement bit locks.*/
#define test_and_set_bit_lock(nr, addr) test_and_set_bit(nr, addr)

12.3 页面锁PG_Locked相关推荐

  1. vue实现页面锁屏完美解决

    vue实现页面锁屏完美解决 最新写项目 客户要求写一个锁屏功能.静下心来,慢慢看 ,相信你会有收获的. 功能点 1.禁止浏览器返回按钮. 2.手动输入路由会强制跳到锁屏页面. 3.必须输入正确密码或者 ...

  2. vue实现页面锁屏完美解决(续集)

    vue实现页面锁屏完美解决 (续集) vue实现页面锁屏完美解决这篇文章的续集. 上面那篇文章还不够完美 在后面还是出现了一些bug.所以为了大家能少走点弯路 我把我遇到的坑 以及解决的办法和最新的写 ...

  3. [html] 实现一个页面锁屏的功能

    [html] 实现一个页面锁屏的功能 <!DOCTYPE html> <html> <head> <title>Ctrl+l监控锁屏</title ...

  4. 3.12 SE11创建锁对象

    3.12 SE11创建锁对象 命名规则:<EZ><模块代码><3位流水号> 举例说明:EZWM001 业务说明:锁对象是对数据的访问进行并发的控制.加锁就是将用户正 ...

  5. 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. Mysql各数据库引擎优缺点,以及常用表锁,行锁,页面锁(个人总结)

    功能 MYISAM MEMORY INNODB ARCHIVE 事务 不支持 不支持 支持 不支持 哈希索引 不支持 支持 不支持 不支持 BTREE索引 支持 支持 支持 支持 锁机制 表锁 表锁 ...

  7. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  8. web课程设计网页规划与设计:文化网站设计——中国水墨风书画艺术网站(12个页面)...

    web课程设计网页规划与设计:文化网站设计--中国水墨风书画艺术网站(12个页面) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多 ...

  9. web课程设计网页规划与设计:文化网站设计——中国水墨风书画艺术网站(12个页面)

    web课程设计网页规划与设计:文化网站设计--中国水墨风书画艺术网站(12个页面) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多 ...

最新文章

  1. PHP PSR-1 基本代码规范(中文版)
  2. 通过Athens搭建go私服
  3. 利用license机制来保护Java软件产品的安全
  4. 「译」MotionLayout 介绍 (part II)
  5. Java排序之归并排序
  6. Wireshark实战分析之ARP协议(二)
  7. Django+Bootstrap+Mysql 搭建个人博客(一)
  8. python launcher下载_Python flauncher包_程序模块 - PyPI - Python中文网
  9. Java解析JSON大文件解决方案之JsonReader
  10. shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
  11. 程序猿生存指南-55 初为人师
  12. html 过滤引号,用js正则表达式过滤双引号的解决办法
  13. linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式
  14. 数据库的几个性能指标
  15. 电影服务器硬盘内存多大,安装监控器的主机,要多大硬盘?多大内存呢?
  16. php redis 关闭,php redis如何关闭_后端开发
  17. WebGL 及其在 WebRTC 中的应用
  18. Mac eclipse自定义主题字体以及背景(绿豆沙为例)
  19. “驱动人生”利用高危漏洞传播病毒
  20. iOS开发mac工具

热门文章

  1. excel文件下载下来损坏 js_使用Java / javascript和apache POI导出.xls文件时获取损坏的文件...
  2. 项目代码中魔法值的优雅处理
  3. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本
  4. Python cv2.minMaxLoc方法代码示例
  5. Android 设计模式之MVC,从一个实例中来理解MVC
  6. HTML中6种空格标记
  7. MinGW-w64 安装和使用
  8. NodeJs 畅谈异步
  9. AXL经典作品推荐恋する乙女と守护の楯 恋爱少女与守护之盾
  10. Chrome 制作绿色便携版