基于 Ubuntu 18.04 LTS多线程和多进程环境下的数字累加

简介: 基于 Ubuntu 18.04 LTS多线程和多进程环境下的数字累加

在多线程和多进程环境下分别执行数字的累加操作.

2. 实验环境


  • 电脑环境:实验室台式计算机
  • 系统环境: Ubuntu 18.04 LTS
  • 运行: Ubuntu terminal


3. 程序设计


3.1 多线程


3.1.1 流程图


da6851b6d23d589f30c06676d4afc8fa.png


3.1.2 描述

程序读取input.txt文件中的内容,赋值给N(线程数目)和M(累加值),检查参数N和M和合法性,若不合法则退出程序,反之继续运行,然后开启N个线程,每个线程的函数体流程如上,代码如下:

voidthreadSum(){while(count<=M){pthread_mutex_lock(&mutex);if(count<=M){sum+=count++;}pthread_mutex_unlock(&mutex);}}


主线程通过pthread_join等待子线程结束,然后输出结果到output.txt.

3.2 多进程


3.2.1 流程图


941d142dcc7eada358c7b60bc4d85b0a.png


3.2.2 描述

程序读取input.txt文件中的内容,赋值给N(子进程数目)和M(累加值),检查参数N和M和合法性,若不合法则退出程序,反之继续运行,然后申请共享内存,并初始化信号量,然后开启N个子进程,每个子进程的函数体流程如上,代码如下:

while(pProcess->count<=M){sem_wait(&pProcess->S);if(pProcess->count<=M){pProcess->sum+=pProcess->count++;}sem_post(&pProcess->S);}

父进程等待子进程退出,然后销毁信号量,将结果输出到output.txt.

4. 结果分析


4.1 多线程


如下系列图所示,横坐标为线程数量,纵坐标为运行时间(单位us),不同折线表示不同计数量(图片通过python调用C程序使用matplotlib库画出)。


94d99e052d56c9387c1a79d839cd65a4.png


ccf21abc72581ad2cf2f9dfca1af3bf0.png

c8aa5e93b79213ad8f26b1d04e26d10e.png

e383cb059684cf49b4996af537519ede.png


由上图可发现,开启相同线程数量时,累加的计数越大耗时越长(实验所用的主机电脑性能有些差,运行时间较长);


当线程数量为1时,运行相同计数量所耗时最少,因为当开启多个线程时,需要耗时开启线程,同时由于线程阻塞,也需要耗费一些时间,在内核态和用户态之间的切换很大程度地影响了程序的性能。但多线程时,所做的计数工作与单线程其实是一样的,而线程的阻塞反而影响了性能。


4.2 多进程


如下系列图所示,横坐标为进程数量,纵坐标为运行时间(单位us),不同折线表示不同计数量(图片通过python调用C程序使用matplotlib库画出)。

3fde7ca16e4cfd7078b02b9508b85bcd.png

5e5b9a422a64c4678857f404b3e3b4ab.png

765b3fe46df08bc47280fb3ea85457ab.png


由上图可发现,开启相同进程数量时,累加的计数越大耗时越长(实验所用的主机电脑性能有些差,运行时间较长);


当进程数量为1时,运行相同计数量所耗时最少,因为当开启多个进程时,需要耗时开启进程,同时由于PV操作使得进程阻塞,也需要耗费一些时间,但多进程时,所做的计数工作与单进程其实是一样的,而进程的阻塞反而影响了性能。


同时,对比多线程和多进程下相同条件(相同线程/进程数量,相同计数值)下,多进程耗费的时间更长,因为对操作系统来说,开启一个线程比fork一个子进程所耗费的时间短许多。因为线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源比如说程序计数器等,而进程有独立的地址空间,进程切换时,耗费资源较大,所以效率要差一些。

相关文章
|
19天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
37 1
|
2天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
2天前
|
Ubuntu Linux 网络安全
Ubuntu 22.04 LTS有哪些新特性
Ubuntu 22.04 LTS有哪些新特性
|
5天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
15 2
|
6天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
1月前
|
存储 消息中间件 人工智能
进程,线程,协程 - 你了解多少?
本故事采用简洁明了的对话方式,尽洪荒之力让你在轻松无负担的氛围中,稍微深入地理解进程、线程和协程的相关原理知识
40 2
进程,线程,协程 - 你了解多少?
|
17天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
19天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第15天】进程、线程和协程是操作系统中三种不同的执行单元。进程是资源分配和调度的基本单位,每个进程有独立的内存空间;线程是进程内的执行路径,共享进程资源,切换成本较低;协程则更轻量,由用户态调度,适合处理高并发和IO密集型任务。进程提供高隔离性和安全性,线程支持高并发,协程则在资源消耗和调度灵活性方面表现优异。
43 2
|
27天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
219 3
|
25天前
|
算法 安全 调度
深入理解操作系统:进程与线程的管理
【10月更文挑战第9天】在数字世界的心脏跳动着的,不是别的,正是操作系统。它如同一位无形的指挥家,协调着硬件与软件的和谐合作。本文将揭开操作系统中进程与线程管理的神秘面纱,通过浅显易懂的语言和生动的比喻,带你走进这一复杂而又精妙的世界。我们将从进程的诞生讲起,探索线程的微妙关系,直至深入内核,理解调度算法的智慧。让我们一起跟随代码的脚步,解锁操作系统的更多秘密。
34 1