精华内容
下载资源
问答
  • 互斥问题

    2018-04-19 19:21:39
    上次我们学习到在进程中的线程对于数据是共享的,那在一个线程对数据进行操作的时候,很有... 为了避免这种情况,我们需要保证在一个线程对临界区进行操作的时候,其他线程不会进入临界区,这就是互斥问题。 最...

    上次我们学习到在进程中的线程对于数据是共享的,那在一个线程对数据进行操作的时候,很有可能遇到中断,将那个线程正在处理的数据进行修改,而中断事件之后,原来的线程还是以为用到的数据就是正确的,这就造成了错误。这里给出临界区的定义————对共享内存进行访问的程序片段。

            为了避免这种情况,我们需要保证在一个线程对临界区进行操作的时候,其他线程不会进入临界区,这就是互斥问题。

            最简单的方法就是在进入临界区的时候关闭中断然后出临界区的时候再打开。这样的话,如果一个程序在临界区内执行出错了,阻塞了,那么系统将会一直阻塞在临界区内。而且对于多核CPU,关闭中断中对执行本指令的CPU有效,其他CPU还是可以继续运行。

            第二种尝试,设置锁变量。

            一个进程在进入临界区的时候,检测lock的值,如果是0,则进程将lock置1,进入临界区,出来临界区的时候再lock置0.这样还是存在一个问题,当进程在检测lock值为0之后,置lock为1之前,系统调用了另外一个进程,那个进程将lock置为了1,当第一个进程再次运行的时候,这样就存在两个进程处于临界区。

            第三种尝试:peterson方法

            假设连个进程同时调用进入临界区的函数,则intersect[0]和interest[1]都等于TRUE,他们都将自己的进程号存入turn,但是只有一个是有效的,因为后存入的将会覆盖之前的turn,这样就保证了进程0进入临界区而进程1将不停的循环。

            缺点:这些算法都是在进入临界区的时候进行判断,如果不满足就一直等待,直到许可为止,这样就造成了CPU时间的浪费。更加严重的是有两个进程H,L,其中H的优先级更高,假如L在临界区的时候,此时H变到就绪态准备运行,但是L在临街区内, H就进行忙等待,但是H就绪的时候L无法被调度,H就将一直等待下去,这种就叫做优先级反转。

    展开全文
  • 互斥问题总结

    千次阅读 2015-06-16 21:40:14
    线程互斥问题总结,帮助猿猿们快速理解

    这次写点简单的东西,记得最开始接触“互斥”这个词是在大三去旁听操作系统课时候,当时感觉还是很难理解的。今天正巧看《UNIX环境高级编程》时候又看到它了,就好好做一次总结吧。

    1. 为什么需要互斥?

    上面的图是从《高级编程》中截的图,虽然它是针对线程的,但是这里要说明,不仅仅线程要考虑这个问题,只要涉及到并发的程序,都要考虑互斥。比如多进程共享内存,比如某个驱动会同时被打开,而且会被几个进程同时修改驱动中的值或者寄存器......

    原理上都是一样的,多线程并发访问是一定要注意的,因为同一进程的多个线程本身就共享进程资源或者说变量的内存。就拿上图来说,我们对i变量的值+1操作,那么这个简简单单的+1操作真正到了CPU上会怎么执行呢?通常分为3步:

    (1) 从内存单元读入寄存器

    (2) 在寄存器上进行变量值增加

    (3) 把新的值写回内存单元

    这就导致了上图的问题,A线程在把i从内存读入寄存器改变过程中(还没写回到内存),B线程也对i做了同样操作,以至于最后结果就是读入的都是5,写入的都是6,那么本来我们是要对i增加2次的,实际却增加了1次。这种操作时间问题可能发生在ns级别,但是以当今处理器动辄几GB的速度来说,发生这种情况概率还是很大的。

    2.验证试验

    下面我们就做实验来实际看看这种情况。

    看下程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    #define NUM 40000000
    
    pthread_t tid1;
    pthread_t tid2;
    
    unsigned int count1 = 0;
    unsigned int count2 = 0;
    unsigned int count = 0;
    
    void * thr_fn1(void *arg)
    {
    	while(count1<NUM)
    	{
    		count++;
    		count1++;
    	}
    }
    
    void * thr_fn2(void *arg)
    {
    	while(count2<NUM)
    	{
    		count++;
    		count2++;
    	}
    }
    
    int main(void)
    {
    	int		err;
    
    	err = pthread_create(&tid1, NULL, thr_fn1, NULL);
    	if (err != 0)
    		perror("can't create thread1");
    	
    	err = pthread_create(&tid2, NULL, thr_fn2, NULL);
    	if (err != 0)
    		perror("can't create thread2");
    		
    	pthread_join(tid1, NULL);
    	pthread_join(tid2, NULL);
    	
    	printf("count = %u, count1 = %u, count2 = %u\n", count, count1, count2);
    	exit(0);
    }

    程序很简单,就是创建两个线程,然后每个线程分别对count增加40000000 值,这个值是我随便选的,只要大一点就行,但是别超了2^32。而count1和count2分别来记录两个线程对count分别增加了多少次,其实有NUM控制就好了,不过为了对比,我们加入这两个变量。主进程创建两个线程后我们用pthread_join函数来等待两个线程执行完毕,并打印三个值比较得出结果。

    首先在PC机上看下结果,CPU是双核2.6GHZ的,运行环境是ubuntu,顺便用time命令查看下执行时间:


    从上图可以看出,两个线程对count进行总共80000000次累加大概需要2ms多一点,测了6次有2次是有问题的,即count != count1 + count2,概率还是比较大的。

    然后我把相同的代码重新编译拿到AM335x(TI A8单核600MHZ)运行,结果如下


    这个时间程序耗时就明显长了,需要大概4s,本来我以为单核处理器出错概率会小,没想到运行5次结果居然全是错的。具体为什么会这样没去深究,猜想应该和SMP机制及操作系统线程调度有关。这个结果更证明了线程互斥的重要性,尤其是在嵌入式系统中。

    3.互斥问题解决方案

    既然问题都明白了,接下来当然是解决方案了,解决这种互斥问题最经典的方案就是锁了,相信大部分人平时都用过。以linux线程库提供的接口,代码改为下面形式。

    #define NUM 40000000
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    	
    pthread_t tid1;
    pthread_t tid2;
    
    unsigned int count1 = 0;
    unsigned int count2 = 0;
    unsigned int count = 0;
    
    void * thr_fn1(void *arg)
    {
    	while(count1<NUM)
    	{
    		pthread_mutex_lock(&lock);
    		count++;
    		pthread_mutex_unlock(&lock);
    
    		count1++;
    	}
    }
    
    void * thr_fn2(void *arg)
    {
    	while(count2<NUM)
    	{
    		pthread_mutex_lock(&lock);
    		count++;
    		pthread_mutex_unlock(&lock);
    
    		count2++;
    	}
    }

    只列出了部分代码,其它的都一样,其实思想很简单,就是在并发访问同一个变量时候,给这个共享变量加锁,保证写操作的原子性即可。那么为什么count1和count2不用加锁呢,因为两个变量本身就只在两个线程中分别操作,所以没必要加锁。

    最后来看下结果,问题本身已经解决了,但是这次重点不在结果上,而在程序执行时间上

    这是在PC上结果



    这是在ARM上结果



    加了这个操作后,PC上同一程序运行时间多了10倍,板子上多了6倍。所以加锁操作在保证了并发访问正确性同时,大大增加了程序运行时间。所以我们在多进程共享资源并发访问程序设计时候,需要综合考虑程序的正确性和效率。



    展开全文
  • 进程的同步与互斥问题总结.doc
  • 1.1 什么是互斥问题

    2020-05-11 09:24:46
    确保一个时刻只允许一个线程执行特定代码段的问题称为互斥问题,他是多处理器程序设计中经典的协作问题之一。
    确保一个时刻只允许一个线程执行特定代码段的问题称为互斥问题,他是多处理器程序设计中经典的协作问题之一。
    
    展开全文
  • jQuery实现密保互斥问题

    千次阅读 多人点赞 2013-08-15 23:05:57
    密保互斥问题:密保通常都会有n个问题,让用户选择其中的2、3个问题,但不能选择重复的问题。这就要求密保互斥。文章用了jquery实现密保互斥,用于解决密保,投票等类似互斥问题,可以支持ie6+,火狐,谷歌,opera等...

    密保互斥问题:

    密保通常都会有n个问题,让用户选择其中的2、3个问题,但不能让用户选择到重复的问题。这就要求密保互斥。

    效果如下:



    下面我用了jquery实现密保互斥,用于解决密保,投票等类似互斥问题,可以支持ie6+,火狐,谷歌,opera等大多数浏览器

    demo下载:http://download.csdn.net/download/cwqcwk1/5956141


    关键代码:

    <script type="text/javascript">
    var qObj = {
      elmt:'select',
      tip:'请选择',
      tVal:'',
      cur:[],
      arr:{
        1:'你的小学叫什么名字?',
        2:'你最崇拜的人物是谁?',
        3:'你最喜欢的花名字叫什么?',
        4:'你父亲的职业是?',
        5:'你父亲的姓名?',
        6:'你高中班主任的名字?'
      }
    }
    
    $(function(){
      //获取所有的select选框
      var elements = $(qObj.elmt);
    
      //这一步只是初始化操作,将所有问题写入select选框
      elements.each(function(i){
        var html = '<option value="'+ qObj.tVal +'">'+ qObj.tip +'</option>';
        for(var q in qObj.arr){
          html += '<option value="'+ q +'">' + qObj.arr[q] + '</option>';
        }
        $(this).html(html);
      });
      
      //select选框添加监听事件
      elements.change(function(){
        var
          cValue = {},                   //用于记录当前被选中的问题
          elmts = elements,
          cIndex = elmts.index($(this)); //当前select选框索引值
    
        //遍历所有select选框,记录当前每个选框的选择
        elmts.each(function(i){
          qObj.cur[i] = $(this).val();
        });
    
        //记录当前已被选中的问题,实现互斥锁
        for(var i in qObj.cur){
          cValue[qObj.cur[i]] = 1;
        }
    
        //遍历所有select选框,重置所有问题
        elmts.each(function(i){
          //跳过当前的select选框,因为该内容无需校正
          if (cIndex == i) return;
          var html = '<option value="'+ qObj.tVal +'">'+ qObj.tip +'</option>';
          for(var q in qObj.arr){
            //如果是互斥内容,且不属于这个选框则跳过(重点)
            if (cValue[q] && q != qObj.cur[i]) continue;
            html += '<option value="'+ q +'"' + (q == qObj.cur[i]?' selected="selected"': '') + '>' + qObj.arr[q] + '</option>';
          }
          $(this).html(html);
        });
      });
    
    })
    </script>
    密保1:<select style="width:180px"></select><br/>
    密保2:<select style="width:180px"></select><br/>
    密保3:<select style="width:180px"></select>

    展开全文
  • 操作系统 同步互斥问题之 理发师问题
  • 读者写者同步互斥问题ppt形式内容有解决问题的代码
  • d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...
  • 解决多线程编程中的同步互斥问题
  • 经典进程同步与互斥问题

    千次阅读 2019-02-26 17:51:04
    经典进程同步与互斥问题 文章目录经典进程同步与互斥问题一、生产者与消费者问题1.1 问题概述1.2 解决方法二、读者与写者问题2.1 问题概述2.2 解决方法三、哲学家进餐过程3.1 问题概述3.2 解决方法 一、生产者与消费...
  • 经典进程同步与互斥问题前言一、生产者-消费者问题1.问题描述2.问题分析3.代码二、读者-写者问题1.问题描述&&分析2.代码三、哲学家进餐问题1.问题描述&&分析2.代码三、理发师问题1.问题描述&&...
  • 操作系统同步互斥问题

    千次阅读 2018-09-29 16:38:08
    操作系统同步互斥问题 一些经典的例子就不列举了,接下来讲一些在学习操作系统课程的过程中所遇到的几个进程同步的题目。 1.取放水果问题 用基本记录型信号量解决如下同步关系:一空盘放一水果,父放梨,母放橘,儿...
  • c++ 多线程向同一个文本写入信息 解决同步与互斥问题
  • 这里写目录标题概览临界区临界区的引入临界区的概念进程的同步与互斥的概念解决方法经典同步与互斥问题 概览 临界区 临界区的引入 在系统当中,有些资源允许多个进程共享(磁盘),有些资源只允许进程单独使用...
  • 但构建逻辑网时,会产生分布式公用资源访问的互斥问题。针对一体化承载网络的体系结构,设计了一种基于令牌的互斥算法。该算法借鉴解决旅行商问题的算法思想,构造一个逻辑环,使得令牌遍历所有节点的代价最小,并...
  • 那些烦人的同步和互斥问题
  • 二、同步和互斥问题 三、如何实现同步 四、如何实现互斥 笔记: 一、线程 1、什么是线程: (1)线程是轻量级的进程 (2)线程存在于进程内,不能独立存在 (3)线程参与CPU调度,进程是系统资源分配最小单位,线程...
  • 分析进程同步和互斥问题的方法步骤 1、 关系分析:找出问题中的进程数,并分析它们之间的同步和互斥关系。同步、互斥、前驱关系直接按照之前例子改写。 2、 整理思路:找出解决问题的关键点,并且根据做过的题目找出...
  • 操作系统 || 同步互斥问题

    千次阅读 2018-12-09 20:10:56
    题目:同步互斥问题 生产者消费者问题 读者写者问题 1、实验目的 1. 利用线程同步机制,实现生产者消费者文体。 2. 用信号量机制分别实现读者优先和写者优先的读者-写者问题。 2、实验要求 生产者消费者问题 ...
  • 同步、互斥问题

    2021-01-01 21:51:10
    一、进程同步是为了解决什么问题 ? 为了解决并发过程中 进程具有异步特性 带来的问题 (有些任务 需要进程间按序执行) (进程具有异步的特性, 异步 是指 各并发执行的进程 以各自独立的,不可预测的速度向前推进...
  • Pthread互斥问题

    2010-12-08 15:58:34
    操作系统中调用Pthread实现进程互斥
  • js 实现 两个checkbox互斥问题! 值得下载看看!资源免费,大家分享!!
  • 密保通常都会有n个问题,让用户选择其中2、3个,而且都不会让用户选择重复的问题。这就要求密保互斥,具体实现如下,有此需求的朋友可以参考下
  • 操作系统实验3 经典同步互斥问题

    千次阅读 2017-12-13 13:44:42
    2017-4-21实验目的通过编写程序熟悉并发,同步/互斥,死锁等概念实验内容[基本要求]编写Linux环境下C程序,实现3个经典的同步/互斥问题[具体要求]·生产者/消费者问题·读者/写者问题·哲学家问题·代码有注释,提交...
  • linux中内核互斥问题讨论,收集的部分资料,凑合看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,339
精华内容 4,535
关键字:

互斥问题