ch3-pptch3-3 8Linux同步机制_第1页
ch3-pptch3-3 8Linux同步机制_第2页
ch3-pptch3-3 8Linux同步机制_第3页
ch3-pptch3-3 8Linux同步机制_第4页
ch3-pptch3-3 8Linux同步机制_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

3.8Linux同步和通信机制,3.8.1Linux内核同步机制3.8.2SystemIPC机制,3.8.1Linux内核同步机制,Linux操作系统内核执行过程中,会造成并发执行,应提供多种内核同步机制:1)中断及异步信号-随时可能打断正在执行的内核代码;2)可抢占-如果内核具有抢占性,运行的内核任务会被另一个任务抢占;3)SMP中-两个或多个CPU同时执行内核代码,访问同一共享数据结构。,1原子操作,1)原子整数操作如:ATOMIC_INT(inti)(初始化原子变量为i)、atomic_read(v)(读整数值v)、atomic_set(v,i)(把v置成i)、atomic_add(i,v)(把v增加i)、atomic_sub(i,v)(把v减去i)2)原子位图操作如:set_bit(intnr,void*addr)(设置位图地址addr的nr位)、clear_bit(intnr,void*addr)(清除位图地址addr的nr位)、change_bit(intnr,void*addr)(反转位图地址addr的nr位)和test_bit(intnr,void*addr)(返回位图地址addr的nr位的值),2内核信号量,在Linux中,也使用等待队列来实现内核使用的信号量机制,内核信号量semaphore定义为:structsemaphoreatomic_tcount;intsleepers;wait_queue_head_twait;,3等待队列,Linux内核信号量采用非忙式等待实现,当进程执行DOWN而等待时,将放入等待信号量队列,等待队列是支持进程同步的重要数据结构,其定义为:structwait_queueunsignedintcompiler_warning;structtask_struct*task;/*指向等待进程的PCB*/structlist_headtask_list;/*等待队列链表*/;,4关中断,关中断是把内核态执行的程序段作为一个临界区来保护,如保护中断处理程序也要访问的数据结构,此外,关中断还能禁止内核抢占。为了防止死锁,关中断期间内核不能执行阻塞操作。在SMP环境中,关中断只能防止来自本机其他中断处理程序的并发访问,需要引入自旋锁在禁止本地中断的同时,防止来自它机的并发访问。,5自旋锁,自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个已经被锁住的自旋锁,那么该线程就会一直进行忙式等待(旋转),等待锁重新可用,期间这个CPU不能再处理其他工作,同时等待其他CPU上运行的进程执行解锁操作,要是锁未被争用,请求锁的执行线程便能立刻锁住它,继续执行。,自旋锁定义,typedefstructvolatileunsignedintlock;spinlock_t;voidspin_lock(spinlock_t*plock)intflag;doflag=plock-lock/*开锁,将lock的第0个bit置为0*/,3.8.2SystemIPC机制,Linux提供给用户的IPC资源是通过系统调用来实现,它们为应用进程提供三种服务:1)用信号量对进程要访问的临界资源进行保护;2)用消息队列在进程间以异步方式发送消息和接收消息;3)预留共享内存段供进程之间交换和共享数据。,SystemVIPC机制特点,1)进程间需要通过IPC对象通信时,必须在函数中传递该对象的唯一IPC标识符;2)对IPC对象的访问,必须经过权限验证,对象访问权限的设置,由对象的创建者利用函数来实现;3)IPC通信机制都把IPC对象的IPC标识符作为对系统资源表的索引。,创建、操作和控制IPC对象的函数,通过库函数创建所需类型的IPC对象:semget():获得信号量的IPC标识符。msgget():获得消息队列的IPC标识符。shmget():获得共享内存的IPC标识符。通过专用函数对其进行功能性操作:semop():对信号量进行操作,获得或释放IPC信号量。msgsnd()及msgrcv():发送和接收一个IPC消息。shmat()及shmdt():将IPC共享内存段附加到进程虚存空间和把共享内存段从进程虚存空间剥离出去。提供用于获得和设置资源状态信息:semctl()、msgctl()及shmctl():对信号量、消息队列和共享内存资源进行控制。,IPC信号量实现概要(1),System支持信号量集合,系统最多提供个。信号量集合中每个信号量定义为:structsemintsemvel;/*信号量当前值*/intsempid;/*操作信号量的当前进程*/进程使用函数semget()申请创建一个信号量集合;函数semctl()对信号量初始值进行设置;函数semop()对信号量集的一个或多个信号量进行操作。,IPC信号量实现概要(2),具体操作由用户提供的操作模版sembuf结构定义:structsembufunsignedshortsem_num;/*信号量集合下标,指明对哪个信号量操作*/shortsem_op;/*具体执行操作P或V*/shortsem_flg;/*操作标志*/;sem_op指定具体操作,其值有如下含义:(1)若大于0,则将该值加到信号量的当前值上。(2)若等于0,则用户希望信号量的当前值变为0。如果值已经是0,则立即返回。如果不是0,则取决于IPC_NOWAIT是否被设置。(3)若小于0,则要看信号量的当前值是否大于等于sem_op的绝对值。如果大于等于,就从信号量的当前值中减去sem_op的绝对值。如果小于,则取决于IPCNOWAIT是否被设置。,IPC消息队列实现概要(1),进程用函数msgget()创建消息队列,函数msgsnd()将消息插入消息队列末尾,函数msgrcv()将消息移出消息队列,函数msgctl()来释放或改变消息队列许可权。消息头部定义如下。structmsg_msgstructlist_headm_list;/*消息队列链表*/longm_type;/*消息类型*/intm_ts;/*消息长度*/structmsg_msgseg*next;/*消息分多页,链接下一个消息页*/;structmsg_msgsegstructmsg_msgseg*next;,IPC消息队列实现概要(2),进程使用函数msgsnd()发送消息,消息长度不超过规定限制;接着分配消息头结构,用m_list链入该消息头结构链的尾部;分配数据并页面把头结构和消息存到页面中,修改数据结构;然后,内核便唤醒等待该消息队列消息的所有进程。进程使用函数msgrcv()接收消息,内核检查接收进程读许可权,根据消息类型(=0,0)找出消息(=0时,取队列中的第一个消息。0时,取队列中给定类型的第一个消息。0时,取队列中小于或等于所请求类型的绝对值的所有消息中最低类型的第一个消息。),从内核消息数据区复制内容到用户空间,删去该消息,修改数据结构。如果有发送进程因消息满而等待,内核便唤醒等待该消息队列的所有进程。,IPC共享内存实现概要(1),IPC共享内存数据结构structshmid_kernelstructkern_ipc_permshm_perm;structfile*shm_file;/*创建shm文件对象描述共享段*/intid;unsignedlongshm_nattch;/*已建立共享映射数*/unsignedlongshm_segsz;/*共享内存段大小*/,IPC共享内存实现概要(2),IPC共享内存请求调页过程当进程访问共享内存区单元时,会发生缺页异常。由内核请求调页函数handle_pte_fault()确定引起缺页的地址是在进程地址空间内部,而且所对应的页表项为NULL,所以,它会调用函数d

温馨提示

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

评论

0/150

提交评论