p命名空间和c命名空间

本文介绍了Spring框架中p和c命名空间的使用。p命名空间用于属性注入,简化了XML配置文件中属性设置的过程;而c命名空间则用于构造器注入,允许直接在bean定义中指定构造函数参数。通过这两个命名空间,可以更方便地管理实体类的依赖注入。

p命名空间

  • 实体类中必须有set方法;
  • 实体类中必须有无参构造器(默认存在);
  • 导入p命名空间注入方式依赖。
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <bean id="demo1" class="com.Demo1" p:dog="小黄"/>
    <bean id="helloWorld" class="com.HelloWorld" p:a="a" p:b="b" p:demo1-ref="demo1"/>
    <!--等同于-->
    <!--<bean id="helloWorld" class="com.HelloWorld">-->
    <!--    <property name="a" value="a"/>-->
    <!--    <property name="b" value="b"/>-->
    <!--    <property name="demo1" ref="demo1"/>-->
    <!--</bean>-->
</beans>

c命名空间

  • 实体类中必须存在有参构造器;
  • 导入c命名空间注入方式依赖。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <bean id="demo1" class="com.Demo1" p:dog="小黄"/>
    <bean id="helloWorld" class="com.HelloWorld" c:a="a" c:b="b" c:demo1-ref="demo1"/>
    <!--等同于-->
    <!--<bean id="helloWorld"  class="com.HelloWorld">-->
    <!--    <constructor-arg  index="0"  value="a"></constructor-arg>-->
    <!--    <constructor-arg  index="1"  value="b"></constructor-arg>-->
    <!--    <constructor-arg  index="2"  ref="demo1"></constructor-arg>-->
    <!--</bean>-->
</beans>
<think> 我们正在讨论命名空间(namespace)虚拟内存(virtual memory)是否为同一回事。 根据引用[3]:命名空间是一种隔离机制,用于将一组进程放入容器中,彼此隔离,同时允许共享某些资源(如文件系统)。 而引用[2]解释虚拟内存:虚拟内存是一种内存管理技术,它将程序使用的虚拟地址映射到物理内存地址,提供内存抽象。 因此,命名空间虚拟内存是两个不同的概念: 1. **虚拟内存**:解决的是内存管理问题,通过分页/分段等技术让每个进程拥有连续的、独立的地址空间,同时提供内存保护、共享等功能。 2. **命名空间**:是Linux内核提供的一种资源隔离机制,用于实现容器(如Docker),它可以隔离进程的视图,包括PID(进程ID)、网络、文件系统挂载点等资源,使得不同命名空间中的进程拥有独立的资源视图。 所以,它们不是一回事。虚拟内存主要关注内存的抽象映射,而命名空间关注系统资源的隔离。 为了更清晰地说明,我们可以比较两者的关键点: | 特性 | 虚拟内存 | 命名空间 | |--------------|------------------------------|------------------------------| | **主要目的** | 内存管理,提供地址空间抽象 | 资源隔离,实现容器化 | | **作用对象** | 进程的地址空间 | 进程的资源视图(PID、网络等)| | **技术实现** | 页表、TLB、缺页中断等 | 内核数据结构,系统调用 | | **所属层次** | 内存管理子系统 | 内核的命名空间子系统 | 需要注意的是,一个进程的虚拟地址空间可以看做是进程独占的,但命名空间可以包含多个进程(一个容器内可以有多个进程)。 另外,引用[4]提到:内核线程的`mm`(内存描述符)为空,因此内核线程之间的调度不涉及地址空间切换。这说明了虚拟内存管理在内核线程用户进程上的差异。 总结:虚拟内存命名空间是Linux内核中两个独立的机制,分别解决不同的问题。 §§相关问题§§ 1. 命名空间如何实现资源隔离? 2. 虚拟内存管理中的页表映射具体是如何工作的? 3. 容器技术(如Docker)是如何同时利用命名空间虚拟内存的? </think> 命名空间虚拟内存是两种完全不同的技术概念,它们在操作系统中的作用机制目的截然不同。以下是详细对比分析: ### 1. **本质差异** | **特性** | **虚拟内存** | **命名空间** | |----------------|---------------------------------------|---------------------------------------| | **核心目的** | 内存管理抽象(地址映射)[^2] | 资源隔离(进程/容器隔离)[^3] | | **作用对象** | 内存地址空间 | 系统资源视图(PID/网络/文件系统等) | | **技术层级** | 硬件+操作系统协同实现(MMU单元与) | 纯内核软件抽象 | | **主要问题** | 解决物理内存不足地址空间碎片化 | 解决资源冲突权限控制 | ### 2. **工作原理对比** **虚拟内存** ($V = P \times T$) 通过页表(Page Table)建立虚拟地址$V$到物理地址$P$的映射: $$ V_{virtual} \xrightarrow{Page\ Table} P_{physical} $$ - 每个进程有独立页表(考引用[4]) - 内核空间共享固定映射(如Linux的3:1比例)[^1] **命名空间** 通过内核数据结构隔离资源视图: ```c struct nsproxy { struct uts_namespace *uts_ns; // 主机名隔离 struct ipc_namespace *ipc_ns; // IPC隔离 struct mnt_namespace *mnt_ns; // 文件系统隔离 //... }; ``` - 创建新命名空间时复制父命名空间指针 - 修改资源时触发写时复制(COW) ### 3. **交互关系图解** ```mermaid graph LR A[物理内存] -->|虚拟内存映射| B(进程1用户空间) A -->|共享映射| C(内核空间) D[硬件资源] -->|命名空间隔离| E(容器1) D -->|命名空间隔离| F(容器2) C -->|系统调用| B C -->|系统调用| E C -->|系统调用| F ``` ### 4. **关键区别实例** - **虚拟内存场景** 进程访问0x400000地址时,MMU通过页表将其重定位到物理地址0x8000,若页面未加载则触发缺页中断[^2]。 - **命名空间场景** 容器内运行`ps aux`仅显示该命名空间的进程,因PID命名空间隔离了进程ID视图[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值