




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统操作系统,吴国伟 大连理工大学软件学院,2010-12-16,2,重点回顾,进程描述 进程状态和切换 进程的创建、执行和销毁 多线程的创建,2010-12-16,3,第十章 Linux的进程管理-进程并发控制,10.1 Linux信号机制 10.2 Linux进程互斥 10.3 Linux进程同步 10.4 Linux进程间通信机制,2010-12-16,4,10.1 Linux信号机制,信号的基本概念 信 号 机 制,2010-12-16,5,信号的基本概念,信号是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。,2010-12-16,6,软中断信号用来通知进程发生了异步事件。 进程之间可以互相通过系统调用kill发送软中断信号。 内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。,2010-12-16,7,收到信号的进程对各种信号有三种不同的处理方法: 第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。 第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。 第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。,2010-12-16,8,在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。 Linux 用进程的 task_struct 中存放的信息来实现信号机制。 Linux 的信号屏蔽机制是通过一个32 位变量的位掩码来决定的,所以Linux 最多只能接受32 种信号量。,2010-12-16,9,2010-12-16,10,2010-12-16,11,信 号 机 制,信号机制: 内核如何向一个进程发送信号、进程如何接收一个信号、进程怎样控制自己对信号的反应、内核在什么时机处理和怎样处理进程收到的信号。,2010-12-16,12,内核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。 内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时。所以,当一个进程在内核态下运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理。,2010-12-16,13,有关信号的系统调用,系统调用signal是进程用来设定某个信号的处理方法 系统调用kill是用来发送信号给指定进程的。 pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时,2010-12-16,14,Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数),2010-12-16,15,实践环节,请使用介绍的信号处理函数,完成对信号的使用演示.,2010-12-16,16,10.2 Linux进程互斥,linux内核主要通过两种方式实现: 内核信号量(semaphore)机制 自旋锁(spin_lock)机制,2010-12-16,17,信号量和信号是不同的东西:信号是实现约定的固定的值,而信号量是一个变量记录着某些特定信息。 对信号量的操作只有两个:P, V,内核信号量,2010-12-16,18,在Linux 内核中定义在信号量上的两个原子操作分别为: (1) 减一操作down():当进程希望访问互斥资源的话,它调用该操作,信号量的值减一; (2) 加一操作up():当进程访问互斥资源完毕,它调用该操作,信号量的值加一。,2010-12-16,19,semaphore结构,2010-12-16,20,在初始化时,它的值初始化为1,当然也可以初始化为其它的正整数,那样能允许多个进程同时访问互斥资源。 整型变量count:也就是信号量的值,如果该变量值非负的话,进程可以访问互斥资源,该变量值的改变只能由上面的两个原子操作来完成; 等待进程链表指针wait:如果某个希望访问互斥资源的进程在执行完减一操作之后发现信号量的值为负值的话,进程将会挂起,并进入该链表。,2010-12-16,21,自旋锁,自旋锁的思想就是在不断循环中坚持反复尝试获取一个资源(一把“锁”),直到成功为止。 自旋锁最重要的特点就是进程在等待“锁”被释放时一直占据着CPU。 一般而言,只能在极短的操作过程中才使用自旋锁。特别是决不能在阻塞操作中持有锁。,2010-12-16,22,10.3 Linux进程同步,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。 Linux利用进程之间互相通讯,并和核心通讯,来协调它们的行为。 Linux内核中的同步机制:原子操作、内核信号量、自旋锁的API以及进程间通信的相关机制,2010-12-16,23,原子操作,原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。,2010-12-16,24,原子操作API,2010-12-16,25,9.3 Linux进程间通信机制,信号量 消息队列 管道 共享内存 网络套接口Socket,2010-12-16,26,2010-12-16,27,信号量,用户态的进程间通讯(IPC)机制中的信号量在概念和原理上与Linux内核信号量是一样的,但是内核信号量绝不可能在内核之外使用,因此它与内核信号量机制毫不相干。 数据结构的原型是semid_ds,在linux/sem.h中定义。 在数据结构semid_ds中包含一个指向信号量数组的指针。此数组中的每一个元素都是一个数据结构sem。,2010-12-16,28,semid_ds,2010-12-16,29,sem,2010-12-16,30,信号量操作API,int semget(key_t key, int nsems, int semflg); 创建一个新的信号量组或获取一个已经存在的信号量组。 int semop(int semid, struct sembuf *sop, int nsops); semop函数可以一次对一个或多个信号量进行操作。 int semctl(int sem_id, int semnum, int cmd,/*union semun arg*/); 该函数可以用来获取一些信号量的使用信息或者是来对信号量进行控制。,2010-12-16,31,信号量组:在逻辑上组织信号量 。在使用之前需要对信号量组进行初始化:生成或打开信号量组,向其中生成或删除你指定的信号量。 对信号量的操作只用两种,通过semop函数中的sops参数来指定的,如果这个参数 是一个数组的话,那么就是对多个信号量进行操作。Sops参数中的sem_op字段指明了对信号量进行的是P操作还是V操作。 使用信号量,需要清楚信号量组id和信号量在信号量组中的位置(其实也就是另一个id)。一个信号量必须属于一个信号量组,否则不能被系统所使用。 信号量和信号量组是不会被系统所自动清理的,所以当进程退出前,需要清理生成的信号量。,2010-12-16,32,消息队列,一个消息队列可以被多个进程所共享;如果一个进程的消息太多一个消息队列放不下,也可以用多于一个的消息队列. 共享消息队列的进程所发送的消息中除了massege本身外还有一个标志,这个标志可以指明该消息将由哪个进程或者是哪类进程接受。 对于系统中的每一个消息队列,都有一个数据结构来代表它,这个数据结构是msqid_ds,,2010-12-16,33,2010-12-16,34,2010-12-16,35,消息队列相关函数,int msgget(key_t key, int msgflg); 获取一个存在的消息队列的ID,或者是根据指定的权限创建一个消息队列。 int msgctl(int msqid, int cmd, struct msqid_ds *buf); 用来从msqid_ds中获取很多消息队列本身的信息。 int msgsnd(int msqid, void *msgp, size_t msgsz, int msgflg); 用于向队列发送消息。 int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg); 从队列中接收消息。,2010-12-16,36,管道,管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 它们都是通过内核缓冲区按先进先出的方式数据传输,管道一端顺序地写入数据,另一端顺序地读入数据读写的位置都是自动增加,数据只读一次,之后就被释放。在缓冲区写满时,则由相应的规则控制读写进程进入等待队列,当空的缓冲区有写入数据或满的缓冲区有数据读出时,就唤醒等待队列中的写进程继续读写。,2010-12-16,37,管道的读写规则,管道两端可分别用描述字fd0以及fd1来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd0表示,称其为管道读端;另一端则只能用于写,由描述字fd1来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。,2010-12-16,38,2010-12-16,39,无名管道,无名管道以类似文件的方式与进程交互,但不与磁盘打交道. 一个pipe如一个打开的文件,主要包括一个inode和两个file结构.,2010-12-16,40,2010-12-16,41,使用pipe的典型过程,进程1调用pipe()系统调用,得到两个文件描述符. 进程1调用fork()创建进程2 进程2调用close关闭与写file结构相关的文件描述符. 进程1调用close关闭与读file结构相关的文件描述符. 进程1调用write通过写相关的文件描述符向管道写数据. 进程2调用read通过读相关的文件描述符从管道读数据. 进程1调用close 进程2调用close,2010-12-16,42,管道的主要局限性正体现在它的特点上: 1. 只支持单向数据流; 2. 只能用于具有亲缘关系的进程之间; 3. 没有名字; 4. 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小); 5. 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等。,2010-12-16,43,命名管道,也叫FIFO管道,和管道不一样,FIFO管道有名字,不是临时对象,它们是文件系统中的实体并且 可以通过mkfifo命令来创建。 进程只要拥有适当的权限就可以自由使用FIFO管道。打开FIFO管道的方式稍有不同。,2010-12-16,44,管道中的同步机制,请思考管道两端的读写过程如何同步? 打开FIFO管道的方式有何不同。 Fs/pipe.c,2010-12-16,45,共享内存,共享内存允许一个或多个进程通过同时出现在它们虚拟地址空间中的内存来通讯。 此虚拟内存的页面出现在每个共享进程页表中。但此页面并不一定位于所有共享进程虚拟内存的相同位置 . 对共享内存区域的访问是通过键和访问权限检验来控制的,2010-12-16,46,2010-12-16,47,每个新创建的共享内存区域由一个shmid_ds数据结构来表示。它们被保存再shm_segs数组中 . shmid_ds数据结构描叙共享内存的大小,进程如何使用以及共享内存映射到其各自地址空间的方式 . 每个使用此共享内存的进程必须通过系统调用将其连接到虚拟内存上。这时进程创建新的vm_area_struct来描叙此共享内存 . 新的vm_area_struct结构将被放到由shmid_ds指向的vm_area_struct链表中。通过vm_next_shared和vm_prev_shared 指针将它们连接起来。虚拟内存在连接时并没有创建;进程访问它时才创建。,2010-12-16,48,共享内存操作,int shmget(key_t key,int size,int shmflg) void * shmat(int shmid,char *shmaddr,int shmflg) void *shmdt(char *shmaddr) int shmctl(int shmid,int cmd,struct_shmid_ds *buf),2010-12-16,49,实践环节,使用共享内存函数完成两个进程间的通讯.,2010-12-16,50,套接字Socket,用于解决不同主机间进程通信. 需要理解几个相关概念 端口 全相关,2010-12-16,51,端口,网络通信的最终地址就不仅是主机地址了,还包括可以描述进程的某种标识。为此TCP/IP协议提出了协议端口的概念,用于标识通信的进程。 端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。应用程序即进程通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。,2010-12-16,52,全相关,一个完整的网间进程通信需要一个五元组来标识: (协议,本机地址,本地端口号,远地地址,远地端口号) 一个五元组叫做一个全相关,2010-12-16,53,Socket提供下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行梅州市丰顺县2025秋招笔试价值观测评题专练及答案
- 农发行运城市河津市2025秋招小语种岗笔试题及答案
- 农发行宜宾市叙州区2025秋招结构化面试经典题及参考答案
- 农发行呼和浩特市托克托县2025秋招笔试价值观测评题专练及答案
- 农发行昆明市西山区2025秋招群面模拟题及高分话术
- 国家能源巴马瑶族自治县2025秋招心理测评常考题型与答题技巧
- 国家能源吉安市井冈山市2025秋招笔试资料分析题专练及答案
- 广州南沙区中储粮2025秋招面试半结构化模拟题30问及答案
- 军训第一天心得体会(合集15篇)
- 2025年宁夏医科大学总医院自主公开招聘高层次工作人员模拟试卷及参考答案详解一套
- 白鹿原名著导读读书分享
- 定密理论与实务3定密的依据课件
- 同济大学信纸
- 交通运输工程施工安全监管台帐(参考)用表样表分享
- 建筑消能减震设计技术及工程实例讲解
- 电梯控制技术PPT完整全套教学课件
- 国开电大《工程数学(本)》形成性考核作业5答案
- LS/T 1201-2020磷化氢熏蒸技术规程
- HY/T 053-2001微孔滤膜
- GB/T 4798.5-2007电工电子产品应用环境条件第5部分:地面车辆使用
- GB/T 4513-2000不定形耐火材料分类
评论
0/150
提交评论