加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 有一个基于线程的mprotect吗?

发布时间:2020-12-13 23:24:53 所属栏目:Linux 来源:网络整理
导读:mprotect()用于保护内存页面,例如,使页面为只读.它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面.有没有办法以不同的方式为不同的线程保护页面?例如,1个线程可以写入页面P,而我程序中的所有其他线程只能从P读取. 解决方法
mprotect()用于保护内存页面,例如,使页面为只读.它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面.有没有办法以不同的方式为不同的线程保护页面?例如,1个线程可以写入页面P,而我程序中的所有其他线程只能从P读取.

解决方法

如果在“clone”系统调用中使用CLONE_VM标志创建线程(这通常称为线程),则MMU设置与父线程相同.

这意味着两个线程都可以进行写访问.

如果你不使用CLONE_VM标志,那么两个线程根本没有共享内存!

(pthread_create()在内部设置CLONE_VM标志).

有可能做你想做的事 – 但这将是非常困难的:

使用共享内存函数(例如shmget())而不是标准函数(例如malloc())分配所有内存块.

如果创建了新线程,则直接使用“clone()”而不是“pthread_create()”且未设置CLONE_VM标志.

共享内存在线程之间共享,并且由“正常”内存分配函数(例如malloc())创建的线程不在线程之间共享. mmap()映射内存也是如此.

创建新线程时,会复制此类内存块(由malloc或mmap创建),以便两个线程在同一地址拥有自己的内存块副本.如果一个线程写入此地址,则另一个线程将看不到更改.

分配更多“共享”内存相当棘手.如果只应在分配线程和未创建的子线程之间共享内存,这很容易.很难在已经运行的线程之间或作为不同已经运行的线程的(间接)子线程的线程之间共享内存.

线程没有共享堆栈内存,因此无法访问彼此的堆栈.

默认情况下不会共享全局变量和“静态”变量 – 为了使它们在线程之间“共享”,需要一些棘手的编程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读