任务并行
任务并行(英语:Task parallelism),也称为功能并行(function parallelism)或控制并行(control parallelism),是并行计算程式设计模型的一种。在这个模型中,每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点中去。
多处理器调度
一般任务在处理器上通过调度用户线程(User Thread,相对于内核线程Kernel Thread)实现的。操作系统也可提供一个用户模式下的调度器。调度器的任务就是尽可能合理的将任务分配和均衡到各个处理器上。
相关概念
同步是任务并行里涉及到最重要的任务之间通信的方法,分为进程同步(或者线程同步)和数据同步。数据同步和进程同步的目的是为了使程序在多处理器执行的条件下保持一定的内存模型。
- 进程同步主要研究如何确定数个进程之间的执行顺序和避免数据竞争(Data race condition)的问题。避免数据竞争的常用方法是在程序中设立临界区,即一次只允许一个线程执行的一段代码,通常用于保护重要的公共变量。然而也有理论研究一次允许数个线程执行临界区代码的一般情况,称为l-exclusion问题。
- 数据同步则是研究如何保证在一个变量的多个副本之间保持一致性的问题。数据同步通常涉及到的话题有Cache一致性(Cache Coherence),数据复制(Data replication)等等。
同步对象是用于实现同步的数据结构对象。可分为内核同步对象与用户同步对象。用户同步对象更有效率;内核同步对象使得线程在用户态与内核态切换,花销巨大。用户态的同步对象有临界区与原子操作等;内核态的同步对象有内存屏障(Memory barrier)、互斥锁(Mutex)、信号量(Semaphore)和锁(Lock)、管程(Monitor)、消息(Message)、自动重置事件、人工重置事件、自动重置定时器、人工重置定时器、进城、线程、作业、文件、 控制台输入、文件修改通知、管道(Pipe)等。
内核同步对象通常有signaled与nonsignaled两种状态,可分别译作置位的(标志的、通知的)与未置位的(未标志的、未通知的)。当操作系统设置一个同步对象为signaled,任何等待该对象的线程被从该对象上释放,从等待状态变为可执行状态。同步对象通过等待句柄(waitable handle)访问。等待句柄处于signaled状态,则该等待句柄不被任何线程拥有。[1]
Windows操作系统的API:WaitForSingleObject、WaitForMulitpleObjects、SignalObjectAndWait(通知一个内核对象并等待另一个内核对象的原子操作)、MsgWaitForMultipleObjects(等待多个内核对象阻塞时仍可以响应Windows消息的到来)、MsgWaitForMultipleObjectsEx用来等待同步对象从nonsignaled变为signaled状态。
参见
参考文献
- ^ MSDN:Advanced Synchronization Techniques. [2017-02-16]. (原始内容存档于2017-02-16).