信号量

ucosii-2- 5330杨璟旭

老子叫甜甜 提交于 2019-12-29 10:04:21
题目要求 阅读附件中的代码,回答: ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? 1. ucos是如何分层的? 一共四层:硬件相关层,驱动接口层,应用接口层,应用层。好的分层会让软件开发相对独立化,分工同步进行。 所有的硬件被抽象化,应用层的程序,在硬件完全更换的情况下,只要硬件相关层被更新,完全可以等同原先的所实现的功能。这样就极大成度上方便了移植。 硬件相关层: 在这层中,要尽量所有硬件相关都囊括在其中。不管是GPIO还是定时器,或串行接口。只要提供标准统一的接口,就可以让上层会因此而变的很潇洒。这其中有三个最为重要的接口Open,Close,Ctrl。 Open主要来完成对应硬件初始化,形参中包括了些,初始化的相关参数。Close失能硬件。Ctrl来实现一些控制的修改如:优先级,中断回调函数等等,硬件的不同,内容也大为不同。 驱动接口层: 其实在上一层也算是驱动层,只不过因为硬件相关,而把他分离。这层中会用到一个或多个硬件层的接口,进行组合来实现特定功能的程序。这部分程序可举例进行说明。以Flash为列,它这里主要调用硬件层的SPI函数接口,但是主要的写,读指令都是在这里函数中完成的。在这层中需要提供5个标准统一的接口函数: XXXOpen XXXClose XXXWrite XXXRead XXXIoCtl 没有被用到的函数,可以为空

操作系统知识体系复习总结总结

纵然是瞬间 提交于 2019-12-28 21:23:23
说明:本篇只为复习大纲,并未详细说明。 第一章 操作系统引论 统的目标:有效性(提高资源利用率和系统吞吐量)、方便性、可扩充性、开放性。 有效性 和 方便性 是操作系统最重要两个目标。 操作系统的作用: (1) OS作为用户与计算机硬件系统之间的接口 (2) OS作为计算机系统资源的管理者(处理器、存储器、I/O设备、数据程序) (3) OS实现了对计算机资源的抽象(在硬件上覆盖I/O设备、文件和窗口管理软件,即虚拟机) OS的发展过程:无操作系统的计算机系统→单道批处理系统→多道批处理系统→分时系统→实时系统→微机操作系统 操作系统的基本特征: (1) 并发性(两个或多个事件在 同一时间间隔内 发生;进入进程和线程) (2) 共享性(系统中资源可供内存中多个并发执行的进程(线程)共同使用, 方式为互斥共享方式和同时访问方式 ) (3) 虚拟性(通过某种技术把一个物理实体变为若干个逻辑上的对应物。方式: 时分复用技术和空分复用技术 ) (4) 异步性(进程以不可预知的速度向前推进,多道程序设计固有的特点) OS的主要功能: (1) 处理机管理(进程管理)功能;(主要包括创建和撤销进程、协调诸进程的运行、实现进程间信息交换、把处理机分配给进程。进程同步机制功能是协调多个进程的运行, 分为竞争和协作两种方式 ,实现进程同步常用的及时是 信号量机制 。调度包括 作业调度和进程调度 两步。

操作系统复习04

陌路散爱 提交于 2019-12-28 06:21:43
进程的同步与通信 进程间的联系 资源共享关系 相互合作关系 临界资源的含义 采取互斥的方式,实现共享的资源 ,一次只能供一个进程使用 临界资源典型案例 临界区的含义 每个进程中访问临界资源那段程序称为临界区 同步机制遵循原则 为了实现进程互斥,设置同步机制来协调诸进程,但进程必须遵循下述4条准则: 空闲让进 忙则等待 有限等待 让权等待 信号量机制 记录型信号量机制 信号量除初始化外,仅能通过两个标准的原子操作 wait(s) 和 signal(s) 来访问,也称为 P、V 操作,这是两个 原子操作 P、V操作 ——执行时不可中断的,同时也是互斥的 P–wait(s) V–signal(s) 相应的,wait(s)和signal(s)操作可描述如下: void wait ( static semaphore s ) //申请资源 { s . value -- ; //表示资源数目 if ( s . value < 0 ) block ( s , L ) ; //自我阻塞 } void signal ( static semaphore s ) //释放资源 { s . value ++ ; if ( s . value <= 0 ) wakeup ( s , L ) ; //唤醒进程访问临界资源 } 注意:wait()和signal()必须成对出现 缺少wait()导致系统混乱

操作系统期末复习

青春壹個敷衍的年華 提交于 2019-12-28 00:44:36
操作系统考纲 第一章 操作系统的概述 1.操作系统的概念、地位和作用 2.操作系统的发展历程 单道批处理OS 多道批处理OS(重) 分时OS(为了快速和用户交互) 实时OS(考虑响应问题) 个人计算机OS(具有以上三种特点) 网络OS 3.操作系统的特征 并发性(区别并行) 共享性 虚拟性(为了提高共享) 异步性(进程的推进速度不可预知,是并发导致的) 第二章(重)进程管理 1.进程的概念、特征及状态 就绪,执行,阻塞(哪些状态可以转换,哪些状态不能转换,什么时候会发生转换) 虚拟内存引入后五种状态 2.进程的组成及上下文 进程的组成 程序段:进程执行时的程序代码 数据段:进程执行时所需要的数据 进程控制块(PCB):进程存在的标志性数据结构 进程描述信息 处理机状态信息 进程调度信息 进程控制信息 进程上下文(概念) 3.进程和程序的关系 4.进程的互斥 与互斥相关的概念 互斥的概念及特征 互斥遵循的规则 互斥的实现方法 软件实现方法 硬件实现方法:硬件指令 信号量机制实现进程互斥 信号量的引入 信号量的作用 信号量的类型 整形信号量 记录型信号量 AND型信号量 信号量集 信号量的操作 初始化(建立)【说明所建信号量所代表的意义;赋初值,清空等待信号量的进程表】 等待信号量【WAIT(信号量);P(信号量)】 释放信号量【SIGNAL(信号量);V(信号量)】

Linux程序设计 Beginning_Linux_Programming

£可爱£侵袭症+ 提交于 2019-12-28 00:01:25
好文: https://blog.csdn.net/qq_29996285/article/details/94191750 2019-06-17 21:48:55 终于知道为啥C语言开头要include<stdio.h> 了! Write系统调用: OPEN系统调用: Close 系统调用: ioctl系统调用: 一个文件复制程序: 改进版: 一个目录扫描程序:P103 改进main函数,使其变成一个更有用的目录浏览器。 输出结果将分页显示,用户可以通过翻页查看其输出。 可以说,用户现在有了一个非常方便,通用的目录树浏览器。 3.10 /proc文件系统 该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问 查看CPU: 查看内存: 查看内核版本信息: 查看网络套接字的使用统计 查看系统中所有运行的程序同时能打开的文件总数: ps命令会给出当前正在运行进程的列表。 第四章: Linux环境: 4.1程序参数 这个程序利用计数参数argc建立一个循环来检查所有的程序参数。 4.2 环境变量 4.2.2 environ变量。 程序可以通过environ变量直接访问这个字符串数组。 这个程序遍历environ遍历,并打印出整个环境。 4.3 时间和日期 这个程序演示了time函数的用法 以从1970年开始计算的秒数来表示时间和日期。 为了提供(对人类)更有意义的时间和日期

信号量多线程同步

陌路散爱 提交于 2019-12-27 06:29:45
#include <iostream> #include <Windows.h> using namespace std; HANDLE hSemaphnore1; HANDLE hSemaphnore2; int global_variable =0; void Threadfun1(LPVOID pParam) { WaitForSingleObject(hSemaphnore1,INFINITE); while(1) { global_variable++; printf("%d\n",global_variable); Sleep(100); //睡眠下,让其他线程有机会抢占 if(global_variable ==10) { ReleaseSemaphore(hSemaphnore2, 1, NULL); //通知线程2 WaitForSingleObject(hSemaphnore1,INFINITE); //让线程1等待 } } } void Threadfun2(LPVOID nParam) { WaitForSingleObject(hSemaphnore2,INFINITE); while(1) { global_variable--; printf("%d\n",global_variable); Sleep(100); if(global_variable

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

利用信号量实现线程同步

此生再无相见时 提交于 2019-12-27 04:06:28
本篇使用信号量机制实现对全局资源的正确使用,包括以下两点: 各个子线程对全局资源的互斥使用 主线程对子线程的同步 信号量 简单的说,信号量内核对象,也是多线程同步的一种机制,它可以对资源访问进行计数,包括最大资源计数和当前资源计数,是两个32位的值;另外,计数是以原子访问的方式进行,由操作系统维护; 最大资源计数,表示可以控件的最大资源数量 当前资源计数,表示当前可用资源的数量 信号量的规则: 如果当前资源计数器大于0,那么信号量处于触发状态 如果当前资源计数器等于0,那么信号量处于未触发状态 系统绝对不会让当前资源计数器变为负数 当前资源计数器决定不会大于最大资源计数 信号量机制: 以一个停车场的运作为例。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用,当当前资源计数大于0,信号量处于触发状态,线程编程可调度; 相关API 创建信号量 HANDLE WINAPI CreateSemaphore( LPSECURITY_ATTRIBUTES

利用信号量实现线程同步

*爱你&永不变心* 提交于 2019-12-27 03:06:20
本篇使用信号量机制实现对全局资源的正确使用,包括以下两点: 各个子线程对全局资源的互斥使用 主线程对子线程的同步 信号量 简单的说,信号量内核对象,也是多线程同步的一种机制,它可以对资源访问进行计数,包括最大资源计数和当前资源计数,是两个32位的值;另外,计数是以原子访问的方式进行,由操作系统维护; 最大资源计数,表示可以控件的最大资源数量 当前资源计数,表示当前可用资源的数量 信号量的规则: 如果当前资源计数器大于0,那么信号量处于触发状态 如果当前资源计数器等于0,那么信号量处于未触发状态 系统绝对不会让当前资源计数器变为负数 当前资源计数器决定不会大于最大资源计数 信号量机制: 以一个停车场的运作为例。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用,当当前资源计数大于0,信号量处于触发状态,线程编程可调度; 相关API 创建信号量 HANDLE WINAPI CreateSemaphore( LPSECURITY_ATTRIBUTES

CEvent,CSemaphore,CCriticalSection,CMutex

浪尽此生 提交于 2019-12-26 22:43:54
一、用CEvent实现线程同步 事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态。在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适。例如,只有在通信端口缓冲区收到数据后,监视线程才被激活。 MFC中,CEvent类提供了对事件的支持。CEvent对象有两种类型:人工事件和自动事件。对于自动事件,当其获得信号后,就会释放下一个可用的线程。一个自动CEvent对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放所有可利用线程,直到调用成员函数ReSetEvent()将其设置为无信号状态时为止。 在创建CEvent对象时,默认创建的是自动事件 CEvent类的构造函数原型如下: CEvent(BOOL bInitia11y0wn=FALSE,//若bInitiallyOwn为TRUE,则使CMultilock类对象和CSingleLock类对象的线程可用;否则,要访问资源的线程必须等待。该参数的默认值为FALSEo BOOL bManualReset = FALSE,//指定要创建的CEvent对象是属于手工事件还是自动事件。为TRUE,则为手工事件;否则为自动事件。该参数默认值为FALSE o LPCTSTR lpszName=NULL,//指定要创建的事件对象的名,如果该事件对象将跨进程使用