学习笔记 第四章的自学归纳
并行计算导论
-
多进程服务器是指当客户端发出请求时,服务器使用子进程来处理客户端的请求。
-
父进程继续等待来自其他客户端的请求。
顺序算法与并行算法
-
并行计算的优势:探讨并行计算相对于串行计算的优势,包括加速计算速度、提高系统吞吐量、处理大规模数据等。
-
在只有一个CPU的情况下,每次只能按顺序执行某算法的一个指令和步骤。但是,基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的并行性,可通过使用并行或并发执行来提高计算速度。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速地解决问题。
并行性与并发性
-
并行性指的是同时执行多个任务或操作的能力。在并行计算中,多个计算任务可以同时进行,每个任务由不同的处理单元执行,以提高计算效率和性能。并行性的目标是通过同时执行多个任务来加速计算过程。
-
并发性指的是多个任务或操作在相同时间段内交替执行的能力。在并发计算中,多个任务按照一定的调度策略交替执行,每个任务在某个时间片段内获得处理器的执行时间。并发性的目标是通过任务的交替执行来提高系统的资源利用率和响应能力。
-
在单 CPU 系统中,一次只能执行一个任务。在这种情况下,不同的任务只能并发执行、即在逻辑上并行执行。在单CPU系统中,并发性是通过多任务处理来实现的。
线程
线程的原理
- 线程是某进程同一地址空间上的独立执行单元。
线程的优点
-
线程创建和切换速度更快∶进程的上下文复杂而庞大。其复杂性主要来自管理进程映像的需要。在执行过程中,有些页面在内存中,有些则不在内存中。操作系统内核必须使用多个页表和多个级别的硬件辅助来跟踪每个进程的页面。要想创建新的进程,操作系统必须为进程分配内存并构建页表。若要在某个进程中创建线程,操作系统不必为新的线程分配内存和创建页表。因为线程与进程共用同一个地址空间。所以创建线程比创建进程更快。
-
线程的响应速度更快:一个进程只有一个执行路径。当某个进程被挂起时、整个进程都将停止执行。相反,当某个线程被挂起时,同一进程中的其他线程可以继续执行。这使得有多个线程的程序响应速度更快。
-
线程更适合并行计算∶并行计算的目标是使用多个执行路径更快地解决问题。基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的并行性。可通过使用并行或并发执行来提高计算速度。这种算法通常要求执行实体共享公用数据。在进程模型中,各进程不能有效共享数据,因为它们的地址空间都不一样。
线程的缺点
-
由于地址空间共享,线程需要来自用户的明确同步。
-
许多库函数可能对线程不安全。通常,任何使用全局变量或依赖于静态内存内容的函数,线程都不安全。
-
在单CPU系统上,使用线程解决问题实际上要比使用顺序程序慢。
线程管理函数
pthread_create(thread, attr, function, arg): create thread
pthread_exit(status) : terminate thread
pthread_cancel(thread) : cancel thread
pthread_attr_init(attr) : initialize thread attributes
pthread_attr_destroy(attr): destroy thread attribute
创建线程
-
使用pthread_create()函数
-
pthread_id是指向pthread_t类型变量的指针。它会被操作系统内核分配的唯一线程ID填充。在POSIX中,pthread_t是一种不透明的类型。程序员应该不知道不透明对象的内容,因为它可能取决于实现情况。
-
attr是指向另一种不透明数据类型的指针,它指定线程属性,下面将对此进行更详细的说明。
-
func是要执行的新线程函数的入口地址。 arg是指向线程函数参数的指针,可写为:void *func(void *arg)
-
attr参数
线程ID
线程ID是一种不透明的数据类型,取决于实现情况。
线程终止
-
线程函数结束后,线程即终止。或者,线程可以调用函数int pthread_exit (void *status);
-
进行显式终止,其中状态是线程的退出状态。通常,0退出值表示正常终止,非0值表示异常终止。
线程连接
一个线程可以等待另一个线程的终止。
线程同步
互斥量
最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能继续执行。
死锁预防
互斥量使用封锁协议。如果某线程不能获取互斥量,就会被阻塞,等待互斥量解锁后再继续。
在实际系统中,唯一可行的方法是死锁预防,试图在设计并行算法时防止死锁的发生。
条件变量
条件变量可以通过两种方法进行初始化
-
静态方法
-
动态方法
生产者-消费者问题
信号量
-
信号量是进程同步的一般机制
-
信号量和条件变量
屏障
-
线程连接操作允许某线程等待其他线程终止
-
在pthread中可以采用的机制是屏障以及一系列屏障函数
Linux中的线程
- 进程和线程都是由clone()系统调用创建的具有以下原型
int clone(int (fn)(void),void *child_stack,int flags,void *arg)
遇见的问题及相关解决措施
苏格拉底挑战