学习笔记7

发布时间 2023-10-29 19:57:06作者: 20211225高端

信息安全系统设计与实现学习笔记7

一、知识点归纳以及自己最有收获的内容

1. 知识点归纳

第4章 并发编程

  1. 并行

    • 顺序算法——begin-end
      • 包含多个步骤,通过单个任务依次执行,每次执行一个步骤
    • 并行算法——cobegin-end
      • 所有任务都是并行执行的,所有任务完成后执行下一个步骤
  2. 并行性与并发性

    • 通常,并行算法只识别可并行执行的任务,但是它没有规定如何将任务映射到处理组件。在理想情况下,并行算法中的所有任务都应该同时实时执行。然而,真正的并行执行只能在有多个处理组件的系统中实现,比如多处理器或多核系统。在单 CPU 系统中,一次只能执行一个任务。在这种情况下,不同的任务只能并发执行、即在逻辑上并行执行。在单CPU系统中,并发性是通过多任务处理来实现的。
  3. 线程

    • 原理
      • 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
      • 线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。一个进程可以有很多线程,每条线程并行执行不同的任务。
      • 使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。
    • 优点
      • 线程创建和切换速度更快,线程的响应速度更快,线程更适合并行计算。
    • 缺点
      • 线程需要来自用户的明确同步,许多库函数可能对线程不安全,在单CPU系统上使用线程解决问题实际上要比使用顺序程序慢。
  4. 线程管理函数

    • 创建线程

      • 使用pthread_create()函数创建线程
        int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
        
      • attr参数的使用步骤:
        1. 定义一个pthread属性变量 pthread_attr_t attr
        2. pthread_attr_init(&attr)初始化属性变量。
        3. 设置属性变量并在 pthread_create() 调用中使用。
        4. 必要时,通过 pthread_attr_destroy(&attr) 释放 attr 资源。
    • 线程ID

      • 使用pthread_equal()函数对线程ID进行比较
        int pthread_equal(pthread_t t1, pthread_t t2);
        
      • 返回值:不同线程返回0,否则返回非0。
    • 线程终止

      • 线程可以调用函数进行终止
        void pthread_exit(void *status);
        
      • 返回值:0退出值表示正常终止,非0值表示异常终止。
    • 线程连接

      • 一个线程可以等待另一个线程的终止,通过函数终止线程的退出状态。
        int pthread_join(pthread_t thread, void **status_ptr);
        
      • 返回值:以 status_ptr 返回。
    • 线程同步

      • 互斥量

        • 最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能继续执行。在Pthread中,锁被称为互斥量。
        • 两种方法可以初始化互斥址:
          • 静态方法:pthreaa-mutex_t m = PTHREAD_MUTEX_INITIALIZER;
            • 定义互斥量 m,并使用默认属性对其进行初始化。
          • 动态方法:使用 pthread_mutex_init() 函数,可通过 attr 参数设置互斥属性。
      • 死锁预防

        • 互斥量使用封锁协议。如果某线程不能获取互斥量,就会被阻塞,等待互斥量解锁后再继续。在任何封锁协议中,误用加锁可能会产生一些问题。最常见和突出的问题是死锁。
        • 有多种方法可以解决可能的死锁问题,其中包括死锁预防、死锁规避、死锁检测和恢复等。
        • 在实际系统中,唯一可行的方法是死锁预防,试图在设计并行算法时防止死锁的发生。一种简单的死锁预防方法是对互斥量进行排序,并确保每个线程只在一个方向请求互斥量,这样请求序列中就不会有循环。
      • 条件变量

        • 作为锁,互斥量仅用于确保线程只能互斥地访问临界区中的共享数据对象。条件变量提供了一种线程协作的方法。在Pthread中,使用类型 pthread_cond_t 来声明条件变量,而且必须在使用前进行初始化。
        • 条件变量可以通过两种方法进行初始化:
          • 静态方法——pthread_cond_t con = PTHREAD_COND_INITIALIZER;
          • 动态方法——使用 pthread_cond_init() 函数,通过 attr 参数设置条件变量。