PV操作--demo test

本文深入探讨了操作系统中的PV操作及其实现原理,并通过一个生产者消费者问题的代码示例,展示了信号量机制如何协调进程间的资源竞争。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

      操作系统的pv操作的认识,每次都有不一样的感受,近期自己再一次接触到PV操作,生产者消费者的问题,从代码的角度体会了一下,有不一样的认识和体会。


认识

      信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

这里写图片描述

对于PV操作的一些疑问:

  • S大于0的时候不唤醒资源,小于0的时候为什么要唤醒资源?
    S大于0表示,有临界资源可以使用,也就是这个时候没有进程阻塞在资源上,所以不需要被唤醒。S小于0的时候,我们要说一下V操作的原语,本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源,所以这个的前提是V操作哦。

  • S的绝对值表示等待的进程数,同时又表示临界资源,如何区分一下呢?
    当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。


demo

      一下是动手实现的一个demo,感觉挺有意思的:

//生产者消费者问题
//客户端
public class ProducerConsumer{
    public static void main(String[] args){
        SyncStack ss =new SyncStack();
        Producer p =new Producer(ss);
        Customer c =new Customer(ss);
        new Thread(p).start();
        new Thread(c).start();

    }
}

//生产的产品
class Product{
    int id;
    //构造函数
    Product(int _id){
        this.id=_id;
    }

    public String toString(){
        return "产品:"+id;
    }
}

//容器
class SyncStack{
    int index=0;
    Product[] Arrpro =new Product[10];  //容器最多可以放10个产品

    //容器中放产品的方法
    public synchronized void push(Product pro){
        //如果满了
        if(index ==Arrpro.length){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.notify(); //唤醒正在等待的线程

        Arrpro[index]=pro;
        index++;
    }
    //容器中取产品
    public  synchronized Product pull(){
        if(index ==0){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

        }
        this.notify(); //唤醒正在等待的线程
        index--;
        return Arrpro[index];

    }
}

//生产者--申请一个线程
class Producer implements Runnable{
    SyncStack ss =new SyncStack();
    Producer(SyncStack _ss){
        this.ss=_ss;
    }
    public void run(){
        //生产者能够造20个产品
        for(int i=0;i<20;i++){
            Product pro=new Product(i);
            ss.push(pro);
            System.out.println("生产了"+pro);
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

//消费者
class Customer  implements Runnable{
    SyncStack ss =new SyncStack();
    Customer(SyncStack _ss){
        this.ss=_ss;
    }

    public void run(){
        for(int i=0;i< 20;i++){
            Product pro =ss.pull();
            System.out.println("消费了"+pro);

            try{
                Thread.sleep(2000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }       
    }
}

结语

      学习是在不断的认识,不断重复的基础上的,每次学习都get到一个点,会觉得很有意思。

### Kubernetes Volume 类型及使用方法 Kubernetes 中的 Volume 是一种用于管理容器间数据共享和持久化的机制。Volume 不仅提供了数据存储的功能,还具备生命周期独立于容器的特点,能够在容器重启时保留数据[^2]。下面详细介绍常见的 Volume 类型及其使用方法。 #### 1. **EmptyDir** `EmptyDir` 是最简单的 Volume 类型,它会在 Pod 启动时创建一个空目录,并将其挂载到 Pod 内的所有容器中。这种类型的 Volume 使用宿主机上的磁盘空间或内存(如果指定了 `medium: Memory`)。当 Pod 被删除时,`EmptyDir` 中的数据也会随之丢失[^3]。 ##### 配置示例: ```yaml apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: nginx name: container-1 volumeMounts: - mountPath: /data name: data-volume volumes: - name: data-volume emptyDir: {} ``` --- #### 2. **HostPath** `HostPath` 将宿主机上的文件或目录挂载到 Pod 内部。这种方式适用于开发环境或测试用途,但在生产环境中需谨慎使用,因为它依赖具体的节点路径。 ##### 配置示例: ```yaml apiVersion: v1 kind: Pod metadata: name: hostpath-example spec: containers: - image: busybox command: ["sleep", "1000"] name: hostpath-container volumeMounts: - mountPath: /host-data name: example-hostpath-volume volumes: - name: example-hostpath-volume hostPath: path: /data type: Directory ``` --- #### 3. **PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)** `PersistentVolume` 是集群管理员预先配置好的存储资源,而 `PersistentVolumeClaim` 则是由用户发起的对存储资源的请求。两者配合使用可以实现动态分配和回收存储资源[^5]。 ##### PVC 示例: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi ``` ##### PV 示例: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv2 spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: path: /exports server: nfs-server.example.com ``` --- #### 4. **ConfigMap 和 Secret** 这两种特殊的 Volume 类型主要用于存储配置信息和敏感数据。`ConfigMap` 存储非保密的配置项,而 `Secret` 则适合保存密码、密钥等敏感信息[^3]。 ##### ConfigMap 示例: ```yaml apiVersion: v1 kind: Pod metadata: name: configmap-demo-pod spec: containers: - name: demo image: alpine command: ["sh", "-c", "cat /etc/config/username && sleep 3600"] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config ``` ##### Secret 示例: ```yaml apiVersion: v1 kind: Pod metadata: name: secret-demo-pod spec: containers: - name: demo image: alpine command: ["sh", "-c", "cat /etc/secret-volume/password && sleep 3600"] volumeMounts: - name: secret-volume mountPath: /etc/secret-volume volumes: - name: secret-volume secret: secretName: my-secret ``` --- #### 5. **NFS (Network File System)** `NFS` 卷允许将远程 NFS 共享挂载到 Pod 中。它是分布式存储的一种常见实现方式[^5]。 ##### 配置示例: ```yaml apiVersion: v1 kind: Pod metadata: name: nfs-client-pod spec: containers: - name: nfs-client-container image: busybox command: ["sleep", "1000"] volumeMounts: - mountPath: "/mnt/nfs" name: nfs-storage volumes: - name: nfs-storage nfs: server: nfs-server.example.com path: "/" ``` --- #### 6. **其他常用 Volume 类型** 除了上述提到的类型外,Kubernetes 还支持许多其他的 Volume 类型,例如: - **AWS EBS**: Amazon Web Services Elastic Block Store 的集成。 - **GCE PD**: Google Compute Engine Persistent Disk 支持。 - **Cinder**: OpenStack Cinder 卷的支持。 - **Azure Disk/Azure File**: Microsoft Azure 提供的存储方案。 每种类型都有其特定的适用场景和配置细节,可以根据实际需求选择合适的类型[^4]。 --- ### 总结 在 Kubernetes 中,Volume 是实现数据持久化和共享的重要工具。不同的 Volume 类型适应了多样化的应用场景,从临时存储 (`EmptyDir`) 到持久化存储 (`PersistentVolume`),再到外部云存储服务的对接。合理选用 Volume 类型并正确配置参数是构建稳定可靠 K8s 应用的基础[^1]。 ---
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值