精华内容
下载资源
问答
  • 临界资源各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。每个进程中访问...

    临界资源

    各进程采取互斥的方式,实现共享的资源称作临界资源。
    属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。
    每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区
    在操作系统中,有临界区的概念。临界区内放的一般是被1个以上的进程或线程(以下只说进程)共用的数据。
    临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。
    操作系统需要合理的分配临界区以达到多进程的同步和互斥关系,如果协调不好,就容易使系统处于不安全状态,甚至出现死锁现象。

    进程互斥

        由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的

    这种关系为进程的互斥。

        系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。

        在进程中涉及到互斥资源的程序段叫临界区。


      假如现在有只有一台电脑,而有两个以上的人需要使用电脑,那么实际情况应该怎么分配呢?很明显,只能等一个人使用完之后,另一个人再使用。为了不被人打扰,前一个人在使用的时候,给旁边立个牌子,写上:正在使用,请勿打扰。然后第二个人就一直在等(在进程中就是阻塞式等待)。现在的重点在这块牌子上,这就保证了二者没有同一时间使用,而不会引发二个人的冲突。这就是互斥机制。


    进程同步

        是指多个进程需要相互配合共同完成一项任务。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。同步是一种时序关系,如规定了进程1处理完事情A后,进程2才能处理事情B。
        如果A和B互相包含,那A只能等于B,而同步和互斥的是不对等的。但从广义上来看,互斥是一种特殊的同步,同步是一种更为复杂的互斥关系。


      那假如前一个人一次只使用两分钟,或更短时间,每次结束后,第二个人刚准备去使用电脑,前一个人又重新坐下,反复这个动作,第二个人就无法使用,但是在互斥机制上也完全符合规则。同步机制就在于解决将这种情况,只要前一个人起身,不使用电脑了,那么就只能重新排队,换下一个人使用。


    生产者与消费者

        有两个进程分别为消费者进程和生产者进程,对同一个临界资源进行访问,生产者不断的将生产的产品加入缓冲区,而消费者不断的消费缓冲区中的资源,利用信号量实现两个进程的同步与互斥。

        在生产者往缓冲区加入产品时,需要两个信号量,一个是互斥信号量,使得在生产者往缓存里放产品的时候其他进程不能对临界资源进行操作,另一个信号量是指示缓存区是否已满的信号量,从而判断生产者能否往缓冲区加入产品;而消费者从缓冲区中消费资源的时候,也需要两个信号量,一个信号量是互斥信号量,使得消费者在从缓冲区中取产品的时候其他进程不能对临界资源进行操作,另外一个信号量是指示缓冲区是否为空,从而判断消费者能否对缓冲区进行操作。

        由以上分析,可知在该问题中共需要三个信号量,一个是用于互斥的信号量mutux=1; 一个是用于指示缓冲区空位置数目的empty=N;另外一个是指示缓冲区填满位置的信号量full = 0;

        用于同步的信号量一定是位于不同进程中,用于互斥的信号量一定是位于同一个进程中。


      那假如前一个人一次只使用两分钟,或更短时间,每次结束后,第二个人刚准备去使用电脑,前一个人又重新坐下,反复这个动作,第二个人就无法使用,但是在互斥机制上也完全符合规则。同步机制就在于解决将这种情况,只要前一个人起身,不使用电脑了,那么就只能重新排队,换下一个人使用。
    展开全文
  • 【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习...本系列文章将对各种实现同步互斥的方法进行分析以及给出示例,并且大多示例都基于生产者消费者模型来阐述。
       【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途】
    
            当操作系统进入多道批处理系统时代以后,一个系统中就存在多个任务,每个任务都按照一定的算法进行调度来使用内存、cpu等共享资源。当其中一个任务等待其他资源时,该任务可以暂时睡眠,操作系统调度另外任务继续执行额,这样可以使系统资源得到最大化利用,而无需像以前单道批处理系统那样只有当一个任务完成之后才执行下一个任务。但是由此也引入了多任务并发的问题。
        并发就是多个任务同时执行,在现在的一般大型应用系统中,一个功能基本有多个任务共同完成,每个任务相互协调,互相配合以及交换信息,如此一来,我们需要考虑并发任务的同步与互斥了。
        所谓同步,就是一件事情需要按照先后顺序去完成,当一个任务和另一个任务通信时,任务A获取另一个任务B的信息,当任务B未返回信息时,任务A持续等待,直到B返回信息回来,A再继续执行。异步是和同步相对的一个概念,就是任务A向B请求信息时,不必等待B信息的返回,A请求完成之后直接做下一件事情。
        所谓互斥就是某些资源在某一时刻只能由一个任务占有,在某资源被任务A占有的情况下,其他需要占有该资源的任务B必须等待,任务A使用完该资源后释放后任务B才能使用该资源。一般这样的资源被称作临界资源,有的时候一段程序不允许并发执行,这段程序被称作临界区。

        要解决同步互斥问题, 最主要的是理清楚活动者之间的同步关系, 还有某些问题中变量的互斥问题。我们来看看生产者消费者问题,生产者消费者问题是一个经典的进程同步问题。它描述的是: 有一群生产者进程在生产产品, 并将此产品提供给消费者进程去消费。为使生产者进程和消费者进程能并发执行, 在它们之间设置有个缓冲区的缓冲池, 生产者进程可将它所生产的产品放入一个缓冲区中,消费者进程可从一个缓冲区取得一个产品消费。尽管所有的生产者进程和消费者进程都是以异步的方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品, 也不允许生产者进程向一个已装满产品的缓冲区投放产品。
        
        我们这样来描述这个问题, 假如缓冲池中有n个缓冲区,每个缓冲区存放一个消息,生产者和消费者进程(或线程)对缓冲区互斥的访问。只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。 此时生产者和消费者需要保持同步,当缓冲池为空时,生产者通知消费者不要再来取数据,当不为空时,通知消费者可以来取数据。

        在linux中,实现同步与互斥的方法有很多,比如信号量等,线程还有专用的线程互斥锁以及条件变量。本系列文章将对各种实现同步互斥的方法进行分析以及给出示例,并且大多示例都基于生产者消费者模型来阐述。
    展开全文
  • LINUX进程同步与互斥

    2010-11-27 10:46:56
    LINUX下的进程问题,经典进程同步与互斥问题实现……………………………………使用MUTEX信号量
  • 分享讲解linux多任务同步与互斥的时候的ppt以及相应的资源
  • linux线程同步与互斥

    2013-08-31 14:51:53
    线程同步与互斥  线程共享进程的资源和地址空间,对这些资源进行操作时,必须考虑线程间同步与互斥问题  三种线程同步机制  •互斥锁  •信号量  •条件变量  互斥锁更适合同时可用的资源是惟一的情况  信号...
    线程同步与互斥
      线程共享进程的资源和地址空间,对这些资源进行操作时,必须考虑线程间同步与互斥问题
      三种线程同步机制
        •互斥锁
        •信号量
        •条件变量
      互斥锁更适合同时可用的资源是惟一的情况
        信号量更适合同时可用的资源为多个的情况 

     

     

    互斥锁
      用简单的加锁方法控制对共享资源的原子操作
      只有两种状态: 上锁、解锁
    可把互斥锁看作某种意义上的全局变量
      在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作
      若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止
    互斥锁保证让每个线程对共享资源按顺序进行原子操作

     

     

    互斥锁分类
      区别在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待
      快速互斥锁
        •调用线程会阻塞直至拥有互斥锁的线程解锁为止
        •默认为快速互斥锁
      检错互斥锁
        •为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息
     
    互斥锁主要包括下面的基本函数:
      互斥锁初始化:pthread_mutex_init()
      互斥锁上锁:pthread_mutex_lock()
      互斥锁判断上锁:pthread_mutex_trylock()
      互斥锁解锁:pthread_mutex_unlock()
      消除互斥锁:pthread_mutex_destroy()
     

     

     #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    #define THREAD_NUM 3
    #define REPEAT_TIMES 5
    #define DELAY 4
    
    pthread_mutex_t mutex;
    
    void *thrd_func(void *arg);
    
    int main(){
        pthread_t thread[THREAD_NUM];
        int no;
        void *tret;
        
        srand((int)time(0));
           // 创建快速互斥锁(默认),锁的编号返回给mutex    
        pthread_mutex_init(&mutex,NULL);
    
        // 创建THREAD_NUM个线程,每个线程号返回给&thread[no],每个线程的入口函数均为thrd_func,参数为
        for(no=0;no<THREAD_NUM;no++){
            if (pthread_create(&thread[no],NULL,thrd_func,(void*)no)!=0) {
                printf("Create thread %d error!\n",no);
                exit(1);
            } else
                printf("Create thread %d success!\n",no);
        }
        
        // 对每个线程进行join,返回值给tret
        for(no=0;no<THREAD_NUM;no++){
            if (pthread_join(thread[no],&tret)!=0){
                printf("Join thread %d error!\n",no);
                exit(1);
            }else
                printf("Join thread %d success!\n",no);
        }
        // 消除互斥锁
        pthread_mutex_destroy(&mutex);
        return 0;
    }
    
    void *thrd_func(void *arg){
        int thrd_num=(void*)arg; // 传入的参数,互斥锁的编号
        int delay_time,count; 
        
        // 对互斥锁上锁
        if(pthread_mutex_lock(&mutex)!=0) {
            printf("Thread %d lock failed!\n",thrd_num);
            pthread_exit(NULL);
        }
    
        printf("Thread %d is starting.\n",thrd_num);
        for(count=0;count<REPEAT_TIMES;count++) {
            delay_time=(int)(DELAY*(rand()/(double)RAND_MAX))+1;
            sleep(delay_time);
            printf("\tThread %d:job %d delay =%d.\n",thrd_num,count,delay_time);
        }
    
        printf("Thread %d is exiting.\n",thrd_num);
        // 解锁
        pthread_mutex_unlock(&mutex);
        
        pthread_exit(NULL);
    }

    http://blog.csdn.net/baliguan163/article/details/10734767程序差异在于有没有锁,有锁的情况下,必须等"thread x is exiting."之后其他线程才能继续。

     信号量

      操作系统中所用到的PV原子操作,广泛用于进程或线程间的同步与互斥
        •本质上是一个非负的整数计数器,被用来控制对公共资源的访问
      PV原子操作:对整数计数器信号量sem的操作
        •一次P操作使sem减一,而一次V操作使sem加一
        •进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限
      –当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限
      –当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止
     
    PV操作主要用于线程间的同步和互斥
      互斥,几个线程只设置一个信号量sem
      同步,会设置多个信号量,安排不同初值来实现它们之间的顺序执行

     

    信号量函数
      sem_init() 创建一个信号量,并初始化它
      sem_wait()和sem_trywait(): P操作,在信号量大于零时将信号量的值减一
        •区别: 若信号量小于零时,sem_wait()将会阻塞线程,sem_trywait()则会立即返回
      sem_post(): V操作,将信号量的值加一同时发出信号来唤醒等待的线程
      sem_getvalue(): 得到信号量的值
      sem_destroy(): 删除信号量

     

    eg. 同步各线程,执行顺序为逆序。

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    #define THREAD_NUM 3
    #define REPEAT_TIMES 5
    #define DELAY 4
    
    sem_t sem[THREAD_NUM];
    
    void *thrd_func(void *arg);
    
    int main(){
        pthread_t thread[THREAD_NUM];
        int no;
        void *tret;
        
        srand((int)time(0)); 
    
        // 初始化THREAD_NUM-1个信号量,均初始化为0
        for(no=0;no<THREAD_NUM-1;no++){
            sem_init(&sem[no],0,0);
        }
    
        // sem[2]信号量初始化为1,即sem数组中最后一个信号量
        sem_init(&sem[2],0,1);
        
        // 创建THREAD_NUM个线程,入口函数均为thrd_func,参数为(void*)no
        for(no=0;no<THREAD_NUM;no++){
            if (pthread_create(&thread[no],NULL,thrd_func,(void*)no)!=0) {
                printf("Create thread %d error!\n",no);
                exit(1);
            } else
                printf("Create thread %d success!\n",no);
        }
        
        // 逐个join掉THREAD_NUM个线程
        for(no=0;no<THREAD_NUM;no++){
            if (pthread_join(thread[no],&tret)!=0){
                printf("Join thread %d error!\n",no);
                exit(1);
            }else
                printf("Join thread %d success!\n",no);
        }
        
        // 逐个取消信号量
        for(no=0;no<THREAD_NUM;no++){
            sem_destroy(&sem[no]);
        }
    
        return 0;
    }
    
    void *thrd_func(void *arg){
        int thrd_num=(void*)arg; // 参数no
        int delay_time,count;
    
        // 带有阻塞的p操作
        sem_wait(&sem[thrd_num]);
    
        
        printf("Thread %d is starting.\n",thrd_num);
        for(count=0;count<REPEAT_TIMES;count++) {
            delay_time=(int)(DELAY*(rand()/(double)RAND_MAX))+1;
            sleep(delay_time);
            printf("\tThread %d:job %d delay =%d.\n",thrd_num,count,delay_time);
        }
    
        printf("Thread %d is exiting.\n",thrd_num);
        
        // 对前一个信号量进行V操作
        // 由于只有最后一个信号量初始化为1,其余均为0
        // 故线程执行的顺序将为逆序
        sem_post(&sem[(thrd_num+THREAD_NUM-1)%THREAD_NUM]);
    
        pthread_exit(NULL); // 线程主动结束
    }

     


    展开全文
  • 在本篇文章里小编给大家整理的是关于linux线程间的同步与互斥的相关知识点,有兴趣的朋友们学习下。
  • 页脚 《进程同步与互斥》实验报告实验序号:01 实验项目名称:进程同步与互斥 学 号姓 名 专业、班 实验地点指导教师 时间 一、实验目的1、掌握基本的进程同步与互斥算法,理解生产者-消费者问题。2、学习使用...

    .

    .

    页脚 《进程同步与互斥》实验报告

    实验序号:01 实验项目名称:进程同步与互斥 学 号

    姓 名 专业、班 实验地点

    指导教师 时间 一、实验目的

    1、掌握基本的进程同步与互斥算法,理解生产者-消费者问题。

    2、学习使用Windows 2000/XP 中基本的同步对象,掌握相关API 的使用方法。

    3、了解Windows 2000/XP 中多线程的并发执行机制,实现进程的同步与互斥。

    4、设计程序,实现生产者-消费者进程(线程)的同步与互斥;

    二、实验环境

    Windows 2000/XP + Visual C++ 6.0

    三、实验容

    以生产者-消费者模型为依据,在Windows 2000/XP 环境下创建一个控制台进程,在该进程中创建n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。

    四、设计思路和流程框图

    生产者进程的功能:生产东西,供消费者消费;消费者进程的功能:消费生产者生产的东西。生产者生产产品并存入缓冲区供消费者取走使用,消费者从缓冲器取出产品去消费。在生产者和消费者同时工作时,必须禁止生产者将产品放入已装满的缓冲器,禁止消费者从空缓冲器取产品。

    b4297dc58276d3ffb7de86b2fd644bd9.png

    五、源程序(含注释)清单

    #include

    展开全文
  • Linux同步互斥机制

    2013-01-18 20:34:57
    Linux同步互斥机制
  • 线程的同步与互斥线程间通信 线程间通信 线程共享同一进程的地址空间 优点: 通过全局变量交换数据 缺点: 多个线程访问共享全局数据时需要同步或者互斥
  • Linux下的同步与互斥

    2015-08-20 11:07:14
    Linux下的同步与互斥主要有互斥锁,条件变量和信号量。
  • linux内核知识系列:同步与互斥 华嵌智能提供 www.embedded-cn.com http://embedded-cn.taobao.com
  • linux下的同步与互斥

    2015-01-20 11:04:24
     谈到linux的并发,必然涉及到线程之间的同步和互斥,linux主要为我们提供了几种实现线程间同步互斥的  机制,本文主要介绍互斥锁,条件变量和信号量。互斥锁和条件变量包含在pthread线程库中,使用时需要包含...
  • Linux 线程同步与互斥

    2013-11-20 14:16:46
    线程同步有三种常用的机制: 互斥量(mutex) ,读写锁(rwlock)和条件变量(cond). 互斥量:有两种状态:lock和unlock, 它确保同一时间只有一个线程访问数据; 读写锁:有三种状态: 读加锁, 写加锁, 不加锁. 只有一个线程...
  • 如果没有一定的规则,那么共享资源的内容就会显得杂乱无章,这里引入了同步与互斥的概念! 2. 进行多线程编程,因为无法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂。为了解决共享...
  • Linux 下的同步与互斥

    2018-03-19 18:15:54
    同步与互斥   同步发生在不同调度单位中(线程/进程),用来保证调度单位的时序性,比如生产者消费者模型中,消费者必须在生产者产出后才能消费,它们是存在先后顺序的。   互斥用来发生在同一时间只能有一个...
  • 在前面博客linux互斥锁和PV原语, linux信号量—互斥与同步 已经讲了PV原语、互斥锁、信号量,这一节讲他们的综合使用。用一个大家经常用的生产者和消费者的例子来讲解。/* product_consumer.c*/#include #include...
  • Linux线程互斥 我们先来谈谈进程线程间互斥相关背景概念: 临界资源:多线程执行流共享的资源叫做临界资源。 临界区:每个线程内部访问临界资源的代码叫做临界区。 互斥:任何时刻,互斥保证有且只有一个执行流...
  • 文章目录Linux线程同步 互斥条件变量线程同步常用的方法互斥互斥量的创建互斥量的加锁解锁互斥量的死锁条件变量条件变量的创建通知条件变量等待条件变量 线程同步常用的方法 使用互斥量保护共享资源,对共享...
  • 进程互斥与同步 进程互斥与同步机制的主要任务是:对多个相关进程在执行次序上进行协调,使并发执行的诸进程间能按照一定的规则(或时序)共享系统资源,并能很好的相互合作,从而使程序能够正确执行。 在多个...
  • #include #include #include #define false 0 #define ture 1 int flag[2];...//this is for busywaiting ,until the other is not intersted any more. ...我不理解main里到底是怎么运行的,create了两个进程以后...
  • linux线程间同步(互斥条件变量) linux的线程有两个重要的同步方式。分别为互斥量(mutex)和条件变量(condition variables).其中linux互斥量功能类似RTOS下的互斥量。用于防止多个线程同时访问同一共享资源。而...
  • 本片博客接着前面的线程编程继续介绍在linux中用信号量实现线程间的同步与互斥 信号量 信号量就是操作系统中所用到的PV原子操作,它被广泛用到进程于线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它...
  • 测试环境:64位ubuntu 13LTS 功能说明:使用互斥锁+条件变量+共享内存的方式实现进程(或线程)间的通信示例
  • 为了避免多个进程同时访问同一个共享资源而引发冲突,多个线程访问共享数据时需要同步互斥机制 同步机制:指的是多个任务按照约定的先后次序相互配合完成一件事情 互斥机制:一次只允许一个任务(进程、线程)...
  • 实验四 同步与互斥 实验目的和要求 1掌握进程线程的同步与互斥 2 掌握生产者消费者问题的实现方法 3掌握多线程编程方法 实验内容 实现生产者消费者问题 1有一个仓库生产者负责生产产品并放入仓库消费者会从仓库中拿...
  • 线程之间的同步与互斥 1. 互斥锁线程控制 2. 信号量线程控制
  • 同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来...
  • 1、互斥锁的定义 互斥缩mutex是在semaphore的基础上将struct semaphore中的count设为1而演化而来的。 在此基础上做了优化。 struct mutex {  ____/* 1: unlocked, 0: locked, negative: locked, possible ...
  • Linux下多线程及多进程及同步与互斥编程详细介绍
  • Linux线程的基本函数 常用线程函数 pthread_create 创建一个线程 pthread_exit 线程自行退出 pthread_join 其它线程等待某一个线程退出 pthread_cancel 其它线程强行杀死某一个线程 pthread线程库的使用 在源码中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,982
精华内容 18,792
关键字:

linux同步与互斥

linux 订阅