精华内容
下载资源
问答
  • Windows 进程进入临界区调度原则

    千次阅读 2010-10-19 23:29:00
    进程进入临界区调度原则是:  ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。  ②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图...

    进程进入临界区的调度原则是:

     ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。

     ②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。

     ③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。

     ④如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现“忙等”现象。

     

     

     

    #include <windows.h>
    #include <iostream>
    #include <tchar.h>

    using namespace std;


    DWORD WINAPI FuncProc3(LPVOID lpParameter);

    DWORD WINAPI FuncProc4(LPVOID lpParameter);
    int ctickets = 100;

    CRITICAL_SECTION g_csA;

    void main(void)
    {
           InitializeCriticalSection(&g_csA);
           InitializeCriticalSection(&g_csB);

           HANDLE thread1;
           HANDLE thread2;
           thread1 = CreateThread(NULL, 0, FuncProc3, NULL, 0, NULL);
           thread2 = CreateThread(NULL, 0, FuncProc4, NULL, 0, NULL);

     

           CloseHandle(thread1);
           CloseHandle(thread2);

           Sleep(4000);

           DeleteCriticalSection(&g_csA);
           DeleteCriticalSection(&g_csB);
           system("pause");
    }

     

     

    DWORD WINAPI FuncProc3(LPVOID lpParameter)
    {
            while(TRUE)
           {
                   EnterCriticalSection(&g_csA);

                   //Sleep(100);

                   Sleep(1);

                  if(ctickets > 0)
                  {
                         cout<<"thread1 sell ticket: "<<ctickets--<<endl;
                         LeaveCriticalSection(&g_csA);
                  }else{
                         LeaveCriticalSection(&g_csA);
                         break;
                  }
           }
            return  0;
    }


    DWORD WINAPI FuncProc4(LPVOID lpParameter)
    {
             while(TRUE)
            {
                    EnterCriticalSection(&g_csA);

                    // Sleep(100);

                    Sleep(1);
                  if(ctickets > 0)
                  {
                          cout<<"thread2 sell ticket: "<<ctickets--<<endl;
                  }else{
                          break;
                  }

                  LeaveCriticalSection(&g_csA);
            }
            return  0;
    }

    上面这段代码如果把休眠时间改成0.1秒,则会报内存地址访问错误。

    (开发环境:windows7、Microsoft Visual Studio 2008)

     

    参考:http://baike.baidu.com/view/1237110.htm

     

     

     

    展开全文
  • 临界区管理

    2019-09-03 20:57:37
    临界区调度原则 一次只允许一个进程进入临界区内执行 如果已有进程在临界区,其他视图进入的进程等待 进入临界区内的进程应在有限的时间内进出,一遍使等待进程中的一个进入 实现临界区管理的几种错误算法 两个...

    临界区的调度原则

    临界区与临界资源

    并发进程中与共享变量有关的程序段成为临界区,共享变量代表的资源成为临界资源。

    临界区调度原则

    • 一次只允许一个进程进入临界区内执行
    • 如果已有进程在临界区,其他视图进入的进程等待
    • 进入临界区内的进程应在有限的时间内进出,一遍使等待进程中的一个进入

    实现临界区管理的几种错误算法

    • 两个进程都认为对方不在临界区中,同时进入了临界区
    • 两个进程都认为对方在临界区中,进而永久等待

    实现临界区管理的Peterson算法

    该算法为每个进程设置一个标志,当该标志为true时表示此进程要进入临界区另外设置一个指示器turn,一直是哪个进程可以进入临界区

    boolean flag[2];
    int turn;
    void procedure0()
    {
    while(true)
    {
    flag[0]=true;
    turn=1;
    while(flag[1]&&turn==1) /*若flag[1]为false,P0就进入临界区;若flag[1]为tureP0循环等待,只要P1退出临界区,P0即可进入*/
    {
    /* donothing*/
    }
    visit();/*访问临界区*/
    flag[0]=false;/*访问临界区完成,procedure0释放出临界区*/
    /*remainder section*/
    }
    
    }
    void procedure1()
    {
    while(true)
    {
    flag[1]=true;
    turn=0;
    while(flag[0]&&turn==0)
    {
    /* donothing*/ ;
    }
    visit();/*访问临界区*/
    flag[1]=false;/*访问临界区完成,procedure1释放出临界区*/
    /*remainder section*/
    }
    }
    void main()
    {
    flag[0]=flag[1]=false;
    /*start procedure0 and procedure1*/ ;
    }
    

    在上面的例子中,我们先假设turn被赋值为1,后赋值为0,那么线程0就该进入临界区,线程1则因为flag[0]&&turn==0而等待,当线程0访问临界区结束后释放了临界区资源–flag[0]=false;,那么此时flag[0]&&turn==0不成立,线程1因此可以运行临界区

    实现临界区管理的硬件设施

    关中断

    • 进程在进入临界区之前关中断,退出临界区时开中断,关中断期间,进程调度程序失去终端机或的机会,不会切换线程,保证了临界区的互斥执行
    • 关中断缺点:限制交叉执行程序的能力,关中断方法不适合多CPU系统,关中断权利赋予给用户十分危险

    测试并建立指令

    TS(X){
    若x=true,则x=false;
    return true;
    否则 return false;
    }
    
    

    用TS指令实现临界区管理(互斥)的算法如下

    bool TS(bool &x){
    	if(x){
    	x=false;
    	return true;
    	}
    }
    

    利用TS指令实现进程会吃的算法如下

    bool s=true;
    cobegin
    	process Pi(){
    	//i=1,2,3...n;
    	while(!TS(s))
    	s=true;
    	}
    

    对换指令

    void SWAP(bool &a,bool &b){
    bool temp=a;
    a=b;
    b=temp;
    }
    
    展开全文
  • 临界区

    2008-08-02 17:02:00
    2、进程进入临界区调度原则是:① 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须...
    1、什么是临界区?
    答:每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。



    2、进程进入临界区的调度原则是:
    ① 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。④如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现“忙等”现象。

    互斥对象是一种最简单的内核对象,用它可以方便的实现对某一资源的互斥访问。因为它是内核对象,因此可以产生信号,实际上,程序中就是利用这一点实现互斥的。 
      如果没记错的话,临界区并不是内核对象,而是系统提供的一种数据结构,程序中可以声明一个该类型变量,之后用它来实现对资源的互斥访问。当欲访问某一临界资源时,先将该临界区加锁(如果临界区不空闲,等待),用完该资源后,将临界区释放。 
      一般,将他们用于线程间的同步,而且通常可以互换使用。 
      如果要实现复杂互斥,应使用其它方法,如信号量内核对象等。临界区对象不能跨越进程,是线程间共享数据区的同步对象;互斥对象可以作为进程间共享数据区的同步对象。

     
    展开全文
  • 简介 每个进程中访问临界资源的那段代码称为临界区(Critical Section)...进程进入临界区调度原则是: 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。 任何时候,处于临界区内的进程不可多于一个。

    简介

    每个进程中访问临界资源的那段代码称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源)。
    每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
    多个进程中涉及到同一个临界资源的临界区称为相关临界区。

    注:多线程并发访问全局变量也是临界区问题

    程序调度法则

    进程进入临界区的调度原则是:

    1. 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
    2. 任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
    3. 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
    4. 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象

    FreeRTOS解决方法

    访问一个被多任务共享,或是被多任务和中断共享的资源时,需要采用“互斥”技术以保证数据在任何时候都保持一致性。这样做的目的是要确保任务从开始访问资源就具有排它性,直到这个资源又恢复到完整状态。

    基本临界区

    基本临界区是指宏taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间的代码区间。也被称为Critical Section或者Critical Regions. 使用方法如下:

    // 为了保证PORTA的访问不被中断,将访问操作放入临界区运行
    taskENTER_CRITICAL();        //进入基本临界区
     
    // 在taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间不会切换到其他任务,中断可以执行,也允许嵌
    //套,但只是针对优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的任务,而且这些中断不允许访问
    //FreeRTOS的API函数。
     
    PORTA |= 0x01;
     
     
    taskEXIT_CRITICAL();        //退出基本临界区
    

    临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作 仅仅是简单的把中断全部关掉,或者是关掉优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY以下的中断-依赖具体使用的FreeRTOS移植。抢占式的上下文切换只可能在某中断中完成,因此调用taskENTER_CRITICAL()可以在中断关闭的时段一直保持持续运行状态直到退出临界区。

    临界区必须具有很短的时间,否则会反过来影响中断的响应时间。在每次使用taskENTER_CRITICAL()之后必须尽快的配套一个taskEXIT_CRITICAL()来退出临界区。

    使用信号量或者互斥量

    推荐使用互斥量,因为互斥量解决了优先级翻转的问题

    void process_data(void)
    {
        if(xSemaphoreTake(xSemaphore, 10) == pdTRUE)
        {
            x++;
            xSemaphoreGive( xSemaphore );
        }
    }
    

    信号量和互斥量的最大区别是

    (1)用于互斥的信号量必须归还
    (2)用于同步的信号量在完成同步后变丢弃,不需要归还

    禁止任务调度

    vTaskSuspendAll(void);   //挂起调度器创建临界区(禁止任务调度 suspend the scheduler)
     
    /*
       通过vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不用关中断,如果某个中断在调
    度器挂起过程中要求进行上下文切换,则这个要求也会被挂起,直到调度器被唤醒后才会得到执行。
    */
     
    vTaskResumeAll(void);  //(解除禁止任务调度 resuming the scheduler; 成对使用)
    /*
    返回值:pdTRUE: 
       在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器唤醒才被执行,如果一个挂起的上下文切换请求在vTaskResumeAll()返回前得到执行,则返回pdTRUE.
    返回值:pdFALSE:
       如果是其他情况,则返回pdFALSE.
    */
     
    // 注意1:两个函数成对使用;
    // 注意2:两者之间不能调用FreeRTOS系统API.
    

    如果一段临界区太长而不适合简单的关中断来实现,可以考虑采用挂起调度器的方式
    唤醒调度器是一个相对较长的操作
    基本临界区是保护一段代码区间不被其他任务或中断打断。而由挂起调度器实现的临界区只能保护一段代码不被其他任务打断,并不能约束中断,因为在这种方式下,中断是使能的。
    调度器处于挂起状态时,不能调用FreeRTOS的API函数。

    展开全文
  • 操作系统临界区

    千次阅读 2011-02-24 23:07:00
    进程进入临界区调度原则是: ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须...
  • 操作系统 之 临界区 浅析

    千次阅读 2015-11-20 11:42:01
    进程进入临界区调度原则 ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。...
  • 什么是临界区

    千次阅读 2010-10-28 15:53:00
      <br /> <br />2、进程进入临界区调度原则是:  ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,...
  • L17 信号量临界区保护

    2020-02-29 17:41:39
    为什么要保护信号量和临界区? 在现实中如何保护信号量和临界区? empty = -1:的含义? 表示有一个进程正在睡眠 为什么要保护?...临界区代码的保护原则临界区怎样设计呢? 方法一 用一个轮...
  • 1.临界区管理  临界区:并发进程中与共享变量有关的...3.临界区调度原则 一次至多允许一个进程进入临界区内 如果已有进程在临界区中,试图进入此临界区的其他进程应等待; 进入临界区的进程应在有限时间...
  • 2、进程进入临界区调度原则是:①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。 ②任何时候,处于临界区内的进程不可 多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程...
  • 一、【临界区】 每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界 资源是一次仅允许一个进程使用的共享资源)。...【进程进入临界区调度原则】 如果有若干进程要求进入空闲的临界区,一...
  • 如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他视图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占,临界区调度原则: 同一时间临界区内仅有...
  • 一、进程与程序的主要区别是: ·进程是动态的;程序是静态的。 ·进程有独立性,能并发执行;...二、一进程进入临界区调度原则是: ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入...
  • 线程同步与互斥

    2018-07-21 15:29:40
    进程进入临界区调度原则是: 如果有若干进程要求进程空闲的临界区,每次只允许一个进程进入临界区,进入后不允许其他进程进入。 任何时候,处于临界区内的进程不可多余一个。如已有进程进入自己的临界区,则其他...
  • Critical Section

    2011-04-21 10:35:00
    不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)。 每个线程中访问临界资源... 线程进入临界区调度原则是: ①如果有若
  • 1)操作系统对共享一个变量的若干线程进入各自临界区有以下3个调度原则: 2)一次至多一个线程能够在它的临界区内。 3)不能让一个线程无限地留在它的临界区内。 4)不能强迫一个线程无限地等待进入它的临界区。...
  • 临界区(Critical Section)临界区代码的保护原则临界区保护的直观想法:两个进程之间的调度进入临界区的第一个尝试 - 轮换法:进入临界区的又一个尝试 - 标记法:Peterson算法:多个进程调度面包店算法:通过开关...
  • 微软笔试题 汇总

    2010-06-13 15:17:00
     进程进入临界区调度原则是:  ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。  ②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有...
  • 计算机操作系统05

    2020-03-14 18:46:40
    4.4临界区和锁 4.4.1临界资源与临界区 1.临界资源:(Critical Resource...(1)忙则等待 (2)空闲让进(3)有限等待(4)让权等待(等待进程需先放弃CPU,不用重复询问临界区是否让进,等待系统调度) 4.4.2锁机制 1....
  • 3. 同步、通信和死锁 3.1 并发 进程执行的并发性:一组进程的执行在时间上是重叠的。 Bernstein条件:若两个进程的程序P1和P2能满足引用变量集与改变变量集的交集...临界区调度原则 一次至多一个进程能够进入临界
  • 操作系统原理ppt

    2018-12-22 10:35:58
    掌握进程同步与互斥的概念,临界资源和临界区的概念,理解进入临界区原则。 理解信号量概念,P、V操作执行的动作,能用信号量和PV操作实现简单的进程互斥或同步。 掌握进程死锁的概念、产生的必要条件及解决死锁...
  • 临界区调度原则中有: 互斥使用 有空让进 忙则等待 有限等待 择一而入 算法可行 在实际应用中,我们考虑对临界区的管理有软件算法,也有硬件设施,但是这些偏软,偏硬的方法,或存在复杂、效率低下,或存在浪费...
  • 第二章

    2019-12-31 16:05:58
    2.4 进程进入临界区调度原则是什么:2.5进程(PCB表)的组织方式2.6.简述信号量的定义和作用。P、V操作原语是如何定义的?2.7 信号量的取值(与相应资源的使用情况有关)2.8 线程和进程的关系2.9 实现线程的主要两张...
  • S = −n 时,表示有n 个等待进入临界区的进程,当前已有进程在临界区中访问临界资源; S = 0 时,表示不允许任何进程进入临界区,当前已有进程在临界区中访问临界资源; S = n 时,表示临界区是空闲的,该类资源的...
  • 进程管理复习

    2020-06-21 23:19:00
    文章目录进程管理处理器方面(软硬件)指令系统(特权、非特权)存储...原则(背计算公式)作业管理与调度低级调度FCFSSJF/SPFSRTFHRRFHPFRRMLFQ解题思路同步、通讯与死锁进程交互临界区同步忙式等待策略(软硬件)...
  • 《操作系统原理与设计》全本

    热门讨论 2012-02-14 15:54:16
    5.2.4 实现临界区管理的硬件设施 113 5.3 信号量与PV操作 114 5.3.1 同步和同步机制 114 5.3.2 记录型信号量与PV操作 116 5.3.3 用记录型信号量实现互斥 117 5.3.4 记录型信号量解决生产者-消费者问题 119 5.3.5 ...
  • 4.临界资源和临界区 5.同步机制应遵循的原则 6.信号量与P/V操作 7.生产者与消费者问题 1.进程控制的概念 进程由创建产生,由调度执行,由撤销消亡。 2.进程的创建 申请PCB空间,为新进程分配资源,把有关...
  • 操作系统重点

    2013-01-15 16:59:50
    理解进程临界资源和临界区的概念,进程进入临界区调度原则。信号量概念,P、V操作执行的动作。  5.死锁的概念;死锁的4个必要条件:互斥条件、不可抢占条件、占有且申请条件、循环等待条件。  【了解】  1....

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

临界区调度原则