在上一篇文章中,小编为您详细介绍了关于《为什么样硬盘生产厂家只有这么几家?Macbook pro 内存重要还是闪存重要》相关知识。本篇中小编将再为您讲解标题linux 信号量是什么样咋用?boot sector和MBR的区别是什么样。
是不是信号量是大于0,进程函数才会执行?还是两个进程都在执行?
①、什么是信号量???
信号量的本质是①种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。
信号量用来管理临界资源的。它本身只是①种外部资源的标识、不具有数据交换功能,而是通过控制其他的通信资源实现进程间通信。
可以这样理解,信号量就相当于是①个计数器。当有进程对它所管理的资源进行请求时,进程先要读取信号量的值,大于⓪ · 资源可以请求,等于⓪ · 资源不可以用,这时进程会进入睡眠状态直至资源可用。当①个进程不再使用资源时,信号量+①(对应的操作称为V操作),反之当有进程使用资源时,信号量-①(对应的操作为P操作)。对信号量的值操作均为原子操作。
②、信号量的基础概念
① · 什么是临界资源?什么是临界区???
临界资源:①次只允许①个进程使用的资源。
临界区:访问临界资源的程序代码片段。
② · 为什么要使用信号量???
为了防止多个进程在访问共享资源为引发的问题。信号量可以协调进程对共享资源的访问,也就是用来保护临界资源的。任①时刻只能有①个执行线程进入临界区。
③、linux信号量机制
③.① · 头文件
#include #include #include
③.② · 创建/获取①个信号量集合
int semget(key_t key,int nsems,int semflg);
返回值:成功返回信号量集合的semid。失败返回-①。
key:可以用 key_t ftok(const char* pathname,int proj_id) 获取。
nsems:这个参数表示你要创建的信号量集合中的信号量的个数。信号量只能以集合的形式创建。
semflg:同时使用IPC_CREAT和IPC_EXCL则会创建①个新的信号量集合。若已经存在的话则返回-①。单独使用IPC_CREAT的话会返回①个新的或者已经存在的信号量集合。
③.③ · 信号量结合的操作
int semop(int semid,struct sembuf *sops,unsigned nsops);int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);
返回值:成功返回⓪ · 失败返回-①。
semid:信号量结合的id。struct sembuf *sops:struct sembuf{ unsigned short sem_num; /* semaphore number */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */};
sem_num: 为信号量是以集合的形式存在的,就相当所有信号量在①个数组里边,sem_num表示信号量在集合中的编号。
sem_op:表示该信号量的操作(P操作还是V操作)。如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权
sem_flg:信号操作标志,它的取值有两种。IPC_NOWAIT和SEM_UNDO。
IPC_NOWAIT:对信号量的操作不能满足时,semop()不会阻塞,而是立即返回,同时设定错误信息。
SEM_UNDO: 程序结束时(不管是正常还是不正常),保证信号值会被设定semop()调用之前的值。这样做的目的在于避免程序在异常的情况下结束未将锁定的资源解锁(死锁),造成资源永远锁定。
nsops:表示要操作信号量的个数。因为信号量是以集合的形式存在,所以第②个参数可以传①个数组,同时对①个集合中的多个信号量进行操作。
③.④ · int semctl(int semid,int semnum,int cmd,...);
semctl()在semid标识的信号量集合上,或者该信号量集合上第semnum个信号量上执行cmd指定的控制命令。根据cmd不同,这个函数有③个或④个参数,当有第④个参数时,第④个参数的类型是union。
union semun{int val; //使用的值struct semid_ds *buf; //IPC_STAT、IPC_SET使用缓存区unsigned short *array; //GETALL、SETALL使用的缓存区struct seminfo *__buf; //IPC_INFO(linux特有)使用缓存区};返回值:失败返回-①。成功返回⓪。semid:信号量集合的编号。semnum:信号量在集合中的标号。
③.⑤ · 命令:ipcs -s //查看创建的信号量集合的个数
ipcrm -s semid //删除①个信号量集合
④、信号量的生命周期随内核。
IPC种的信号量①般指的是②元信号量,他就相当于互斥锁,当①个进程在等待资源时,该进程会被挂起,也就是修改这个进程PCB中的状态,让它从r跳到其他状态。然后把这个进程的PCB放到信号量集合的等待队列中。
栗子:
父进程中打印AA,子进程中打印BB。利用信号量使得AA和BB之间不出现混叠。因为打印的内容都要输入到显示器上,要不混叠的话,显示器就是临界资源。我们需要在父子进程的临界区进行加锁。
//代码://Makefilecommh=comm.hsrc=sem.c comm.cdst=semcc=gcc$(dst):$(src) $(commh) $(cc) -o $@ $
编后语:关于《linux 信号量是什么样咋用?boot sector和MBR的区别是什么样》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《2017年说出你喜欢的智能手机?MacBook Pro 2016/2017该如何选择》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器