首页 > 系统相关 >多线程与多进程

多线程与多进程

时间:2024-06-13 19:55:53浏览次数:18  
标签:通信 任务 线程 进程 多线程 CPU

1.进程和线程的定义

进程线程的定义:进程可以理解为在操作系统中一个运行起来的程序(程序是指令、数据及其组织形式,进程是程序的实体),是操作系统进行资源分配的最小单位。线程是进程中的一个执行流,是操作系统进行系统调度的最小单位,一个进程由一个或多个线程组成。

2.多进程和多线程

多进程指的是操作系统同时执行多个进程,例如同时运行多个软件,多进程的引入也是为了更好的利用系统的资源,一次来提高系统的并发数量,在单位时间内处理更多的任务。而多线程的引入主要是为了降低系统的资源开销。
两者的区别

  • 每个进程都拥有独立的系统分配的资源,一个进程的崩溃通常对其他进程不会产生影响,具有较好的隔离性。因此在多进程通信中进程间的同步较为困难,常见的进程间同步的方式有(共享内存、管道、消息队列、套接字等)
  • 线程共享进程的地址空间,只有自己的堆栈和局部变量,通常线程的崩溃会导致整个进程的崩溃。多线程共享容易,但是同步困难。

3.进程线程间的通信:

  1. 对于进程间的通信方式:
  • 管道:数据只能单向流动,且需要有血缘关系。
  • 命名管道:也只能单向流动,但是可以在没有血缘关系的进程间通信
  • 消息队列:
  • 共享存储区:映射一段能被其他进程所访问的内存,但是要注意数据的一致性问题。
  • 信号量:通常作为一种锁机制来防止进程对共享资源的访问。
  • 套接字: 既可以用于本机进程间的通信,也可用于不同主机间进程之间的通信。
  • 信号:通知某一事件发生。

2.线程间的通信:主要用于在同一进程中的不同线程之间传递数据和协调工作:

  • 线程互斥:互斥锁、读写锁、自旋锁、乐观锁、悲观锁。
  • 线程通信:条件变量、信号量。

4.多线程的选择

  • 对于IO密集型任务:这种任务下,CPU大部分时间都是在等在系统的读写操作(从磁盘、内存读取写入数据等),CPU一直处理闲置状,这时候可以用多线程来大大的提高系统处理的效率,当进行系统IO的时候,CPU切换到其他线程处理,当IO完成后,CPU再切换回来处理剩下的数据处理的任务。可以大大加速程序的运行,避免了CPU长时间的闲等。一般来说线程数与CPU核心数的关系为(线程数=CPU核心数/(1-阻塞系数)),这里的阻塞系数通常是一个泛化的值,在0.8~0.9之间。
  • 对于CPU密集型任务:也指计算密集型任务,这种任务几乎占满了整个cpu的运行事件,对于单核的情况,没必要使用多线程,因为多线程的切换会带来额外的时间和资源消耗。对于多核心的,线程数=核心数为最佳,这样每个线程都有一个CPU核心来运行,同时也没有线程切换的开销,最大程度上使用了CPU。

标签:通信,任务,线程,进程,多线程,CPU
From: https://www.cnblogs.com/aloneqing/p/18246397

相关文章

  • 爬虫 | 多线程、多进程、协程
    进程和线程"""进程中至少有一条线程,线程和进程的开启非常类似,这里就展示线程"""fromthreadingimportThreadfrommultiprocessingimportProcess#第一种开启的方法就是直接defdeffunc(name):foriinrange(100):print(name,i)if__name__=='__ma......
  • Qt - 多线程之线程的开始暂停恢复停止
    示例1在Qt中,可以使用QThread的线程控制功能来暂停和恢复一个线程。这里是一个简单的例子:#include<QThread>#include<QDebug>classWorkerThread:publicQThread{voidrun()override{qDebug()<<"Threadisrunning";//执行一些任务......
  • 成为MySQL DBA后,再看ORACLE数据库(八、进程、连接与会话)
    不同于MySQL的单进程多线程架构,ORACLE是多进程架构。一个ORACLE实例主要有以下三类进程:1.后台进程,这些进程随数据库启动而启动,用于完成数据库的各种后台任务;2.服务器进程(serverprocess),这些进程一般由客户端的请求产生,根据客户端的请求完成工作;3.从属进程,这些进程类似后台进程,它们......
  • GATK不能多线程的问题
    问题:申请了多线程但是只能单线程 17:13:48.941INFOIntelPairHmm-Availablethreads:117:13:48.941INFOIntelPairHmm-Requestedthreads:417:13:48.941WARNIntelPairHmm-Using1availablethreads,but4wererequested 解决方法:exportOMP_N......
  • 【C++】多线程(基于Windows以及pthread库)
    文章目录一、前言1.1进程和线程二、创建线程2.1线程函数pthread_self(void)2.2创建线程三、线程退出3.1线程函数pthread_exit()四、线程回收4.1线程函数pthread_join()4.2线程数据回收五、线程分离5.1线程函数pthread_detach()六、C++线程类七、线程同......
  • 设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量
    设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进程C需要使......
  • python指南之多线程与多进程编程大全
    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。多线程与多进程的概念多线程多线程是指在同一进程内,多个线程并发执......
  • Interlocked 为多个线程共享的变量提供原子操作 多线程重入
    Interlocked可以为多个线程共享的变量提供原子操作主要使用的读写方法varrunningState=Interlocked.Read(refisRunning);Interlocked.Exchange(refisRunning,0);可以配合lock实现业务常用方法Add(Int32,Int32) 对两个32位整数进行求和并用和替换第一个整数,上述操......
  • 使用 ps 查看进程的启动时间和运行时间
    用法ps-eopid,lstart,etime,cmd|grep<进程关键字>命令解释:lstartSTARTEDtimethecommandstarted.Seealsobsdstart,start,start_time,andstime.etimeELAPSEDelapsedtimesincetheprocesswasstarted,intheform[[DD-]......
  • 一文带你搞清楚Python的多线程和多进程
    本文分享自华为云社区《Python中的多线程与多进程编程大全【python指南】》,作者:柠檬味拥抱。Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来......