12.3 页面锁PG_Locked
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相关推荐
- vue实现页面锁屏完美解决
vue实现页面锁屏完美解决 最新写项目 客户要求写一个锁屏功能.静下心来,慢慢看 ,相信你会有收获的. 功能点 1.禁止浏览器返回按钮. 2.手动输入路由会强制跳到锁屏页面. 3.必须输入正确密码或者 ...
- vue实现页面锁屏完美解决(续集)
vue实现页面锁屏完美解决 (续集) vue实现页面锁屏完美解决这篇文章的续集. 上面那篇文章还不够完美 在后面还是出现了一些bug.所以为了大家能少走点弯路 我把我遇到的坑 以及解决的办法和最新的写 ...
- [html] 实现一个页面锁屏的功能
[html] 实现一个页面锁屏的功能 <!DOCTYPE html> <html> <head> <title>Ctrl+l监控锁屏</title ...
- 3.12 SE11创建锁对象
3.12 SE11创建锁对象 命名规则:<EZ><模块代码><3位流水号> 举例说明:EZWM001 业务说明:锁对象是对数据的访问进行并发的控制.加锁就是将用户正 ...
- 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- Mysql各数据库引擎优缺点,以及常用表锁,行锁,页面锁(个人总结)
功能 MYISAM MEMORY INNODB ARCHIVE 事务 不支持 不支持 支持 不支持 哈希索引 不支持 支持 不支持 不支持 BTREE索引 支持 支持 支持 支持 锁机制 表锁 表锁 ...
- 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...
- web课程设计网页规划与设计:文化网站设计——中国水墨风书画艺术网站(12个页面)...
web课程设计网页规划与设计:文化网站设计--中国水墨风书画艺术网站(12个页面) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多 ...
- web课程设计网页规划与设计:文化网站设计——中国水墨风书画艺术网站(12个页面)
web课程设计网页规划与设计:文化网站设计--中国水墨风书画艺术网站(12个页面) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多 ...
最新文章
- PHP PSR-1 基本代码规范(中文版)
- 通过Athens搭建go私服
- 利用license机制来保护Java软件产品的安全
- 「译」MotionLayout 介绍 (part II)
- Java排序之归并排序
- Wireshark实战分析之ARP协议(二)
- Django+Bootstrap+Mysql 搭建个人博客(一)
- python launcher下载_Python flauncher包_程序模块 - PyPI - Python中文网
- Java解析JSON大文件解决方案之JsonReader
- shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
- 程序猿生存指南-55 初为人师
- html 过滤引号,用js正则表达式过滤双引号的解决办法
- linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式
- 数据库的几个性能指标
- 电影服务器硬盘内存多大,安装监控器的主机,要多大硬盘?多大内存呢?
- php redis 关闭,php redis如何关闭_后端开发
- WebGL 及其在 WebRTC 中的应用
- Mac eclipse自定义主题字体以及背景(绿豆沙为例)
- “驱动人生”利用高危漏洞传播病毒
- iOS开发mac工具