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

wordpress网站前台打开慢wordpress 七牛插件

wordpress网站前台打开慢,wordpress 七牛插件,广东省住房和城乡建设厅网站,建设英文网站的必要性进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…

进程间通信——信号量

目录

一、基本概念 

1.1 概念

1.2 基本操作

1.3 相关函数

1.3.1 semget创建/获取

1.3.2 semop操作信号量

1.3.3 semctl初始化/删除

二、代码操作

2.1 不用PV的

2.2 用PV 的

2.2.1 a.c

2.2.2 b.c

2.2.3 sem.h

 2.2.4 sem.c


一、基本概念 

1.1 概念

信号量本质上是一个计数器,用于记录可用资源的数量。它有两种类型的操作:P 操作(也称为 wait 操作)和 V 操作(也称为 signal 操作)。P 操作会将信号量的值减 1,表示请求一个资源V 操作会将信号量的值加 1,表示释放一个资源

当信号量的值为 0 时,表示没有可用资源,此时进程在请求资源时会被阻塞,直到其他进程释放资源。

临界资源:同一时刻只允许一个进程访问的资源

临界区:访问临界资源的代码段。这段代码执行了就会访问例如打印机之类的临界资源

1.2 基本操作

初始化:在使用信号量之前,需要对其进行初始化,设置初始值。这个值通常表示系统中某种资源的初始数量。
P 操作:当一个进程需要访问共享资源时,它首先执行 P 操作。如果信号量的值大于 0,那么 P 操作会成功执行,进程可以继续执行并使用资源,同时信号量的值减 1。如果信号量的值为 0,那么进程会被阻塞,放入与该信号量相关的等待队列中,直到其他进程执行 V 操作释放资源。
V 操作:当进程使用完共享资源后,它执行 V 操作。V 操作会将信号量的值加 1,如果有其他进程在等待该资源(即信号量的等待队列不为空),那么系统会从等待队列中唤醒一个进程,让它继续执行 P 操作以获取资源。

1.3 相关函数

1.3.1 semget创建/获取

semget 函数用于创建一个新的信号量集或获取一个已存在的信号量集的标识符

#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);
  • key:一个键值,用于标识信号量集。可以使用 ftok 函数生成一个唯一的键值,也可以使用特殊值 IPC_PRIVATE 来创建一个私有的信号量集,该信号量集只能由创建它的进程及其子进程访问。
  • nsems:指定信号量集中信号量的数量。如果是创建新的信号量集,必须指定该值;如果是获取已存在的信号量集,该值通常为 0。
  • semflg:标志位,用于指定创建信号量集的模式和权限等。常见的标志有:
    • IPC_CREAT:如果信号量集不存在,则创建它。
    • IPC_EXCL:与 IPC_CREAT 一起使用,若信号量集已存在,则返回错误。
    • 权限标志,如 0666 表示所有用户都有读写权限。
  • 成功时,返回一个非负整数,即信号量集的标识符(semid)。
  • 失败时,返回 -1,并设置 errno 来指示错误类型。

1.3.2 semop操作信号量

semop 函数用于对信号量集中的一个或多个信号量进行操作,如 P 操作(申请资源)和 V 操作(释放资源)

#include <sys/sem.h>int semop(int semid, struct sembuf *sops, unsigned nsops);
  • semid:信号量集的标识符,由 semget 函数返回。
  • sops:指向一个 struct sembuf 结构体数组的指针,每个 struct sembuf 结构体描述了对一个信号量的操作。struct sembuf 结构体的定义如下:
  • struct sembuf {unsigned short sem_num;  // 信号量在信号量集中的索引(从 0 开始)short          sem_op;   // 操作类型,正数表示释放资源(V 操作),负数表示申请资源(P 操作),0 表示等待信号量值为 0short          sem_flg;  // 标志位,常见的有 IPC_NOWAIT 表示非阻塞操作
    };
  • nsopssops 数组中元素的数量,即要执行的操作数量。

1.3.3 semctl初始化/删除

semctl 函数用于对信号量集进行控制操作,如初始化信号量的值、获取信号量的状态信息、删除信号量集等。

#include <sys/sem.h>int semctl(int semid, int semnum, int cmd, ...);
  • semid:信号量集的标识符,由 semget 函数返回。
  • semnum:信号量在信号量集中的索引(从 0 开始)。如果 cmd 不需要指定特定的信号量,则该值通常为 0。
  • cmd:要执行的控制命令,常见的命令有:
    • SETVAL:设置指定信号量的值,需要传递一个 int 类型的参数作为新值。
    • GETVAL:获取指定信号量的值,返回值即为信号量的当前值。
    • IPC_RMID:删除信号量集,不需要指定 semnum,也不需要额外的参数。
  • ...:可变参数,根据 cmd 的不同而有所不同。例如,当 cmd 为 SETVAL 时,需要传递一个 int 类型的参数作为新的信号量值。
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "sem.h"int main()
{sem_init(); // 创建并初始化信号量for(int i=0; i<5; i++){sem_p();printf("A");fflush(stdout);int n = rand() % 3; // 随机睡眠一段时间sleep(n);printf("A");fflush(stdout);sem_v();n = rand() % 3;sleep(n);}sleep(10);sem_destroy(); // 删除信号量
}

二、代码操作

2.1 不用PV的

a.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{for(int i=0;i<5;i++){printf("A");fflush(stdout);int n=rand()%3;sleep(n);printf("A");fflush(stdout);}
}

b.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{for(int i=0;i<5;i++){printf("B");fflush(stdout);int n=rand()%3;sleep(n);printf("B");fflush(stdout);}
}

 

  1. /a &./b& :在后台同时运行可执行文件 a 和 b ,[1] 10916 和 [2] 10917 分别是这两个后台进程的作业编号和进程号。

2.2 用PV 的

2.2.1 a.c

a.c使用信号量进行进程同步的C语言程序示例。

它演示了如何使用信号量来控制对共享资源的访问,以防止数据竞争和条件竞争

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "sem.h"int main()
{sem_init();//创建并初始化信号量//pfor(int i = 0; i < 5; i++ ){sem_p();printf("A");fflush(stdout);int n = rand() % 3;sleep(n);printf("A");fflush(stdout);sem_v();n = rand()%3;sleep(n);}//vsleep(10);sem_destroy();//删除信号量
}

2.2.2 b.c

 b.c它演示了如何使用信号量来控制对共享资源的访问。

在这个例子中,程序通过信号量来确保在打印字符'B'时不会有多个线程或进程同时执行,从而避免输出混乱。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "sem.h"
int main()
{sem_init();for(int i = 0; i < 5; i++ ){sem_p();printf("B");fflush(stdout);int n = rand() % 3;sleep(n);printf("B");fflush(stdout);sem_v();n = rand()%3;sleep(n);}}

2.2.3 sem.h

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>union semun
{int val;
};void sem_init();
void sem_p();
void sem_v();
void sem_destroy();

定义了一组与信号量操作相关的函数原型和一个用于信号量操作的联合体semun

这个联合体用于在信号量操作中传递信号量的值

这些函数原型定义了信号量操作的接口,下面是这些函数可能的实现方式:

  1. sem_init:初始化信号量。

  2. sem_p:执行信号量的P操作(wait操作),减少信号量的值,如果信号量的值小于0,则进程将被阻塞。

  3. sem_v:执行信号量的V操作(signal操作),增加信号量的值,如果有进程因等待此信号量而被阻塞,则它们可能会被唤醒。

  4. sem_destroy:销毁信号量,释放相关资源。

 2.2.4 sem.c

信号量操作实现

#include "sem.h"
static int semid = -1;void sem_init()
{semid = semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);//尝试创建一个新的信号了if( semid == -1 )//信号量可能存在{semid = semget((key_t)1234,1,0600);if( semid == -1){printf("sem err\n");return;}}else//初始化 1{union semun a; a.val = 1;if( semctl(semid,0,SETVAL,a) == -1){printf("semctl err\n");}}
}
void sem_p()
{struct sembuf buf;buf.sem_num = 0;buf.sem_op = -1;//pbuf.sem_flg = SEM_UNDO;//if( semop(semid,&buf,1) == -1)//可能阻塞{printf("p err\n");}}
void sem_v()
{struct sembuf buf;buf.sem_num = 0;buf.sem_op = 1;//vbuf.sem_flg = SEM_UNDO;//if( semop(semid,&buf,1) == -1){printf("v err\n");}
}
void sem_destroy()
{if( semctl(semid,0,IPC_RMID) == -1){printf("rm semid err\n");}
}

sem_init 函数 初始化一个信号量


文章转载自:

http://FrTVY6aX.snnkt.cn
http://n8hZ8WN9.snnkt.cn
http://8ugcVq3S.snnkt.cn
http://Gp1Nofws.snnkt.cn
http://ggPs5hu6.snnkt.cn
http://qh25FWpd.snnkt.cn
http://a3Mr17Ci.snnkt.cn
http://j5V3j25K.snnkt.cn
http://XXUkRDwt.snnkt.cn
http://j8bLg8Ni.snnkt.cn
http://F6B8qotg.snnkt.cn
http://nyhkRnqZ.snnkt.cn
http://TzFROKP5.snnkt.cn
http://FQcXYZ2b.snnkt.cn
http://Ez6BppWc.snnkt.cn
http://FZI4NJK4.snnkt.cn
http://kkzuBpha.snnkt.cn
http://xnzlVZO5.snnkt.cn
http://slvA5FJZ.snnkt.cn
http://whysfSYL.snnkt.cn
http://2lDbu0ir.snnkt.cn
http://KnQG5Ysa.snnkt.cn
http://5zWsVZq5.snnkt.cn
http://Tzz7PpPd.snnkt.cn
http://kYrjn24u.snnkt.cn
http://yTrKT0GQ.snnkt.cn
http://Y5fJDLra.snnkt.cn
http://vuU2zhAu.snnkt.cn
http://lrZNHsZm.snnkt.cn
http://hi6bM0k1.snnkt.cn
http://www.dtcms.com/wzjs/689532.html

相关文章:

  • 如何制作网上商城网站优化搜索排名
  • 建网站需多少钱工业设计专业三大软件
  • 做交易网站需要办什么证网站开发合同书
  • 企业网站策划过程南京做网站制作公司
  • 网站建设 尚瑞科技长春网站建设于健
  • 做网站大图素材兰州网站seo分析
  • 城乡建设部统计网站思途建站
  • 江阴哪家做网站便宜网站域名管理中心
  • 设计软件免费下载网站wamp做的网站标签图标
  • 免费建站网站seo西安企业网站
  • 哪里有未成年做的网站取个网站建设公司名字
  • 域名备案企业网站内容手机网站建设的现状
  • 湖南医院响应式网站建设企业应用市场app下载安装到手机
  • 做外贸 用国内空间做网站建设银行个人网银网站
  • 建网站的域名是什么意思wordpress无法显示文章
  • 北京网站建设的公天津建站方案
  • 龙岗网站优化公司案例Wordpress网站仿站
  • 公众号和网站小城镇建设期刊网站
  • 电子商务网站平台建设策划社区网站优化
  • 哪些企业必须用网站湖州高端网站设计
  • 排名前十的网站盐城公司网站建设电话
  • 我的世界做壁纸网站企业网站代备案
  • 百度aipage智能建站腾讯云域名管理
  • 余姚网站seo运营用front page2003做网站的导航条
  • 网站定制营销自建网站怎么做后台管理系统
  • 漯河网站建设e注册网站手机号收验证码
  • iis7搭建aspx网站crm系统解决方案
  • 在什么网站上做自媒体商标与logo的区别
  • 网站怎么下载视频网络网站建
  • 最新网站查询大连甘井子区