嵌入式系统中线程、信号、管道_第1页
嵌入式系统中线程、信号、管道_第2页
嵌入式系统中线程、信号、管道_第3页
嵌入式系统中线程、信号、管道_第4页
嵌入式系统中线程、信号、管道_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

27.嵌入式系统中线程、信号、管道一、多道程序技术为了提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术(multi-programming),使多个程序同时在系统中存在并运行。CPUI/O单道程序:多道程序:CPUI/O作业甲(红黄)作业乙(蓝绿)在多道程序系统中,各个程序之间是并发执行的,共享系统资源。CPU需要在各个运行的程序之间来回地切换,这样的话,要想描述这些多道的并发活动过程就变得很困难。为此,操作系统设计者提出了进程的概念。二、进程和线程2.1什么是进程(任务)?Aprocess=aprograminexecution是可并发执行的、具有独立功能的程序在一个数据集合上的运行过程,是操作系统进行资源分配和保护的基本单位。一个进程可以简单地认为是一个程序在系统内的唯一执行。Linux中,进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其余的进程。每个进程运行在其各自的虚拟地址空间中,进程之间可以通过由内核控制的机制相互通讯。一个进程应该包括:程序的代码;程序的数据;PC中的值,用来指示下一条将运行的指令;一组通用的寄存器的当前值,堆、栈;一组系统资源(如打开的文件)总之,进程包含了正在运行的一个程序的所有状态信息。特点:动态性:程序的运行状态在变,PC、寄

存器、堆和栈等;并发性:从宏观上看各进程是同时独立运行的独立性:是一个独立的实体,是计算机系统资源的使用单位。

每个进程都有“自己”的PC和内部状态,运行时独

立于其他的进程;异步性:多个进程的执行次序互不相关Process≠Program程序=代码/命令进程=程序+运行状态main()

{…..}A()

{…..}

PROGRAMmain()

{…..}A()

{…..}

PROCESS

StackRegisters,PC2.2什么是线程?

自从60年代提出进程概念以来,在操作系统中一直都是以进程作为独立运行的基本单位,直到80年代中期,人们又提出了更小的能独立运行的基本单位线程。2.3为什么提出线程?【案例】编写一个MP3播放软件。核心功能模块有三个:(1)从MP3音频文件当中读取数据;(2)对数据进行解压缩;(3)把解压缩后的音频数据播放出来。main()

{

while(TRUE)

{Read();

Decompress();

Play();

}}Read(){…}

Decompress(){…}Play(){…}问题:播放出来的声音能

否连贯?各个函数之间不是

并发执行,影响资

源的使用效率;I/OCPU单进程的实现方法多进程的实现方法程序1

main()

{

while(TRUE)

{Read();

}}Read(){…}问题:进程之间如何通信,共享数据?程序3

main()

{

while(TRUE)

{Play();

}}Play(){…}程序2

main()

{

while(TRUE)

{Decompress();

}}Decompress(){…}如何解决?需要提出一种新的实体,满足以下特性:(1)实体之间可以真正地并发执行;(2)实体之间共享相同的地址空间及其他资源;这种实体就是:线程(Thread)从两个方面来理解进程:从资源组合的角度:进程把一组相关的

资源组合起来,构成了一个资源平台

(环境),包括地址空间(代码段、数据

段)、打开的文件等各种资源;从运行的角度:代码在这个资源平台上的

一条执行流程(线程)。资源平台线程进程=线程+资源平台优点:一个进程中可以同时存在多个线程;各个线程之间可以并发地执行;各个线程之间可以共享地址空间。进程和线程的区别:

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。1.进程间为什么要通信

•数据传输(一个进程有数据要传给另一个进程)•资源共享(多个进程相互协调,共同使用临界资源)•通知事件(一个进程要向另一个进程发送消息,通知其某个事件)•进程控制(有些进程要控制另一些进程,如Debug)三、进程间通信2.进程间通信嵌入式系统中进程间通信主要采用两种形式:共享内存和消息传递。二者在逻辑上没有什么区别,进程通信采用哪种方式,主要依赖实际需要。进程间通信也可以采用信号和管道的方式。(1)共享内存方式两个进程通过共享内存单元进行通信,进程P1和进程P2的软件设计为操作已知的共享单元地址。如果P1想要给P2发送信息,它即把信息写入共享单元中;然后P2从共享单元中读出这些信息。(2)消息传递方式消息传递方式是共享内存通信方式的补充,每个通信实体有自己的发送和接收单元。消息并不是存储在通信链路中,而是保存在发送和接收方的端点处。3.信号信号是操作系统中使用最早的进程间通信机制之一,主要用于向一个或多个进程发异步事件信号,许多嵌入式操作系统也采用了信号机制。信号实际上是一个中断的模拟,它不仅可以由硬件产生,也可以由软件产生。即在进程执行的过程中,如果系统发现某个进程接收到了信号,就暂时打断进程的执行,转而去执行该进程的信号处理程序,处理完毕后,再从进程“被打断”之处继续执行。信号由一个进程产生,然后由操作系统传递给另一个进程。信号机制是比较简单的,这是因为除了信号本身,它并不传递数据。信号机制是Unix系统中最为古老的进程间通信机制,有很多情况可以产生一个信号:

•用户按下某个按键•硬件异常(如除数为0)•进程使用kill函数向另一个进程发送信号•用户使用kill命令向其他进程发送信号3.1常见信号类型SIGHUP:系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。SIGINT:程序终止(interrupt)信号,在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。SIGILL:执行了非法指令。

通常是因为可执行文件本身出现错误,

或者试图执行数据段。堆栈溢出时也有可能产生这个信号。SIGTRAP

由断点指令或其它trap指令产生,由debugger使用。

3.2和信号相关的函数

a.kill函数(sys/types.h、signal.h)•原型:intkill(pid_tpid,intsigno)•功能:kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数sig代表的信号编号。

•pid的4种取值:*pid>0表示将信号发送给PID=pid的进程*pid=0表示将信号发送给同组的进程*pid<0表示将信号发送给PID=|pid|的进程*pid=-1表示将信号发给所有进程b.raise函数(sys/types.h、signal.h)•原型:intraise(intsigno)•功能:允许进程给自身发送信号。 intraise(intsigno);

raise(signo)

等价于

kill(getpid(),signo);

c.alarm函数(unistd.h)•原型:unsignedintalarm(unsignedintseconds)•功能:设置一个闹钟时间,到点时产生SIGALRM信号给自己(如果不捕获该信号,则默认操作为终止该进程);

•说明:*每个进程只能有一个闹钟时间,旧闹钟未超时而设置新闹钟时,新的替换旧的;*旧闹钟未超时而设置新闹钟,且新闹钟的second=0时表示取消旧闹钟。d.pause函数(unistd.h)•原型:intpause(void)•功能:使调用该函数的进程挂起,直到捕捉到一个信号。3.3信号处理

•当某种信号出现时,通常有3种处理情形:*忽略此信号(大多数信号被这样处理,但SIGKILL(终止某个进程)和SIGSTOP(暂停进程)不能被忽略,因为二者为超级用户提供了一种终止进程的方法)*执行用户希望的动作(通知内核在某种信号发生时,调用事先声明的函数)*执行系统默认的动作(大多数信号的默认动作是终止该进程)4、

管道通信4.1什么是管道

•将一个进程的输出和另一个进程的输入连接在一起,是单向

的、先进先出的,是进程间通信的另一种机制。在Linux系

统中,管道用两个指向同一个临时性VFS索引结点(内存中

的索引结点)的文件数据结构来实现。•写进程负责在管道尾部写入数据,读进程负责从管道头部读

出数据;•数据被进程读出后将被从管道中删除;•读空管道和写满管道的进程都将被阻塞;•管道分为无名管道和有名管道。•对管道的访问必须同步,以使读进程和写进程步调一致。Linux使用了锁、等待队列和信号量三种方式来实现同步。4.2创建管道内核是按照创建“管道文件”的模式创建“管道”的,其他类型的文件都是为“一个进程”的使用而创建的,而管道文件则“天然地”就是为了“两个进程(即读管道进程和写管道进程)”的使用而创建的。步骤如下:1)为管道文件在文件管理表中申请空闲项;2)为管道文件与进程建立联系创造条件;3)创建管道文件i结点(i节点中载入的是内存页面的地址);4)将管道文件i结点与文件管理表建立联系;5)将管道文件句柄返回给用户进程;6)读管道进程开始操作管道文件(由于此时管道内没有任

何数据,所以此时系统会将读管道进程挂起,然后切换

到写管道进程中去执行);7)写管道进程向管道中写入数据(Linux0.11默认:每次写

管道执行完毕后,管道中就拥有了可以读出的数据,所

以就会唤醒读管道进程;每次读管道执行完毕后,管道

中就拥有了可以写入数据的空间,所以就会唤醒写管道

进程,但唤醒并不等于立即执行。);8)写管道进程继续向管道写入数据(当写管道操作次数执

行完后,写管道进程的时间片还没有完,所以还要继续

进行写管道操作);9)写管道进程已将管道空间写满(在写管道进程工作的过

程中,一定会发生时钟中断,而时钟中断仅仅是削减了

它的时间片,只要时间片不被削减为0,它就会继续执行,

直到写管道进程把管道写满为止);10)写管道进程挂起;11)读管

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论