您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 医用软件技术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:=nA2:R1:=(R1)+1B2:R2:=(R2)+1A3:n:=(R1)B3:n:=(R1)示例假如n=0,若按顺序执行A1,A2,A3,B1,B2,B3n=2若并发执行,则同样的初值,会由于执行序列的不同,会出现不同的结果A1,A2,A3,B1,B2,B3n=2B1,B2,B3,A1,A2,A3n=2A1,A2,B1,A3,B2,B3n=1进程间的同步与互斥为保证进程并发执行的可再现性,要求并发进程间有相互制约关系进程间相互制约关系有两类同步:多个进程在执行速度上的制约互斥:进程间竞争同一个排他性资源,而受到其他进程的制约C1I1Buffer临界资源与临界区临界资源每次仅允许一个进程访问的资源硬件如打印机、磁带机等软件有消息缓冲队列、变量、数组、缓冲区等临界区(CriticalSection)每个进程中访问临界资源的那段程序进程进入临界区的原则①如果临界区空闲,一次仅允许一个进程进入。②如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。信号量机制早期同步方法:软件方法:Dekker算法十分繁琐硬件方法:“test-and-set”指令、“交换”指令1965年,荷兰人Dijkstra首先提出信号量(Semaphore)机制信号量SP、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来从一个线程终止另一个线程,但这会强行终
本文标题:医用软件技术part1
链接地址:https://www.777doc.com/doc-2586055 .html