sem

Linux-0.11操作系统实验5-信号量的实现和应用

天大地大妈咪最大 提交于 2020-02-04 14:35:29
实验环境: 信号量的实现和应用 实验任务: 在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 linux-0.11 中实现信号量,用生产者—消费者程序检验之。 用信号量解决生产者—消费者问题 实验要求: pc.c 程序需打开一个文件 buffer.txt 作为共享缓冲区,缓冲区同时最多只能保存 10 个数;创建一个生产者进程和N个消费者进程,其中生产者进程向缓冲区写入连续的整数,0,1,2,……,M,M>=500;消费者进程从缓冲区依次读取数字,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID 和数字输出到标准输出。 为什么要有信号量? 对于生产者 来说,当缓冲区满,也就是空闲缓冲区个数为0时,此时生产者不能继续向缓冲区写数,必须等待,直到有消费者从满缓冲区取走数后,再次有了空闲缓冲区,生产者才能向缓冲区写数。 对于消费者 来说,当缓冲区空时,此时没有数可以被取走,消费者必须等待,直到有生产者向缓冲区写数后,消费者才能取数。并且如果当缓冲区空时,先后有多个消费者均想从缓冲区取数,那么它们均需要等待,此时需要记录下等待的消费者的个数,以便缓冲区有数可取后,能将所有等待的消费者唤醒,确保请求取数的消费者最终都能取到数。 也就是说,当多个进程需要协同合作时,需要根据某个信息,判断当前进程是否需要停下来等待;同时,其他进程需要根据这个信息判断是否有进程在等待

3 互斥锁

我与影子孤独终老i 提交于 2020-01-25 17:45:17
互斥锁的初始值为1; 通过互斥锁保护临界区的代码执行; 1、初始化 osSemaphoreId_t sem_mutex ; int count = 0 ; sem_mutex = osSemaphoreNew ( 1 , 1 , NULL ) ; 2、线程1 osSemaphoreAcquire ( sem_mutex , osWaitForever ) ; count ++ ; printf ( "%d\r\n" , count ) ; osSemaphoreRelease ( sem_mutex ) ; 3、线程2 osSemaphoreAcquire ( sem_mutex , osWaitForever ) ; count ++ ; printf ( "%d\r\n" , count ) ; osSemaphoreRelease ( sem_mutex ) ; 4、结论 来源: CSDN 作者: 小C菜鸟 链接: https://blog.csdn.net/C_cai_niao/article/details/103929518

pthread线程知识要点

匆匆过客 提交于 2020-01-22 14:49:43
pthread线程知识要点 线程之间通信的两个基本问题是互斥和同步。` #include<pthread.h> 一、pthread_create 1、函数原型 int pthread_create(pthread_t tidp,const pthread_attr_t attr,(void )( start_rtn)(void ),void arg); 2、函数功能: pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。 它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。 返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。 新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg, 如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。 3、返回值: 表示成功,返回0;表示出错,返回-1。 4、参数 第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。 示例: // 线程的运行函数 void say_hello(void args) {

Java并发--控制并发线程数的Semaphore

浪子不回头ぞ 提交于 2020-01-21 19:17:41
控制并发线程数的Semaphore Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 Semaphore比作是控制流量的红绿灯。比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入××马路,但是如果前一百辆中有5辆车已经离开了××马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。 应用场景: Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制,如下所示。 package pers . zhang . part6 ; import java . util . concurrent . ExecutorService ; import java . util . concurrent

简单了解了下SEO与SEM的机制

旧街凉风 提交于 2020-01-21 13:10:11
SEO :搜索引擎优化 SEM :搜索引擎营销 SEO排名机制 :搜索引擎蜘蛛 权重 算法 排名规则 搜索引擎提交入口: 1.百度搜索网站登入口 2.Google网站登入口 3.360搜索引擎登入入口 4.搜狗网站登入入口 5.必应网站等等 SEO优化最重要的三要素: 标题 关键词 描述 外链 (如友情链接)引流 提升权重的方式之一 (和内容相近的行业相同的,灌水式外链,防止单向链接 双向链接) 内链 :提升网站内部页面抓取率,优化本站、提高流量。 内容质量 :更新 质量 原创 关键词密度(2%-8%) 黑帽和沙盒 :购买外链 垃圾站 黑客行为。沙盒关禁闭 一个菜鸟的百万年薪之路 白帽子 :正常的SEO手段。 关键词挖掘 :头脑风暴 利用搜索引擎相关搜索 工具(百度指数) 长尾关键词(每天开晨会分析这个关键词的动向) 服务器响应快,稳定。 http状态码: 200 网页相映成功 300(302 304重定向换域名需要用) 404网页不存在 500(5,6开头表示服务器错误) 站群推广:(效果不大) 淘宝客 镜像网站 站群模式 百度旗下产品 文库 问答 贴吧等等。。。 来源: https://www.cnblogs.com/lhl66/p/7630317.html

1 同步

我只是一个虾纸丫 提交于 2020-01-19 02:20:01
参考https://blog.csdn.net/booksyhay/article/details/82696779 通过初始化为0值的信号量,同步两个线程; 1、信号量初始化 osSemaphoreId_t sem ; sem = osSemaphoreNew ( 1 , 0 , NULL ) ; 2、线程1 printf ( "thread 1\r\n" ) ; osSemaphoreRelease ( sem ) ; 3、线程2 osSemaphoreAcquire ( sem , osWaitForever ) ; printf ( "thread 2\r\n" ) ; 4、结论 通过0值信号量,同步线程1与线程2,不论调度器是先执行线程1,还是先执行线程2,都是先输出"thread 1"; 来源: CSDN 作者: 小C菜鸟 链接: https://blog.csdn.net/C_cai_niao/article/details/103928929

Linux 信号量使用方法

风流意气都作罢 提交于 2020-01-18 04:06:48
信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。 不多做解释,要使用信号量同步,需要包含头文件semaphore.h。 主要用到的函数: int sem_init(sem_t *sem, int pshared, unsigned int value); 其中 sem 是要初始化的信号量, pshared 表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。 int sem_destroy(sem_t *sem); ,其中 sem 是要销毁的信号量。只有用 sem_init 初始化的信号量才能用 sem_destroy 销毁。 int sem_wait(sem_t *sem); 等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。成功返回0,失败返回-1。 int sem_post(sem_t *sem); 释放信号量,让信号量的值加1。相当于V操作。 //用户从终端输入任意字符然后统计个数显示,输入end则结束 //使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数 #include<stdio.h> #include <pthread.h> #include<stdlib.h> #include <string.h> #include

7-4 写者优先的读者

旧街凉风 提交于 2020-01-18 02:09:08
参考https://blog.csdn.net/booksyhay/article/details/82762278 根据应用程序,为写者提供更高的优先级可能是个好主意。 例如,如果写者要对数据结构进行更新,而这种更新又是时序要求很严格的,则最好在写者有机会继续之前,将能查看旧数据的读者的数量控制到最小。 初始化 osSemaphoreId_t sem_noReaders ; sem_noReaders = osSemaphoreNew ( 1 , 1 , NULL ) ; osSemaphoreId_t sem_noWriters ; sem_noWriters = osSemaphoreNew ( 1 , 1 , NULL ) ; LightSwitch readSwitch ; init_light ( & readSwitch ) ; readSwitch . Init ( & readSwitch ) ; LightSwitch WriteSwitch ; init_light ( & WriteSwitch ) ; WriteSwitch . Init ( & WriteSwitch ) ; 读者线程 如果一个读者在临界区,它拥有noWriters,但它不包含noReaders。 因此,如果写者到达它可以锁定noReaders,这将导致后续读者排队。

多线程之间信号量

丶灬走出姿态 提交于 2020-01-16 10:01:32
1. 什么是信号量 linux sem 信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间共享资源引发的同步问题。 用户态进程对 sem 信号量可以有以下两种操作: 等待信号量 当信号量值为 0 时,程序等待;当信号量值大于 0 时,信号量减 1,程序继续运行。 发送信号量 将信号量值加 1 通过对信号量的控制,从而实现共享资源的顺序访问。 2. 相关函数说明 linux 信号量相关函数都声明头文件 semaphore.h 头文件中,所以使用信号量之前需要先包含头文件 #include <semaphore.h> 1 信号量的创建就像声明一般的变量一样简单,例如:sem_t sem,之后对该信号量进行初始化和使用。 2.1 sem_init 该函数用于创建信号量,其原型如下: int sem_init(sem_t *sem, int pshared, unsigned int value); 1 该函数初始化由 sem 指向的信号对象,并给它一个初始的整数值 value。 pshared 控制信号量的类型,值为 0 代表该信号量用于多线程间的同步,值如果大于 0 表示可以共享,用于多个相关进程间的同步 参数 pshared > 0 时指定了 sem 处于共享内存区域,所以可以在进程间共享该变量 2.2 sem_wait int sem_wait(sem_t *sem);

linux-线程同步之信号量

折月煮酒 提交于 2019-12-27 06:24:08
1.任务:用户从终端输入任意字符然后统计字符个数显示,输入end则结束 2.使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <pthread.h> 5 #include <semaphore.h> 6 7 char buf[200] = {0}; 8 sem_t sem; 9 void *func(void *arg); 10 //子线程程序,作用就是统计buf中的字符个数并打印 11 void *func(void *arg) 12 { 13 //子线程中首先应该有个循环,在等待主线程激活的时候要在循环中阻塞; 14 //子线程被激活后就去获取buf中的字符长度,然后打印;打印完成之后再次被阻塞 15 sem_wait(&sem); 16 while(strncmp(buf, "end", 3) != 0) 17 { 18 printf("输入了%d个字符\n",strlen(buf)); 19 memset(buf, 0, sizeof(buf)); 20 sem_wait(&sem); 21 } 22 pthread_exit(NULL); 23 } 24 25 int main(void) 26 { 27