首页 > 系统相关 >Unix/Linux系统编程自学笔记-第四章:并发编程

Unix/Linux系统编程自学笔记-第四章:并发编程

时间:2023-10-29 17:11:06浏览次数:47  
标签:Linux 编程 并行计算 互斥 Unix 线程 pthread 进程 执行

1、并行计算

  1. 并行计算

    并行计算是一种计算方法,通过使用多个执行并行算法的处理器相较串行计算更快地解决问题。现代多核处理器的结构能很好的实现并行计算。计算机的发展未来也是并行计算。

  2. 顺序算法与并行计算

    • 顺序算法

      一般代码块格式如下,顺序算法的每个代码块可能包含多个步骤。各个步骤都是通过单个任务依次执行,每次执行一个步骤。所有步骤都执行完后任务结束。

    • 并行算法

      一般代码块的结构如下,并行计算的代码块中的所有任务并行执行,所有任务都结束后执行下一步骤。

  3. 并行性与并发性

    • 并行性

      一个并行算法中的所有任务同时都在运行,一般在理想情况下的多处理系统中可实现并行运算。

    • 并发性

      在单CPU系统中,一次只可执行单个任务,只能通过并发执行实现逻辑上的并行执行。

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

2、线程

  1. 线程介绍

     线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个线程。当某进程开始时,就会执行该进程的主线程。如果只有一个主线程,那么进程和线程实 际上并没有区别。但是, 主线程可能会创建其他线程。 每个线程又可以创建更多的线程等。 某进程的所有线程都在该进程的相同地址空间中执行,  但每个线程都是一个独立的执行单元。 
    
    • 线程优点 线程创建和切换速度更快:若要在某个进程中创建线程,操作系统不必为新的线程分配内存和创建页表,因为线程与进程共用同一个地址空间。所以,创建线程比创建进程更快。
    • 线程的响应速度更快:一个进程只有一个执行路径。当某个进程被挂起时,帮个进程都将停止执行。相反,当某个线程被挂起时,同一进程中的其他线程可以继续执行。
    • 线程更适合井行计算:并行计算的目标是使用多个执行路径更快地解决间题。基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的并行性,可通过使用并行或并发执行来提高计算速度。
  2. 线程的缺点

    • 需要来自用户的明确同步
    • 库函数对于线程来说不够安全
    • 单CPU系统中上下文切换耗时过大

3、线程管理

​ 线程与进程类似,也有内核模式和用户模式。用户模式下线程在其进程的相同地址中执行,每个线程都拥有各自的执行 堆栈。内核模式下则根据系统内核的调度策略执行系统调用,也有挂起、激活等过程。系统内核调用会优先选择同一进 程中的线程。

线程管理函数

大部分操作系统都兼容POSIX Pthread线程标准,Pthread提供了如下用于线程管理的程序编程接口:

pthread_create(thread, attr, function, arg);	-> 创建线程
pthread_exit(status);			           -> 终止线程
pthread_cancel(thread);                     -> 取消线程
pthread_attr_init(attr);                    -> 初始化线程属性
pthread_attr_destroy(attr);                 -> 删除线程属性
  • 创建线程

    可以使用pthread_create()函数创建线程:

    int pthread_create(pthread_t *pthread_id, pthread_attr_t *atr, void *(*func)(void *), void *arg);
    

    如果创建成功则返回0,失败则返回错误代码。

    参数:

    • pthread_id是指向pthread_t类型变量的指针。它会被操作系统内核分配的唯一线程ID填充。在POSIX中,pthread_t是一种不透明的类型.线程可以通过pthread_self()函数获得自己的ID。在Linux中,pthread_t类型被定义为无符号长整型,因此ID可以打印为%lu。

    • attr是指向另一种不透明数据类型的指针,它指向线程属性。

    • func要执行的新线程的新线程函数的入口地址。

    • arg指向线程函数参数的指针

      void *func(void *arg);
      

4、线程同步

  1. 线程在进程的同一地址空间中执行,共享同一地址空间中的所有全局变量和数据结构。不同的线程对同一个共享资源进行操作时,如果结果取决于线程的执行顺序,就会产生竞争,这是并发程序所杜绝的。

  2. 互斥量

    为了解决线程间的竞争,可以使用互斥量。它是一个锁,当拥有锁的时候才可以进行操作。

    互斥量可以通过静态和动态两种方式初始化。

  3. 死锁预防

    互斥量采用了封锁协议,如果线程无法获取互斥量,那么就会被阻塞,等待互斥量解锁后才能继续操作。当多个实体互相等待时,死锁就会出现。应对方法有死锁预防、死锁规避、死锁检测和恢复等。

    预防死锁可以通过条件加锁函数pthread_mutex_trylock()实现。

    互斥变量是用 ptbread_mutex_t 类型声明的在使,用之前必须对它们进行初始化。有两种方法可以初始化互斥址。 静态方法,pthreaa—mutex_t m = PTHREAD_MUTEX_INITIALIZER; 定义互斥量 m, 并使用默认属性对其进行初始化。 动态方法,使用 pthread_ mutex _init() 函数

  4. 条件变量

    作为锁,互斥量仅用于确保线程只能互斥地访间临界区中的共享数据对象。在Pthread中,使用类型pthread_cond_t来声明条件变拉,而且必须 在使用前进行初始化。与互斥变量一样,条件变量也可以通过两种方法进行初始化。 静态方法:pthread_cond_t con= PTHREAD_COND_INITIALIZER;定义一个条件变屾con,并使用默认属性对其进行初始化。 动态方法:使用pthread_cond_init()函数,可通过attr参数设置条件变量。为简便起见,我们总是使用NULLattr参数作为默认属性。

chatgpt

标签:Linux,编程,并行计算,互斥,Unix,线程,pthread,进程,执行
From: https://www.cnblogs.com/Semelia/p/17796063.html

相关文章

  • Linux shell编程学习笔记16:bash中的关联数组
    上一节我们探讨了普通的数组,即使用数字下标来索引数组中不同的元素的数组,也可以称之为索引数组。相比纯粹的数字,字符串不仅能表明含义,也更便于记忆使用,于是就有了关联数组。一、关联数组概述bash从4.0开始支持关联数组,关联数组可以使用可以使用任意的字符串、或者整数作为下标来......
  • Linux - 用户及文件权限管理
    本篇内容介绍Linux中创建用户,及用户组等操作Linux中的文件权限设置本篇内容知识点总结Linux用户管理Linux权限管理......
  • Linux文件及目录权限
    例如ls-l中显示的内容如下:-rwxrw-r--lrootroot1213Feb209:39abc10个字符确定不同用户能对文件干什么第一个字符代表文件类型-lbcd其余字符每三个一组(rwx)读(r)写(w)执行(x)第一组rwx:文件拥有者的权限是读,写和执行第二组rw-:与文件拥有者同一组的用户的权限是读,......
  • linux第三周
    id命令查看当前用户登录信息,ll查看文件所有者,敲的时候没碰到什么问题,用vim/etc/passwd和/etc/shadow查看目录时:分隔开的字符每一位都有自己的含义.通过useradd命令创建用户,grep命令筛选用户信息,useradd的同时用-G参数指定附加组,用gpasswd命令对一些信息修改,gpasswd......
  • Linux操作系统学习3
    上周学的是Linux操作系统中的文件权限中的基本权限,也就是UGO。这一周学的是基本权限后面的一些知识。主要是文件权限中的高级权限。有以下几个内容:SUID权限,SGID权限,Sticky权限。/usr/bin/passwd/,在这个文件中,第一行的第四个字符为“s”,这个s代的就是特殊权限,也就是SUID权限。任何......
  • Linux小技巧之awk必知必会
    LinuxShell三剑客之一,废话不多说直接上干货。目录1.指定分隔符2.指定打印行数3.打印最后一列4.打印倒数第二列5.匹配输出6.if判断7.统计列总数值8.时间格式转换示例数据:1.指定分隔符awk-F'|''{print$1}'log.txt#awk-F'|''{print$1}'log.txttbname============......
  • VMware虚拟机安装Linux教程(2023最新版)
    一、准备工作1.VMware软件(注意:如过不会安装此软件教程地址VM安装教程),常见的虚拟机软件有VMwareWorkstation(简称VMware)、VirtualBox、MicrosoftVirtualPC等,其中VMware市场占有率最高,所以本节以VMware为例来讲解Linux的安装。2.镜像:CentOS-6.4-i386-bin-DVD1(注意:如果没......
  • 制作自己的min linux(CentOS7.6)
    1.在现有的linux添加一块大小为20G的硬盘2.启动现有的linux。通过fdisk来给我的/dev/sdb进行分区 3.接下来,对/dev/sdb的分区进行格式化[root@localhost~]#mkfs.ext4/dev/sdb1[root@localhost~]#mkfs.ext4/dev/sdb2 4.创建目录,并挂载新的磁......
  • AMD Ryzen AI 暂仅支持 Windows,Linux 系统有望后续支持
    近日消息,最新的AMDRyzen7040系列笔记本电脑配备了基于XilinxIP的专用AI引擎,名为“RyzenAI”,可以加速PyTorch和TensorFlow等机器学习框架的运行。不过目前这个RyzenAI只支持微软Windows系统。但是如果有足够的客户需求,这种情况可能会改变。早在6月份,AM......
  • Youtrack Linux 安装
    我们考虑最后应该使用的是ZIP方式的安装。按照官方的说法如何设置运行YouTrack应该是非常简单的。准备环境根据官方的说法,我们需要做的就是下载Zip包,然后把Zip包解压到指定的目录中就可以了。下载当前官方的下载地址为:GetYouTrack:IssueTrackingandProjectManagement......