uniaccess进程无法结束 拒绝访问_嵌入式Linux编程——程序员小白不懂的进程、信号量、并发、互斥...

所有学嵌入式Linux系统的看过来了,以下内容是每一位想学习Linux嵌入式系统想要了解的内容,真的很想要分享给大家!

本文分享的内容主要如下几个方面:

3.1 并发的原理

3.1.1 一个简单的例子

3.1.2 竞争条件

3.1.3 操作系统关注的问题

3.1.4 进程的交互

3.1.5 互斥的要求

3.2 信号量原理

3.2.1 互斥

3.3 生产者/消费者问题

3.4 读者-写者问题

3.3.1 读进程具有优先权

3.3.2 写进程具有优先权

本章首先介绍并发的概念和多个并发进程的执行。我们发现,支持并发进程的基本需求是加强互斥的能力。也就是说,当一个进程被授予互斥的能力时,那么在其活动期间,它具有排斥所有其他进程的能。

本章通过两个经典的并发问题来说明并发的概念,并对本书中使用的各种方法进行比较。在本章开始

将介绍一个可运行的例子——生产者/消费者问题,读者-写者问题。

79c4a7ab334f1dbb5d518dea8c54fae1.png

3.1 并发的原理

在单处理器多道程序设计系统中,进程被交替执行,表现出一种并发执行的外部特征。即使不能实现真正的并行处理,并且即使在进程间来回切换需要一定的开销,交替执行在处理效率和程序构造上还是带来了重要的好处。

在单处理器的情况下,问题源于多道程序设计系统的一个基本特性:进程的相对执行速度不可预测,

它取决于其他进程的活动、操作系统处理中断的方式以及操作系统的调度策略。这就带来了下列困难:

 全局资源的共享充满了危险。例如,如果两个进程都使用同一个全局变量,并且都对该变量执行读

写操作,那么不同的读写执行顺序是非常关键的。关于这个问题的例子将在下一小节中给出。

 操作系统很难对分配资源进行最优化的管理。例如,进程 A 可能请求使用一个特定的 I/O 通道,并

获得控制权,但它在使用这个通道前被挂起了,操作系统仍然锁定这个通道,以防止其他进程使用,

这是难以令人满意的。此外,这还会导致死锁。

 定位程序设计错误是非常困难的。这是因为结果通常是不确定的和不可再现的。

上述所有困难在多处理器系统中都有具体的表现,因为在这样的系统中进程执行的相对速度也是不可

预测的。一个多处理器系统还必须处理多个进程同时执行所引发的问题,从根本上来说,这些问题和单处

理器系统中的是相同的。这些问题随着讨论的深入将逐渐明了。

3.1.1 一个简单的例子

考虑下面的过程:

6135272e1df6da1d9ea4456b274cbbe3.png
c2bdef32b45f145eb4ae409ab76ffd8b.png

为理解如何解决与执行速度无关的问题,我们首先需要考虑进程间的交互方式。

3.1.4 进程的交互

1 、进程中的资源争用

当并发进程竞争使用同一个资源时,它们互相之间会发生冲突。我们可以把这种情况简单描述如下:

两个或更多的进程在它们的执行过程中需要访问一个资源,每个进程并不知道其他进程的存在,并且每个进程也不受其他进程的执行的影响。每个进程都不影响它所使用的资源的状态,这类资源包括 I/O 设备、存储器、处理器时间和时钟。

竞争进程间没有任何信息交换,但是一个进程的执行可能会影响到竞争进程的行为。特别是如果两个进程都期望访问同一个资源,操作系统把这个资源分配给一个进程,另一个就必须等待。因此,被拒绝访

问的进程速度就会变慢。一种极端情况是,被阻塞的进程永远不能访问这个资源,因此一直不能成功地终止。

竞争进程面临三个控制问题。首先是互斥的要求。假设两个或更多的进程需要访问一个不可共享的资

源,如打印机。在执行过程中,每个进程都给该 I/O 设备发命令,接收状态信息,发送数据和接收数据。

我们把这类资源称为临界资源,使用临界资源的那一部分代码称为程序的临界区。一次只允许有一个程序在临界区中,这一点是非常重要的。由于不清楚详细要求,我们不能仅仅依靠操作系统来理解和增强这个限制。例如在打印机的例子中,我们希望任何一个进程在打印整个文件时都拥有打印机的控制权,否则在打印结果中就会穿插着来自竞争资源的打印内容。

实施互斥产生了两个额外的控制问题。一个是 死锁。例如,考虑两个进程 Pl 和 P2,以及两个资源 Rl

和 R2,假设每个进程为执行部分功能都需要访问这两个资源,那么就有可能出现下列情况:操作系统把 Rl分配给 P2,把 R2 分配给 Pl,每个进程都在等待另一个资源,并且在获得其他资源并完成需要这两个资源的功能之前,谁都不会释放自己已经拥有的资源。这样,这两个进程就发生了死锁

另一个控制问题是 饥饿。假设有三个进程(P1、P2 和 P3),每个进程都周期性地访问资源 R。考虑这种情况,Pl 拥有资源,P2 和 P3 都被延迟,等待这个资源。当 Pl 退出临界区时,P2 和 P3 都允许访问 R。假设操作系统把访问权授予 P3,并且在 P3 完成临界区之前 PI 又需要访问该临界区,如果在 P3 结束后操作系统又把访问权授予 Pl,并且接下来把访问权轮流授予 Pl 和 P3,那么即使没有死锁,P2 也可能无限期地被拒绝访问资源。

由于操作系统负责分配资源,竞争的控制不可避免地涉及到操作系统。此外,进程自身需要能够以某

种方式表达互斥的要求,如在使用资源前锁定资源,但任何一种解决方案都涉及到操作系统的某些支持,如提供锁机制。图 3.2 用抽象术语给出了互斥机制。假设有 n 个进程并发执行,每个进程包括(1)在某些资源 Ra 上操作的临界区,(2)不涉及访问资源 Ra 的额外代码。因为所有的进程都需要访问同一资源 Ra,因此保证在同一时刻只有一个进程在临界区是很重要的。为实现互斥,需要两个函数:entercritical 和exitcritical。每个函数的参数都是竞争使用的资源名,如果另外一个进程在临界区中,那么任何试图进入关于同一个资源的临界区的讲程都必须等待。

21d5e2033a95ebd42547c532ca9c8989.png
0dc265802c4617562fbeb611aad83c02.png
267cf18698fe6f6049a58aa224778c5b.png
2c1b9fd36eefcd1299b5f1d3634a6ce3.png
d649654396ad55adc3adfb624532d471.png
06051b04073826ca09b5d9dd8e19dd2a.png
0f62b14e833a242d71dc5f9b86e9995d.png
96e7d17c2a9b59f0819025207a3e3443.png
537c1fa9b2310b94e4931b87566e8fbc.png
6d5349e825e343688aa23df94abb9fab.png
a055d67db881afe4ac350f5f2687b403.png
344284977900bef366581006429ba898.png
e4fceca128d8d74c5ac10b9a6dfe710c.png
c24bdd600ca98947e51308468335750c.png
1dabfbfdb0a49573ca95a2a25bbbbb90.png

本章总结

现代操作系统的中心方案是多道程序设计、多处理和分布式处理,这些方案的基础以及操作系统设计

技术的基础是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是在单处理器多道程序系统中,都会产生解决冲突和合作的问题。

并发进程可以按多种方式进行交互。互相之间不知道对方的进程可能需要竞争使用资源,如处理器时

间或对 I/O 设备的访问。进程间由于共享访问一个公共对象,如主存中的一块空间或一个文件,可能间接知道对方,这类交互中产生的重要问题是互斥和死锁。

互斥是指,对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能。互

斥技术可以用于解决诸如资源争用之类的冲突,还可以用于进程间的同步,使得它们可以合作。后一种情况的一个例子是生产者/消费者模型,一个进程往缓冲区中放数据,另一个或更多的进程从缓冲区中取数据。

支持互斥的第二种方法涉及到使用专门的机器指令,这种方法减少了开销;但由于使用了忙等待,因

而仍然是低效的。

支持互斥的另一种方法是在操作系统中提供功能,其中最常见的两种技术是信号量和消息机制。信号

量用于在进程间发信号,并可以很容易地用于实施一个互斥规定。消息对实施互斥是很有用的,它还为进程间的通信提供了一种有效的方法。

死锁是指一组争用系统资源或互相通信的进程被阻塞的现象。阻塞是永久的,除非操作系统采取某些

非常的行动,如杀死一个或多个进程,或者强迫一个或多个进程沿原路返回。死锁可能涉及到可重用资源或可消费资源。可重用资源是指不会因为使用而被耗尽或毁灭的资源,如 I/O 通道或存储器区域。可消费资源是指当被一个进程获得时就毁灭了的资源,这类资源的例子有消息和 I/O 缓冲区中的信息。

处理死锁通常有三种方法:预防、检测和避免。死锁预防通过确保死锁的一个必要条件不会满足,保

证不会发生死锁。本章没有对检测和避免进行深入讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我常用的在线取色器

颜色明淡 http://www.colorschemer.com/online.html 2.http://tool.cc/color/ 转载于:https://www.cnblogs.com/xiaoliu66007/p/5145955.html

python支持向量机回归_Python中支持向量机SVM的使用方法详解

除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm。 一、导入sklearn算法包 Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用…

linux awk命令详解

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处…

解决了界面上菜单项跑到其它AE控件后面的问题(java)

菜单项竟然跑到后面去了,搞了好多天,终于解决了 只要把这句代码放到main()的最前面就可以了 JPopupMenu.setDefaultLightWeightPopupEnabled(false); 转载于:https://www.cnblogs.com/bluemaplestudio/archive/2010/02/28/1675171.html

matlab利用霍夫,基于matlab的霍夫变换

霍夫变换(限量版)基于matlab的霍夫变换 一、简单介绍Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问…

python网站用什么数据库_PyMySQL数据库的使用

前面我们学习了SQLite数据库的相关内容,我们也通过前面的内容学习到了数据库的相关操作,PyMySQL数据库的操作和前面的内容类似,但我们可以通过Navicat直接来查看数据库中的内容,实现数据可视化,前面我们已经完成了下载…

宏与内联(inline)的区别(转载)

先转载下人家总结的宏和普通函数调用的区别:(1)、宏只做简单的字符串替换,函数是参数传递,所以必然有参数类型检查(支持各种类型,而不是只有字符串)。(2)、宏不经计算而直接替换参数,函数调用则是将参数表达式求值再传…

web 服务器 内存 影响_高性能服务器架构思路「不仅是思路」

在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问…

100~200之间的素数(及其四个优化方案)

要求素数,首先我们要知道什么是素数,在解题的时候,不要急着去寻找方法解题,而是要先了解它的根本,才可以在遇到类似题的时候轻松面对解决质数(prime number)又称素数,有无限个。一个大于1的自然数&#xff…

php项目安装器,php服务器环境安装及项目搭建

2安装运行环境及搭建项目2.1安装apache及测试1)安装apacheyum install httpd启动apachesystemctl start httpd.service查看运行状态systemctl status httpd.service2)编辑测试页面echo “xingming”>/var/www/html/index.html3)打开浏览器输入公网ip地址,结果如下…

单链表删除所有值为x的元素_线性表之单链表

单链表一种以链接方式存储的线性表,适用于频繁增删操作,存储空间不定的情形。单链表的一个存储结点包含两个域,数据域和指针域。数据域用于存储线性表的一个数据元素,指针域用于指示下一个结点开始的存储地址。链表第一个结点的地…

PHP自动测试框架Top 10

2019独角兽企业重金招聘Python工程师标准>>> 对于很多PHP开发新手来说,测试自己编写的代码是一个非常棘手的问题。如果出现问题,他们将不知道下一步该怎么做。花费很长的时间调试PHP代码是一个非常不明智的选择,最好的方法就是在编…

树莓派 设备信息 php,树莓派实现DDNS(PHP计划任务)

之前介绍了DNSPod动态IP解析更新程序,是Python实现的。下面介绍一个PHP实现的脚本,实现了同样的动态域名解析功能。header("Content-type: text/html; charsetutf8");class Dns{#Dnspod账户private $dnspod_user userexample.com;#Dnspod密码…

某公司数据恢复报告书

一、故障描述1、设备清单设备名称设备型号数量HP FC存储HP MSA20001450G SAS.硬盘82、故障描述整个存储空间由8块450GB SAS的硬盘组成,其中7块硬盘组成一个RAID5的阵列,剩余1块做成热备盘使用。由于RAID5阵列中出现2块硬盘损坏,而此时只有一块…

java里的时间转换

2019独角兽企业重金招聘Python工程师标准>>> http://cwind.iteye.com/blog/1908589 http://dyccsxg.iteye.com/blog/1908607 转载于:https://my.oschina.net/mustang/blog/608365

command对象提供的3个execute方法是_并发面试题:java中有几种方法可以实现一个线程?...

创建并启动线程的6种方式 继承Thread类创建线程实现Runnable接口创建线程使用Callable和FutureTask创建线程使用线程池,例如用Executor框架Spring实现多线程(底层是线程池)定时器Timer (底层封装了一个TimerThread对象&#xff09…

matlab中如何提取等高线,在Python或MATLAB中从等高线图中提取数据

这是一个小型的Matlab脚本,可以完成这项工作(使用一些GUI,在图的斜角处读取guidlines):%// Import the data:imdata importdata(your_picture_file);Gray rgb2gray(imdata.cdata);colorLim [-1 1]; %// this should be set manually%// Ge…

【Android Studio】分类整理res/Layouts中的布局文件(创建子目录)

好吧,这个功能需求也是因为作为一个重度强迫症患者,非常想要把layouts中的文件分类整理下。否则看到一堆Activity和Fragment等文件混在一起特别难受。更重要的原因是,如果你的工程交给别人维护,别人看到一堆布局文件压根不知道从哪…

SQL排序查询

1.建一张客户表,包含客户名称,联系人,电话号码,公司地址. 2.建一张订单表,包含订单编号,客户ID,供应商ID,订单金额,客户支付状态,供应商支付状态,订单日期. 3.建一张供应商表&#x…

mysql8创建用户并授权_新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

作者:秦福朗爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱 IT,喜欢在互联网里畅游,擅长摄影、厨艺,不会厨艺的 DBA 不是好司机,didi~本文来源:原创投稿*爱可生开源社区出品…