C++多线程编程(4)
多任务与多线程编程
1.一个进程分成多个任务,而每个任务由一个线程执行,称为多线程。多任务目的:增加系统完成的工作量,并通过保持资源(处理器、I/O等等)的繁忙而试图防止他们在系统中处于非激活状态来使用资源。
程序员创建进程,并决定每个进程的线程数,同时决定任务的优先权,以及什么时候挂起、什么时候终止。
2.多任务编程:当操作系统使用一个规划策略允许两个或更多进程并发共享一个CPU。某时刻只能激活一个进程。规划策略决定何时切换进程,规划策略可能由操作系统或其他进程强制执行。
3.多任务可以在3个级别上发生:对话级(多任务处理)、进程级(多任务处理)、线程级(多线程处理)。
(1)对话级多任务编程:用户控制多任务(高级别)
(2)进程级多任务编程:多进程可以并发激活,相互合作完成某个目标。进程可以按序列一个个地执行,也可以并发共享CPU。通过多任务,一个进程运行一段时间,另一个进程再运行一段时间。处理器改变每个进程执行,直到所有的进程运行完成。当在一个对话中有多个进程被激活时,这称为进程级多任务编程。
(3)线程级多任务编程:进程的线程并发执行称作多线程编程。例如进程间多任务:搜索进程->显示进程->解析进程:当其中的某个进程被阻塞、挂起或终止时,下面的进程将被激活,于是发生了进程间的上下文切换。同理,多线程是在进程的线程间发生上下文切换,然后抢占线程或者其他事件发生如得到处理器线程终止、挂起或阻塞。这种活动在进程的所有线程运行完成前一直继续。
4.合作和抢占式多任务:通过抢占多任务,操作系统保持对处理器的控制。一旦任务提交给处理器后,它只执行短暂的时间段,然后分配另一个任务给处理器。通过合作,任务分配给处理器后,它就不能被抢占,为了让另一个任务执行,运行任务必须自愿从处理器中删除自身。
(1)合作多任务:由执行的任务来控制处理器,操作系统放弃对处理器的控制。使用优先权规划。如果阻塞或挂起一个高优先权的任务,则低优先权任务被分配给处理器,它可以独占处理器,不允许高优先权任务有执行时间。一旦低优先权任务分配给处理器后,他们可以不在被抢占的情况下运行到完成。
通过合作实现多任务的方式:a.设置使用处理器的时间长度;b.在代码中设置逻辑断点,在此处放弃处理器;c.当发出I/O请求时放弃处理器;d.当系统操作需要立即执行时放弃处理器;e.放弃处理器允许交互任务使用处理器;f.放弃处理器允许系统对中断做出反应。
【优点】实时、关键和通信任务可以运行到完成不会被抢占;程序员控制了系统的操作;强迫程序员按防错方式设计任务,有目的地允许合作;任务执行和反应有可预测性;引入的高优先权任务不能取代已运行的任务;比抢占式规划开销低。
【缺点】允许任务独占处理器;多任务只在任务得到处理器时才发生;可能得不到可接受的反应时间;
程序员控制了系统的操作;在设计任务时,必须考虑系统操作,而不是排他性设计任务的功能;没有设计为合作的任务可以阻止正常合作任务的执行;长时间运行任务将使短时间运行任务等待;设计不良的任务可能导致整个系统停顿。
(2)抢占式多任务:操作系统不会等到任务自愿将处理器交还给系统,让它分配另一个任务给处理器。每个任务运行短暂的一段时间(时间片段),当时间片过期时,操作系统抢占执行并分配另一个任务给处理器,此时就发生上下文切换。任务在时间段过期前,可以自愿放弃处理器,但如果仍然执行,则该任务会被删除。抢占阻止任何任务独占处理器。当抢占一个任务时,系统保存该任务的上下文,以便该任务再次提交给处理器时能够继续执行。
【优点】不允许任何任务独占处理器;设计不良的任务不会阻止其他任务执行,而且不会导致整个系统停顿,因为他们将被抢占;操作系统保持对任务控制;设计任务时不必考虑系统操作,可以排他性地设计任务的功能性;分配每个任务一段处理器时间来推进任务的执行;由于上下文切换,所以又可接受的反应时间;新引入的高优先权可以抢占运行任务;多任务由操作系统执行,而非程序员执行。
【缺点】时间敏感任务和通信可能被抢占;比合作式多任务开销大,因为频繁上下文切换,所以必须在主存储器中保持多个任务。
5.时间片长度:时间片应当让每个任务有充足的时间发出它的I/O请求,发出I/O请求后,该任务放弃处理器并阻塞,并允许下一个任务使用处理器。将抢占开销降到最低,并且让I/O资源使用效率最高。
6.时间片修改:在文件config.sys中,时间片有一个最大值和最小值,以毫秒ms为单位,如这样定义时间后就成为一个静态值(默认为动态时间片)。
7.多处理器下的多线程: 多个任务可以再同一时刻执行,因为至少执行着2个线程。
同步任务为并发,而且在同一时刻执行。异步执行也是并发,但能够在这些任务的不同执行时刻同时执行。
非对称和对称系统都处于一种紧密耦合环境(处理器有一个用于通信的共享内存区域)中。在紧密耦合环境中,处理器访问相同的就绪队列;在松散环境中,独立系统保持有自己的单独就绪队列。单个进程的线程可以利用紧密耦合的多处理器。
8.非对称多处理器处理系统中,一个处理器执行一个设计好的程序。由于允许处理器处于空闲,所以减少了处理器的吞吐量。
对称多处理器处理时一种更稳固更可靠的环境,它具备一个相互等同的处理器池,任何处理器都可以执行系统或用户线程。如果一个处理器崩溃,它就不再属于可用处理器之列。
9.多线程处理模型3种:主-次线程模型、管道线线程模型、工作堆线程模型
(1)主-次线程模型:主线程创建和启动次线程。主线程预知工作量在次线程间平均分配工作。主线程与它的次线程同步执行,直到主-次线程间达到需要同步的点,在这个店主线程访问工作判断次线程是否需要继续执行。
(2)管道线线程模型:工作分几个执行阶段。这些阶段创建一个管道线或装配线,在每个阶段执行指定的不同或相同的任务。这些阶段并行执行。在管道线中为每个阶段分配一个线程。
(3)工作堆线程模型:分配分成以队列形式存在于工作堆中的多个块。工作线程从堆中请求任务来执行。区别于主-次线程模型,工作堆模型中,预告不知道工作量,工作线程可能导致执行额外的任务。
10.规划策略应当偏向于占有重要资源的任务。低优先权任务可能锁定资源,而这些资源将被其他具有较高优先权任务所使用,或被系统中的许多激活任务所使用,这可能会导致死锁。在实时系统中,快速反应是重要的,资源必须在需要时可用。
11.规划策略目标:
a.最大化吞吐量
b.强制优先权
c.根据实际尽量公平
d.最小化开销
e.避免无限延迟或饥饿
f.偏向于占据了其他任务所需要资源的任务
g.在需要时,有充足的可用资源,让反应时间可接受
h.不应当在重系统负载下崩溃
12.规划策略准则:CPU绑定任务在整个时间片内使用处理器。I/O绑定任务通常使用CPU的时间足以发出I/O请求。在动态优先权方案中,I/O绑定任务的优先权可以被提升到分配给处理器的级别。在非对称多处理器处理系统中,I/O绑定和CPU绑定任务在单独设计的处理器上执行。一些规划策略将偏向于还没有分配足够执行时间的任务(即短小的任务),这样其他任务将不必长时间等待分配给处理器,提高了任务处理的效率。
13.规划策略类型:FIFO(先进先出)、SJF(最短任务优先)、RR(轮询)、STR(最短剩余时间)、HRN(最高反应率其次),如下表所示。