Oracle 下 unpin 的cursor 才能被移除

最近南方的雨下的很烦人。 暴雨,一下就是一天,不过平时我也不怎么出门,所以也就无所谓了。 在家看看电影,做做测试,在补补觉,周末2天也就过去了。

刚才owind 让我做了个测试。 正在使用的cursor 能否被移除。 关于cursor的东西, 几个星期前就准备整理一下的,可是看了一下官方文档,东西太多了。 一时也没不知道从哪下手。 就放那了。 今天这个测试也算对cursor 知识的一个开始。

测试就为证明以下两句话:

cursor is pined ,can't be age out. only freeable cursor can be flush.

The buffer is now unpinned and is a candidate for immediate aging out

--创建测试表

SQL>create table td as select * from user_tables;

--session A 修改表,注意没有commit

SYS@anqing2(rac2)> update td set tablespace_name='users';

719 rows updated.

--Session B修改表,同样不commit

SYS@anqing2(rac2)> update td set tablespace_name='users';

-- session A 没有commit的情况下,这里是hang住的,验证一下

--查看session ASID

SYS@anqing2(rac2)> select sid from v$mystat where rownum=1;

SID

----------

130

--查看Lock 信息

SYS@anqing2(rac2)> select sid,lmode,request from v$lock where type in ('TX','TM');

SID LMODE REQUEST

---------- ---------- ----------

124 0 6

130 3 0

124 3 0

130 6 0

DML操作一般要加两个锁,一个是对表加模式为3TM锁,一个是对数据行的模式为6TX锁。只要操作的不是同一行数据,是互不阻塞的。

根据查询结果,我们看到,Session B 已经拿到了3级别的TM 锁, 现在在等待6级别的TX锁。 但6级的TX 锁在session A130)持有,所以session B124)处于等待状态。

-- Flush shared pool

SYS@anqing2(rac2)> alter system flush shared_pool;

System altered.

-- 查看v$sql 里,对应的cursor 是否存在

SYS@anqing2(rac2)> select sql_text from v$sql where sql_text like 'update%';

SQL_TEXT

--------------------------------------------------------------------------------

update td set tablespace_name=:"SYS_B_0"

我们的cursor 还存在v$sql 里。

-- session A 提交

SYS@anqing2(rac2)> commit;

Commit complete.

-- 提交之后,session A 对应的Lock 就释放了。

SYS@anqing2(rac2)> select sid,lmode,request from v$lock where type in ('TX','TM');

SID LMODE REQUEST

---------- ---------- ----------

124 3 0

124 6 0

--session B 结束hang状态后在commit

SYS@anqing2(rac2)> update td set tablespace_name='users';

719 rows updated.

SYS@anqing2(rac2)> commit;

Commit complete.

-- 全部commit 之后,我们不flush,查看

SYS@anqing2(rac2)> select sql_text from v$sql where sql_text like 'update%';

SQL_TEXT

--------------------------------------------------------------------------------

update td set tablespace_name=:"SYS_B_0"

对应的cursor 还存在

--我们flush 一下

SYS@anqing2(rac2)> alter system flush shared_pool;

System altered.

--查看cursor

SYS@anqing2(rac2)> select sql_text from v$sql where sql_text like 'update%';

刚才的cursor 已经不存在了。

以上测试只为证明一句话:

正在被pin 住的cursor 不能从shared pool里移除,只有unpincursor 才能被移除。

-------------------------------------------------------------------------------------------------------

Blog http://blog.youkuaiyun.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(); DBA2 群:62697977() DBA3 群:62697850()

DBA 超级群:63306533(); DBA4 群: 83829929 DBA5群: 142216823

DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

### IOMMU Unpin 的定义、功能及工作原理 IOMMU(Input/Output Memory Management Unit)是一种硬件组件,用于管理设备对系统内存的访问。它通过建立虚拟地址到物理地址的映射,确保设备能够安全地访问指定的内存区域[^3]。在某些场景下,IOMMU需要“固定”或“锁定”特定的内存页以供设备使用,这种操作称为“pin”。与之相对,“unpin”则是解除这种固定的约束。 #### IOMMU Unpin 的定义 IOMMU Unpin 是指解除对内存页的固定操作,允许这些内存页重新被操作系统调度或释放。通常,在设备需要访问特定内存,IOMMU会将这些内存页固定(pin),以防止它们被换出或重新分配给其他进程。当设备不再需要访问这些内存页,可以执行 unpin 操作以释放资源。 #### IOMMU Unpin 的功能 1. **释放内存资源**:通过解除对内存页的固定,操作系统可以重新调度或回收这些内存页,从而提高系统的整体资源利用率。 2. **优化性能**:避免长间固定不必要的内存页,减少对系统内存的压力。 3. **增强安全性**:通过动态管理内存页的固定状态,降低潜在的安全风险,例如防止恶意程序利用固定的内存页进行攻击。 #### IOMMU Unpin 的工作原理 IOMMU Unpin 的过程通常涉及以下几个步骤: 1. **检测设备是否完成访问**:IOMMU 或相关驱动程序会监控设备是否已经完成对特定内存页的访问。如果确认设备不再需要这些内存页,则触发 unpin 操作。 2. **更新 IOMMU 映射表**:IOMMU 会从其维护的映射表中移除与这些内存页相关的条目,从而解除虚拟地址到物理地址的映射关系。 3. **通知操作系统**:IOMMU 向操作系统发送信号,表明这些内存页已不再被固定,可以重新参与内存管理。 4. **释放内存页**:操作系统根据当前的内存需求决定是否立即回收这些内存页,或者将其重新分配给其他进程。 以下是 IOMMU Unpin 的一个简化代码示例,展示如何解除内存页的固定: ```c void iommu_unpin_pages(struct iommu_domain *domain, struct page **pages, int num_pages) { for (int i = 0; i < num_pages; i++) { // 解除页面的固定状态 unmap_page(domain, pages[i]); // 通知操作系统页面已被解除固定 put_page(pages[i]); } } ``` ### 总结 IOMMU Unpin 是一种重要的机制,用于解除对内存页的固定状态,从而优化系统资源的使用并提升性能和安全性。其核心功能包括释放内存资源、优化性能以及增强安全性,而其实现则依赖于 IOMMU 映射表的动态更新和与操作系统的协作[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值