医用软件技术part1

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

医用软件技术医疗器械与食品学院郑建立zhengjianli163@163.com2012年4月内容多线程程序设计Socket程序设计状态机程序设计WebService程序设计DICOM程序设计多线程程序设计进程基础进程是可与其他程序并发执行的程序在一个数据集上的执行过程进程的特征动态性:最基本特征进程是程序的执行过程有生命周期并发性:最重要的特征多个进程实体在系统中同时存在在一定的时间间内同时执行独立性独立运行、独立获得资源、独立调度的基本单位异步性进程按各自不可预知的速度推进结构特征程序段、数据段、进程控制块进程与程序进程程序概念动态实体,强调执行静态实体,是指令的有序集合特征并发性、独立性、异步性,是获取系统资源的基本单位无并行特征,是静止的联系不同的进程可以共享同一个程序,只要对应的数据集不同即是一个进程进程的表示进程实体程序段:描述进程所要完成的功能cs数据集:进程所需的数据和工作栈dsesss进程控制块:进程的描述信息和控制信息PCB数据程序共享数据段进程的基本调度状态进程随着自身的推进和外界环境的变化而进行状态变迁,处在以下三种状态之一执行状态(executing):获得必要的资源,占有处理机就绪状态(ready):获得除处理机外的所有资源阻塞状态(blocked):等待资源或某一事件暂时状态创建状态(created)终止状态(terminated)进程状态间的转换执行就绪阻塞创建终止I/O完成或事件发生进程完成进程执行的特点间断性异步方式执行,走走停停失去封闭型资源共享,相互影响不可再现性初始条件和运行环境相同,结果却可能不同示例A:B:repeatrepeatn:=n+1;n:=n+1;……untilfalseuntilfalse每个n:=n+1可分解为:A1:R1:=nB1:R2:=nA2:R1:=(R1)+1B2:R2:=(R2)+1A3:n:=(R1)B3:n:=(R1)示例假如n=0,若按顺序执行A1,A2,A3,B1,B2,B3n=2若并发执行,则同样的初值,会由于执行序列的不同,会出现不同的结果A1,A2,A3,B1,B2,B3n=2B1,B2,B3,A1,A2,A3n=2A1,A2,B1,A3,B2,B3n=1进程间的同步与互斥为保证进程并发执行的可再现性,要求并发进程间有相互制约关系进程间相互制约关系有两类同步:多个进程在执行速度上的制约互斥:进程间竞争同一个排他性资源,而受到其他进程的制约C1I1Buffer临界资源与临界区临界资源每次仅允许一个进程访问的资源硬件如打印机、磁带机等软件有消息缓冲队列、变量、数组、缓冲区等临界区(CriticalSection)每个进程中访问临界资源的那段程序进程进入临界区的原则①如果临界区空闲,一次仅允许一个进程进入。②如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。信号量机制早期同步方法:软件方法:Dekker算法十分繁琐硬件方法:“test-and-set”指令、“交换”指令1965年,荷兰人Dijkstra首先提出信号量(Semaphore)机制信号量SP、V操作记录型信号量S结构:structsemaphore{intvalue;structpcb*L;}任何一个信号量必与某一资源相联系Value:记录对应资源的分配情况初值:对应资源的数量当前值:0:无资源可分配正值:该资源可供分配的数量负值:因等待该资源而被阻塞的进程数L:链表指针,链接因等待该资源而被阻塞的进程P、V操作对信号量S,除初始化外,仅能通过两个标准的原子操作P(S)和V(S)来访问P(S)操作:申请一份与S有关的资源V(S)操作:释放一份与S有关的资源P(S){V(S){S.value--;S.value++;if(S.value0)if(S.value=0)block(S.L);wakeup(S.L);}}注意:P、V操作必须成对使用P、V操作的原子性操作系统内核提供的原语用信号量实现互斥所有互斥进程共用一个信号量mutex,又称互斥信号量,初值一般为1每一进程的临界区置于P(mutex)和V(mutex)之间structsemaphormutex;main(){mutex.value=1;{{P1();P2();}}}P1(){do{P(mutex);cs1;V(mutex);…}while(true);}P2(){do{P(mutex);cs2;V(mutex);…}while(true);}简单同步问题的实现P1:repeatP2:repeatprocessnextdata;getdatafrombuffer;adddatatobuffer;processlastdata;untilfalseuntilfalse只有当buffer中为满时,P2才能动作,否则必须等待只有当buffer中为空时,P1才能动作,否则必须等待P2P1Buffer[n]structsemaphorempty,full;main(){empty.value=1;full.value=0;{{P1();P2();}}}P1(){do{producenextdata;adddatatobuffer;}while(true);}P(empty);V(full);P2(){do{getdatafrombuffer;processlastdata;}while(true);}P(full);V(empty);structsemaphors;main(){s.value=0;{{P1();P2();}}}P2P1P1(){doallwork;V(s);}P2(){P(s);doallwork;}structsemaphors;main(){s.value=0;{{P1();P2();P3();}}}P1(){doallwork;V(s);}P2(){doallwork;V(s);}P3(){P(s);P(s);doallwork;}P3P1P2经典进程同步问题生产者-消费者问题生产者与消费者互斥访问公用数据缓冲区生产“数据”,消费“数据”读者-写者问题数据文件或记录被多个进程共享并互斥访问的问题允许多个Reader同时访问,但不允许一个Writer和其它Reader或任何两个以上的Writer同时访问哲学家就餐问题多资源共享及互斥访问五个哲学家的思考与互斥共享五根筷子就餐的问题线程基础线程:线程是指程序中的一个执行流程。进程:一个正在运行的程序。多任务操作系统可以同时运行多个进程。单线程的程序只有一个执行的流程。多线程的程序同时有多个执行的流程,可以同时完成多个任务进程与线程的区别“线程”是进程内部的一个执行流程,线程共享所在进程的内存和资源。多线程的程序可以允许多个线程同时执行。“进程”是一个执行中的应用程序,包括它所用的内存和相关资源,每个进程都有自己独立的内存空间和系统资源,多任务的操作系统可以运行多个进程.线程与进程的比较非常“节俭”的多任务操作方式进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。方便的通信机制进程间数据的传递只能通过通信的方式进行,费时,不方便。线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,快捷方便。”同时“的含义对于单CPU的主机操作系统将CPU处理时间分成很多时间片,按照一定的调度机制将CPU时间轮流分配给各个任务。在任何一个时刻,只有一个任务使用CPU,任务在运行。在一段时间内,每一个任务都获得了CPU的时间,由于切换时间很快,用户感觉不到任务的停顿,所以感觉多个任务同时运行。对于多CPU主机可以是真正意义上同时。为什么要多线程提高应用程序响应,改善用户体验。充分发挥多核CPU的功能。改善程序结构Thread对象usingSystem.Threading;构造函数publicThread(ThreadStartstart);publicThread(ParameterizedThreadStartstart);成员函数启动线程:publicvoidStart();暂停线程:publicstaticvoidSleep(intmillisecondsTimeout);挂起线程:publicvoidSuspend();恢复线程:publicvoidResume();中止线程:publicvoidAbort();封锁线程:publicvoidJoin();无参线程例:ThreadStartts=newThreadStart(Calculate);Threadthread=newThread(ts);thread.Start();publicvoidCalculate(){doubleDiameter=0.5;Console.Write(TheAreaOfCirclewithaDiameterof{0}is{1}Diameter,Diameter*Math.PI);}有参线程函数例:ParameterizedThreadStartts=newParameterizedThreadStart(Calculate)Threadthread=newThread(ts);thread.Start(0.9);publicvoidCalculate(objectarg){doubleDiameter=double(arg);Console.Write(TheAreaOfCirclewithaDiameterof{0}is{1}Diameter,Diameter*Math.PI);}线程的中止线程代码执行完毕父线程退出强行中止:Thread.Abort()线程属性Thread.ThreadState属性的取值如下:Aborted:线程已停止;AbortRequested:Abort()方法已被调用,但是线程还未停止;Background:线程在后台执行;Running:线程正在正常运行;Stopped:线程已经被停止;StopRequested:线程正在被要求停止;Suspended:线程已经被挂起,可调用Resume()方法重新运行;SuspendRequested:线程正在要求被挂起,但是未来得及响应;Unstarted:未调用Thread.Start()开始线程的运行;WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;创建线程函数创建一个名为Worker的类,该类包含辅助线程将执行的方法DoWork:publicvoidDoWork(){while(!_shouldStop){Console.WriteLine(workerthread:working...);}Console.WriteLine(workerthread:terminatinggracefully.);}创建线程WorkerworkerObject=newWorker();ThreadworkerThread=newThread(workerObject.DoWork);workerThread.Start();暂停线程Thread.Sleep(1);终止线程线程函数运行结束,如本例中置_shouldStop=TRUE;调用Abort来从一个线程终止另一个线程,但这会强行终

1 / 57
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功