描述
编辑
以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
分类
编辑
整型信号量(integer semaphore):信号量是整数
记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识
二进制信号量(binary semaphore):只允许信号量取0或1值
每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述)
semaphore = record
value: integer
queue: ^PCB
end
其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。
s.value>=0时,s.queue为空;
s.value<0时,s.value的绝对值为s.queue中等待进程的个数;
特性
编辑
抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。
操作方式
编辑
对信号量有4种操作(include<semaphore>):
1. 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value)
2. 等信号(wait),也可叫做挂起(suspend)int sem_wait(sem_t *sem)
3. 给信号(signal)或发信号(post) int sem_post(sem_t *sem)
4.清理(destroy) int sem_destory(sem_t *sem)[1]
创建
编辑
同共享内存一样,系统中同样需要为信号量集定制一系列专有的操作函数(semget,semctl等)。系统命令ipcs可查看当前的系统IPC的状态,在命令后使用-s参数。使用函数semget可以创建或者获得一个信号量集ID,函数原型如下:
#include <sys/shm.h>
int semget( key_t key, int nsems, int flag)
函数中参数key用来变换成一个标识符,每一个IPC对象与一个key相对应。当新建一个共享内存段时,使用参数flag的相应权限位对ipc_perm结构中的mode域赋值,对相应信号量集的shmid_ds初始化的值如表1所示。
shmid_ds结构初始化值表
ipc_perm结构数据
初 值
ipc_perm结构数据
初 值
Sem_otime
0
Sem_nsems
Nsems
Sem_ctime
系统当前值
参数nsems是一个大于等于0的值,用于指明该信号量集中可用资源数(在创建一个信号量时)。当打开一个已存在的信号量集时该参数值为0。函数执行成功,则返回信号量集的标识符(一个大于等于0的整数),失败,则返回–1。函数semop用以操作一个信号量集,函数原型如下:
#include <sys/sem.h>
int semop( int semid, struct sembuf semoparray[], size_t nops )
函数中参数semid是一个通过semget函数返回的一个信号量标识符,参数nops标明了参数semoparray所指向数组中的元素个数。参数semoparray是一个struct sembuf结构类型的数组指针,结构sembuf来说明所要执行的操作,其定义如下:
struct sembuf{
unsigned short sem_num
short sem_op
short sem_flg
}
在sembuf结构中,sem_num是相对应的信号量集中的某一个资源,所以其值是一个从0到相应的信号量集的资源总数(ipc_perm.sem_nsems)之间的整数。sem_op指明所要执行的操作,sem_flg说明函数semop的行为。sem_op的值是一个整数,如表2所示,列出了详细sem_op的值及所对应的操作。
sem_op值详解
Sem_op
操 作
正数
释放相应的资源数,将sem_op的值加到信号量的值上
0
进程阻塞直到信号量的相应值为0,当信号量已经为0,函数立即返回。如果信号量的值不为0,则依据sem_flg的IPC_NOWAIT位决定函数动作。sem_flg指定IPC_NOWAIT,则semop函数出错返回EAGAIN。sem_flg没有指定IPC_NOWAIT,则将该信号量的semncnt值加1,然后进程挂起直到下述情况发生。信号量值为0,将信号量的semzcnt的值减1,函数semop成功返回;此信号量被删除(只有超级用户或创建用户进程拥有此权限),函数smeop出错返回EIDRM;进程捕捉到信号,并从信号处理函数返回,在此情况将此信号量的semncnt值减1,函数semop出错返回EINTR
负数
请求sem_op的绝对值的资源。如果相应的资源数可以满足请求,则将该信号量的值减去sem_op的绝对值,函数成功返回。当相应的资源数不能满足请求时,这个操作与sem_flg有关。sem_flg指定IPC_NOWAIT,则semop函数出错返回EAGAIN。sem_flg没有指定IPC_NOWAIT,则将该信号量的semncnt值加1,然后进程挂起直到下述情况发生:当相应的资源数可以满足请求,该信号的值减去sem_op的绝对值。成功返回;此信号量被删除(只有超级用户或创建用户进程拥有此权限),函数smeop出错返回EIDRM:进程捕捉到信号,并从信号处理函数返回,在此情况将此信号量的semncnt值减1,函数semop出错返回EINTR
基本流程
编辑
下面实例演示了关于信号量操作的基本流程。程序中使用semget函数创建一个信号量集,并使用semop函数在这个信号集上执行了一次资源释放操作。并在shell中使用命令查看系统IPC的状态。
(1)在vi编辑器中编辑该程序。
程序清单14-10 create_sem.c 使用semget函数创建一个信号量
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int sem_id
int nsems = 1
int flags = 0666
struct sembuf buf
sem_id = semget(IPC_PRIVATE, nsems, flags)/*创建一个新的信号量集*/
if ( sem_id <0 ){
perror( "semget ")
exit (1 )
}
/*输出相应的信号量集标识符*/
printf ( "successfully created a semaphore : %d\n", sem_id )
buf.sem_num = 0/*定义一个信号量操作*/
buf.sem_op = 1/*执行释放资源操作*/
buf.sem_flg = IPC_NOWAIT/*定义semop函数的行为*/
if ( (semop( sem_id, &buf, nsems) ) <0) { /*执行操作*/
perror ( "semop")
exit (1 )
}
system ( "ipcs -s " )/*查看系统IPC状态*/
exit ( 0 )
}
(2)在vmware中编译该程序如下:
gcc -o a.o testc_semaphore.c
(3)在shell中运行该程序如下:
./a3.o
successfully created a semaphore : 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 zcr 666 1
在上面程序中,用semget函数创建了一个信号量集,定义信号量集的资源数为1,接下来使用semop函数进行资源释放操作。在程序的最后使用shell命令ipcs来查看系统IPC的状态。
%注意:命令ipcs参数-s标识查看系统IPC的信号量集状态。
希望能帮到你,满意望采纳哦。
表示无可用的资源。当sem等于零时,表示无可用的资源,也没有阻塞的线程。
信号量sem是一整数,sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数。
应该是SEM和SEO的区别吧!
SEM:竞价排名;SEO:搜索引擎优化
竞价排名的优点:
1
见效快、充值后设置关键词价格后即刻就可以进入百度排名前十,位置可以自己控制。
2
关键词数量无限制、可以在后台设置无数的关键词进行推广,数量自己控制,没有任何限制。
3
关键词不分难易程度、不论多么热门的关键词,只要你想做,你都可以进入前三甚至
END
竞价排名的缺点:
1
价格高昂、竞争激烈的词,单价可以达到数元甚至数几十元RMB,一个月就要消费数千元甚至数万元RMB,如果是长期做,那就需要长期花费如此高昂的费用。
2
管理麻烦、如果要保证位置和控制成本,需要每天都进行价格查看,设置最合适的价格来进行竞价。
3
人员管理、需要专人进行关键词的筛选,挑取适合的关键词,衡量价格,检查效果,这样就会再付出一位员工的工资(武汉负责这方面的人员月薪在2000-4000左右)。
4
引擎的各自独立性、每个引擎都是各自单独的,你在百度做了竞价后,谷歌那不会出现排名,雅虎那也不会出现排名,如果你想要所有引擎都出现排名,那就要重复花费数倍的推广费用。
5
稳定性差、一旦别人出的价格比你的高,那你就会排名落后;一旦你的帐户中每天的预算消费完了,那你的排名立刻就会消失。
6
恶意点击、竞价排名的恶意点击非常多,你的一半的广告费都是被竞争对手、广告公司、闲着无聊的人给恶意点击消费掉了,这些人不会给你带来任何效益,而且你也无法预防。
seo的优点:
1
价格低廉、网站优化维持一年排名的费用也许只是做竞价一到两个月的费用,相比竞价要便宜的多。
2
管理简单、企业无需专人管理,一切都由网站优化服务商为您维护,企业所要做的只是不定期观察下排名位置是否稳定即可,省下了您聘请专业人员为您管理的费用。
3
引擎通吃、网站优化最大的好处就是没有引擎的各自独立性,即便您只要求针对百度进行优化,但结果是谷歌、雅虎还是其他的搜索引擎,排名都会相应的提高,会在无形中给您带来更多的有效访问者。
4
不用担心恶意点击、我们所做的效果是自然排名,不会按点击付费,不论您的竞争对手如何点,都不会给您浪费一分钱。
5
稳定性强、用正规网站优化手法做好了排名的网站,只要维护得当,排名的稳定性非常强,所在位置数年时间也许都不会变动。
END
seo的缺点:
见效慢、通过网站优化获得排名是无法速成的,一般难度的词大约需要2-3个月的时间,如果难度更大的词则需要4-5个月甚至更久,建议企业可以在销售淡季进行网站优化工作,到了销售旺季时排名也基本稳定了。
排名规则的不确定性、由于搜索引擎对排名有各自的不同规则,有可能在某天某个搜索引擎对排名规则进行了改变,那时也许就会出现原有的排名位置发生变动,这个是很正常的现象,届时我们将会以最快的速度研究最新的规则,将网站重新恢复排名。
关键词区分难易程度、竞争过于火爆的关键词,例如、手机、MP3等,做优化排名难度是很大的,这需要非常长久的时间,而且价格也会非常高昂,所以难度太大的词不适合做优化。
关键词数量有限、做网站优化一个页面推荐只做一个关键词,最多不超过3-4个,其中1-2个是主词,剩余1-2个是分词,做不到竞价排名那种想做多少做多少的效果。
排名位置在竞价排名之后、这个是由百度的规则决定的,自然排名所在的位置只能在竞价排名的网站之后,如果第一页全都做满了竞价排名,那自然排名只能出现在第二页,目前此种情况仅百度存在。
注意事项
综合分析、 综合以上优点与缺点相比,网站优化的整体效果是远强于竞价排名的,价格也是比竞价排名低了数倍,那些声称“这么贵,那不如做竞价排名了”的企业都只是用网站优化的价格与他做了每日成本控制的百度竞价相比的,他们没有考虑网站优化后的网站在所有引擎都会有排名提高的效果,也忽略了做其他搜索引擎竞价将要花费的成本所造成的错觉。
最后竞价排名和网站优化各有千秋,推荐广告预算充足的客户,可以考虑先做竞价排名一段时间,在这个时间内同时进行网站优化的工作,当网站优化工作结束,排名达到要求后,再撤掉竞价排名,这样可以很好的过渡,不会对营销造成影响,对于任何企业,营销都是第一位,不论网站优化还是竞价排名都是为营销而服务的,这个才是做广告的核心目的。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)