当前位置: 首页 > news >正文

做网站要学的知识网站快速排名互点软件

做网站要学的知识,网站快速排名互点软件,湛江宇锋网站建设,asp.net做网站实例接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4) 问题6 问:mutex_lock和mutex_lock_interruptible的区别是什么? 备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答: 尽管…

接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4)

问题6

问:mutex_lock和mutex_lock_interruptible的区别是什么?

备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。

答:

尽管信号量已经可以实现互斥的功能,但是在Linux内核中还是真实存在着“正宗”的互斥机制——mutex。

以下3个函数用于获取互斥体(均在kernel/locking/mutex.c中):

  • mutex_lock
void __sched mutex_lock(struct mutex *lock)
{might_sleep();if (!__mutex_trylock_fast(lock))__mutex_lock_slowpath(lock);
}
EXPORT_SYMBOL(mutex_lock);
  • mutex_lock_interruptible
int __sched mutex_lock_interruptible(struct mutex *lock)
{might_sleep();if (__mutex_trylock_fast(lock))return 0;return __mutex_lock_interruptible_slowpath(lock);
}EXPORT_SYMBOL(mutex_lock_interruptible);
  • mutex_trylock
int __sched mutex_trylock(struct mutex *lock)
{bool locked;MUTEX_WARN_ON(lock->magic != lock);locked = __mutex_trylock(lock);if (locked)mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);return locked;
}
EXPORT_SYMBOL(mutex_trylock);

mutex_lock()与mutex_lock_interruptible()的不同之处为,前者引起的睡眠不能被信号打断,而后者则可以被打断。mutex_trylock()则用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。

mutex的使用方法和信号量用于互斥的场合完全一样。

参考资料:

《Linux设备驱动开发详解 —— 基于最新的Linux 4.0内核》 宋宝华 编著,机械工业出版社

问题7

问:如何分配内存时指定其不被释放?

备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。

答:

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。

在Linux中,可以使用mlock函数来防止特定区域的内存被操作系统自动回收

mlock是一个系统调用,用于将指定的内存区域锁定在物理内存中,防止其被交换到磁盘上。当内存区域被锁定时,操作系统将保证该区域的数据始终在物理内存中,从而提高访问速度和安全性。

mlock函数的原型如下:

#include <sys/mman.h>

int mlock(const void *addr, size_t len);

参数说明:

  • addr:指向要锁定的内存区域的起始地址。
  • len:要锁定的内存区域的长度,以字节为单位。

返回值:

mlock函数成功时返回0,失败时返回-1,并设置errno来指示错误类型。

注意:mlock函数需要特权权限才能使用,通常只有root用户或具有CAP_IPC_LOCK权限的用户才能调用该函数。

实例:

下面是一个示例代码,展示如何使用mlock函数将指定的内存段进行锁定:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *buffer = (char *)malloc(1024); // 分配一个大小为 1KB 的内存空间if (mlock((void*) buffer, sizeof(buffer)) == -1) {perror("Failed to lock memory");exit(-1);} else {printf("Memory locked successfully\n");// 这里可以对已经锁定的内存进行读写等操作munlock((void*) buffer, sizeof(buffer)); // 解除内存锁定free(buffer); // 释放内存空间}return 0;
}

上述代码:

1)首先通过mlock函数分配了一个大小为1KB的内存空间;

2)然后调用mlock()函数将其锁定;

3)接着可以对已经锁定的内存进行读写等操作;

4)最后,通过munlock函数解除内存锁定并释放相应的内存空间。

mlock函数在以下情况下常常被使用:

  • 对于需要频繁访问的敏感数据,可以使用mlock来确保其始终在物理内存中,避免因为内存交换而导致的性能下降。
  • 对于包含敏感信息的内存区域,可以使用mlock来防止其被交换到磁盘上,提高数据的安全性。

底层机制:

mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志)。然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数)。如果没有找到,会调用handle_mm_fault主动触发缺页处理。handle_mm_fault函数是内核通用的缺页异常处理例程,如vma是匿名映射,则分配物理页面然后建立页表映射关系;若vma是文件映射,则会从磁盘读取对应的文件页(如果page cache没有对应页面时)到内存的page cache,然后建立虚拟页面建立页表映射关系。

对于一些对时间有严格要求的应用场景,访问时按需分配和调页机制的时延可能是未知的,内核中提供了mlock相关的系统调用,用于将虚拟内存区域对应的物理页面“锁在”内存中。内核对应mlock锁住的页面实际上它主要做了两步比较重要的操作:(1)调用mlock的时候就将所需要的物理页面准备好;(2)内存回收时当扫描到相关的物理页面时,将其放入不可回收的lru链表。第一步保证访问的虚拟地址对应的物理页面在内存中,第二步保证了锁住的页面不会被回收

参考资料:

一文剖析mlock锁原理

http://www.fp688.cn/news/145168.html

相关文章:

  • 联通公司做网站吗搜索引擎网页
  • 公司网站市场价如何做好互联网营销推广
  • 网站制作公司 重庆个人如何在百度上做广告
  • pos机网站模板数字营销公司排行榜
  • 建设电影网站选服务器怎么选杭州百度快照优化公司
  • 深圳企业网站制作公司刚刚刚刚刚刚好痛
  • 怎么做网站推广世界杯有哪些搜索引擎
  • 微信小程序官网首页登录入口seo网络贸易网站推广
  • 做文学网站算不算开公司怎么做推广网络
  • 怎么做网站文章优化成都全网推广哪家专业
  • 东莞网站平台后缀专业代写文案的公司
  • 网站开发合同书社交媒体营销案例
  • 网站设计公司 上海培训机构是干什么的
  • 外国平面设计网站有哪些seo网站优化培训公司
  • 太原网站设计专业海外网站推广
  • 广州优化网站免费发外链的网站
  • 协会网站建设需要注意什么免费接单平台
  • 五合一网站建设方案百度百度一下
  • 招远网站建设招聘百度网站推广
  • 厦门php商城网站建设百度百科官网入口
  • 购物商城网站建设方案子域名大全查询
  • 微信公众号是在哪个网站做的一键优化是什么意思
  • 小学生网上学做辅导哪个网站好附近广告公司
  • wordpress网站打开速度seo网站外链平台
  • 医院网站的建设外媒头条最新消息
  • 注册公司步骤搜索引擎排名优化技术
  • 理财公司网站建设方案免费seo教程资源
  • 备案网站建设方案书范文新乡seo推广
  • 做分享衣服网站的初衷是什么意思免费的网站推广软件下载
  • vi设计网站大全seo网站优化服务