zoukankan      html  css  js  c++  java
  • 进程与线程(2)

    1.What is race condition(竞争条件)?
    答:在一些操作系统中,协作的进程可能共享一些彼此都能读写的公用存储区,这个公用存储区可能在内存中(可能是在内存数据结构中),也可能是一个共享文件。两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。

    2.What is mutual exclusion(互斥)?
    答:以某种手段确保当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。

    3.What is critical region(临界区)?
    答:对共享内存进行访问的程序片段称作临界区域。

    4.What are four conditions to hold to have a good solution for race condition/mutual exclusion(竞争条件与互斥的解决方案 )?
    答:①任何两个进程不能同时处于临界区。
    ②不应对CPU的速度和数量做任何假设。
    ③临界区外运行的进程不得阻塞其他进程。
    ④不得使进程无限期等待进入临界区。

    5.Explain the asm code of Fig 2-25 in section 2.3.3 to show that the code can provide mutual exclusion.
    答:enter_region:
         TSL     REGISTER,LOCK                          //复制锁到寄存器并将锁设为1
         CMP    REGISTER,#0                             //锁是0吗?
         JNE     enter_region                             //若不是0,说明锁已被设置,所以循环
         RET
     
       leave_region                                            
         MOVE  LOCK,#0                                  //在锁中存入0
         RET                                                        //返回调用者
        Explain: 第一条指令将lock原来的值复制到寄存器中并将lock设置为1,随后这个原来的值与0相比较。如果它非0,则说明以前已被加锁,则程序将回到开始并再次测试。经过或长或短一段时间后,该值将变为0(当前处于临界区中的进程退出临界区时),于是返回过程,此时已加锁。要清除这个锁非常简单,程序只需将0存入lock即可,不需要特殊的同步指令。

    6.Explain the code of Fig 2-28 in section 2.3.5 to show that the code can provide mutual exclusion.
    答:#define N  100                                         //缓冲区中槽的数目
        typedef int semaphore;                        //信号量是一种特殊的整型数据
        semaphore mutex = 1 ;                         //控制对临界区的访问
        semaphore empty = N;                         //计数缓冲区的空槽数目
        semaphore full = 0;                                //计数缓冲区的满槽数目

        void producer(void) {
       {
            int item;
            while (TRUE) {                                                    //TRUE是常量1
                      item = produce_item( );             //产生放在缓冲区的一些数据
                      down( &empty);                          //将空槽数目减1
                      down( &mutex);                          //进入临界区
                      inserUtem(item);                        //将新数据放到缓冲区中
                      up(&mutex);                                //离开临界区
                      up(&full);                                      //将满槽的数目加1
            }
      }

       void consumer(void) {
      {
            int item; 
            while (TRUE) {                                                     //无限循环
                      down(&full);                                 //将满槽的数目减1
                      down( &mutex);                           //进入临界区
                      item = remove_ item( );               //从缓冲区取出数据
                      up(&mutex);                                  //离开临界区
                      up(&empty);                                  //将空槽数目加1
                      consume_item(item);                   //处理数据项
            }
      }
    explain: 设置了三个信号量,mutex控制对关键区的访问,用于互斥,为0时表示进入关键区;empty表示缓冲区的空槽数目;full表示缓冲区的满槽数目。当缓冲区不满,即生产者工作时,产生新数据,空槽数目减1,将mutex设为0,即访问关键区,这时如果有消费者想访问关键区就只能等待,将数据项放入缓冲区后up(&mutex),再将满槽的数目加1;而当缓冲区不空,即消费者工作时,满槽数目减1,进入关键区,去除数据项后,离开关键区并将空槽数目加1。

    7.What is monitor(管程) and please show the connections between the code in Fig 2-34 and monitor.
    答:管程是一个由过程,变量及数据结构等组成的一个特殊的模块或软件包。在任一时刻管程中只能有一个活跃进程。
        对于图2-34,引入 条件变量以及相关的两个操作:wait和signal。对于生产者消费者问题,信号量mutex用于实现互斥,用管程实现时,当生产者发现它无法运行(例如,生产者发现缓冲区满),它会在某个条件变量上(如full)上执行wait操作,该操作导致调用的进程自身阻塞,而将另一个在管程外等待的进程调入管程;对于消费者,当它发现缓冲区为空时,将执行signal操作,立即退出进程或唤醒新的进程。

    8.What is the difference between a semaphore(信号量) and a mutex(互斥量)?
    答:①互斥量用于线程的互斥,信号量用于线程的同步:互斥量实现对关键区的控制,某时刻只能有一个线程访问关键区,信号量用来保证某种事情的顺序发生或者不发生。
    ②互斥量值只能为0/1。信号量值可以为非负整数。也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。
    ③互斥量的加锁和解锁必须由同一线程分别对应使用,而信号量可以由一个线程释放,另外一个线程得到。例如在生产者消费者问题中,互斥量mutex用于实现两者在关键区访问时的互斥,即当生产者生产时,mutex置为0,此时消费者不能进入关键区,即无法改变mutex,而只能由生产者再次释放锁。而另外的两个信号量empty与full则用来计数,生产者与消费者都可以访问。

    9.Please explain the code in Fig 2-32 to show how conditional variables work. If we do not use conditional variable, only use mutex lock& unlock, what’s the difference?
    答: 条件变量condc和condp分别用来控制消费者和生产者。以生产者为例,当生产者工作时,首先将互斥使用缓冲区,如果缓冲区为空,则将数据放入缓冲区,此时调用pthread_cond_signal唤醒消费者,并释放缓冲区;如果缓冲区有数据,那么生产者无法写入数据,此时调用pthread_cond_wait使该进程阻塞并释放缓冲区。消费者调用机制类似。如果只用互斥量来加锁释放锁,那么当缓冲区满槽,生产者此时调用的线程就会堵塞,只能等消费者运行产生空槽位,但是消费者是否运行,对于生产者来说是未知的,除非有相应的线程调用。条件变量的作用就是实现两个线程间的交互,提高CPU效率。

    10.What is barrier(屏障)?
    答:在有些应用中划分了若干阶段,并且规定,除非所有的进程都就需准备着手下一个阶段,否则任何进程都不能进入下一阶段。可以在每个阶段的结尾设置屏障来实现这种行为,当一个进程到达屏障时,它就被屏障阻拦,直到所有的进程都到达该屏障为止。

    11.What is message passing?
    答:消息传递是以消息为单位进行进程之间一种通信的手段,消息是由一组消息组成的集合,包括了消息头和消息尾,消息的传递实现需要两个原语分别是Send()和Seceive(),Send()负责发送消息,Receive()是负责接受消息的,当没有接受到消息的时候,接受进程进入等待的状态,直到有消息到达为止。这样的话不仅起到交换信息的功能,还能使进程同步。

    12.What is the  difference of these IPCs?
    答:信号量用于实现线程间的信息同步。
        互斥量实现不同线程间的互斥。
        条件变量经常依附互斥量存在,用于线程间的信息传递。
        管程用于多个线程互斥访问某一资源。
        消息传递用于不同进程间的信息传递。
        屏障用于不同进程在某一阶段实现同步。

  • 相关阅读:
    tcp为什么要三次握手
    TCP/IP协议(一)网络基础知识
    拜占庭将军问题深入探讨
    Block Manager
    Standalone 集群部署
    Spark内存管理
    Checkpoint & cache & persist
    Python——在Python中如何使用Linux的epoll
    网络编程——C10K简述
    网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000
  • 原文地址:https://www.cnblogs.com/ku1274755259/p/11108528.html
Copyright © 2011-2022 走看看