基于 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一个子进程所耗费的时间短许多。因为线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源比如说程序计数器等,而进程有独立的地址空间,进程切换时,耗费资源较大,所以效率要差一些。

相关文章
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
2天前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
30 11
|
1天前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
16 6
|
20天前
|
JSON Ubuntu 开发者
ubuntu 22安装lua环境&&编译lua cjson模块
通过上述步骤,可以在 Ubuntu 22.04 系统上成功安装 Lua 环境,并使用 LuaRocks 或手动编译的方式安装 lua-cjson 模块。本文详细介绍了每一步的命令和操作,确保每一步都能顺利完成,适合需要在 Ubuntu 系统上配置 Lua 开发环境的开发者参考和使用。
92 13
|
29天前
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
64 4
|
1月前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
65 6
|
1月前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
65 5
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
62 4
|
2月前
|
Ubuntu 网络协议 关系型数据库
超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置
【11月更文挑战第15天】本文档详细介绍了如何使用iBMC在超聚变服务器2288H V6上安装Ubuntu Server 24.04 LTS,包括连接iBMC管理口、登录iBMC管理界面、配置RAID、安装系统以及后续系统配置等步骤。
288 4

相关课程

更多