注:【杂记】系列为日常网搜资料的简单堆砌而积累成之。如有错误恭谢指出。标识为“原创”其实不完全是,只是多引用再整理,大都引自网络,侵删!

进程和线程的分配 娓娓道来

主要参考 用户态线程和内核态线程的区别 - 拾月凄辰 - 博客园 (cnblogs.com)。

过于基础的概念不会在此提及。

以下是针对 单 CPU 多核心来说,如果指多个CPU,那么假设你指的是开放式内存架构,多计算机集群,那么用 MPI 库 或者 OpenMP 讯息传递接口开发最好了。

注:在 Github 上的原版文章日后可能会更新,但这里不会跟进。文章的 Gitee 仓库地址,Gitee 访问更流畅。


一图展示 用户态线程、内核态线程和进程的调度。

用户级线程

用户级线程(User-Level Threads ULT)即这些线程由进程自身负责调度和管理,在用户空间实现多个线程,操作系统不知道这些线程的存在。

对同一个进程内的线程并发执行,即轮询,由线程库来实现。内核感知不到用户级的多线程的存在,内核继续以进程为调度单位;这些用户级线程只能占用一个核,所以做不到并行,并且有一个用户级线程阻塞,对于操作系统就是其所在的进程阻塞了(连带着它的进程的所有线程都阻塞了)。

  • 用户空间运行线程库,任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于用户级线程管理的一个例程包,它提供多线程应用程序的开发和运行支撑环境,包含:用于创建和销毁线程的代码、在线程间传递数据和消息的代码、调度线程执行的代码以及保存和恢复线程上下文的代码。

  • 所以线程的创建,消息传递,调度,保存/恢复上下文都有线程库来完成。内核感知不到多线程的存在。内核继续以进程为调度单位,并且给该进程指定一个执行状态(就绪、运行、阻塞等)。

纯用户级线程的特点:

优点:

  1. 线程切换不需要内核模式,能节省模式切换开销和内核资源。

  2. 允许进程按照特定的需要选择不同的调度算法来调度线程。调度算法需要自己实现。

  3. 由于其不需要内核进行支持,所以可以跨OS运行(脱离操作系统运行,即裸机运行,是这个意思吧?)。

缺点:

  1. 不能利用多核处理器的优势,OS调度进程,每个进程仅有一个ULT能执行。

  2. 一个ULT阻塞,将导致整个进程的阻塞。

jacketing技术可以解决ULT一个线程阻塞导致整个进程阻塞。

jacketing的目标是把一个产生阻塞的系统调用转化成一个非阻塞的系统调用。例如,当进程中的一个线程调用IO中断钱,先调用一个应用级的I/O jacket例程,而不是直接调用一个系统I/O。让这个jacket例程检查并确定I/O设备是否忙。如果忙,则jacketing将控制权交给该进程的线程调度程序,决定该线程进入阻塞状态并将控制权传送给另一个线程(若无就绪态线程咋可能执行进程切换)。

内核级线程

内核级线程(Kernel-Level Threads KLT)也有叫做内核支持的线程。进程的每个线程都对应一个操作系统线程,由操作系统负责管理和调度这些线程。对多个线程并行执行,即利用多核。但是缺点,内核级线程切换的代价要比用户级线程大,内核级线程的数量是有限的,扩展性比不上用户级线程。

  • 线程管理的所有工作(创建和撤销)由操作系统内核完成。

  • 操作系统内核提供一个应用程序设计接口API,供开发者使用KLT。

纯内核级线程特点:

优点:

  1. 进程中的一个线程被阻塞,内核能调度同一进程的其他线程(就绪态)占有处理器运行。

  2. 多处理器环境中,内核能同时调度同一进程的多线程,将这些线程映射到不同的处理器核心上,提高进程的执行效率(这样可以实现并行)。

缺点:

  1. 应用程序的内核级线程线程在用户态运行,线程调度和管理在OS内核实现。线程调度时,控制权从一个线程改变到另一线程,需要模式切换,系统开销较大。

可以看出,用户级线程和内核级线程都有各自的优点和缺点,在应用上主要表现为:

  • 用户级多线程对于处理逻辑并行性问题有很好的效果。不擅长于解决物理并行问题。

  • 内核级多线程适用于解决物理并行性问题。

线程规划的模型

由操作系统内核支持内核级多线程,由操作系统的程序库来支持用户级多线程(用户级线程创建完全在用户空间创建,调度也在应用程序内部进行,然后把用户级多线程映射到(或者说是绑定到)一些(一些还是一个?)内核级多线程)。编程人员可以针对不同的应用特点调节内核级线程的数目来达到物理并行性和逻辑并行性的最佳方案。

多对一(Many to One)

用户态进程中的多线程复用一个内核态线程。这样,极大地减少了创建内核态线程的成本,但是用户级线程不可以并行。因此,这种模型现在基本上用的很少。

用户态线程怎么用内核态线程执行程序?程序是存储在内存中的指令,用户态线程是可以准备好程序让内核态线程执行的。

一对一(One to One)

该模型为每个用户态的线程分配一个单独的内核态线程,在这种情况下,每个用户态都需要通过系统调用创建一个绑定的内核线程,并附加在上面执行。 这种模型允许所有线程并行执行,能够充分利用多核优势,Windows NT 内核采取的就是这种模型。但是因为线程较多,对内核调度的压力会明显增加。

多对多(Many To Many)

这种模式下会为 n 个用户态线程分配 m 个内核态线程。m 通常可以小于 n。一种可行的策略是将 m 设置为核数。这种多对多的关系,减少了内核线程,同时也保证了多核心并行。Linux 目前采用的就是该模型。

两层设计(Two Level)

这种模型混合了多对多和一对一的特点。多数用户态线程和内核线程是 n 对 m 的关系,少量用户线程可以指定成 1 对 1 的关系。

思考

启发任务分配的规则

p.s 参考 多线程,多进程,多核总结 - 知乎 (zhihu.com),gil基本介绍 - 风-fmgao - 博客园 (cnblogs.com)。

任务可以分为 计算密集型 和 IO密集型 。假设我们现在使用一个进程来完成这个任务:

基本原则:计算密集多进程,IO密集多线程(因为GIL的存在,所以IO密集反而合适多线程);一个进程处理一对输入输出以及之间的计算(可以理解为一个大任务,系统级的),一个进程内的一堆线程处理该进程内的多个计算路线。

  • 对计算密集型任务,可以使用【核心数】个进程(或内核级线程?)(比如4核就是做一个进程带4个内核级线程 或者 四个进程各带一个线程),就可以占满cpu资源,进而可以充分利用cpu,如果再多,就会造成额外的开销。

  • 对于IO密集型任务(涉及到网络、磁盘IO的任务都是IO密集型任务),即经常被阻塞,用 一个进程内的 多个线程 对应的 跑多个 IO设备。

实现并行计算有三种方式,单进程多内核级线程,多进程(每个进程只有默认的一个线程),多进程+多线程。如果是多进程,因为每个进程资源是独立的(地址空间和数据空间),就要在操作系统层面进行通信,如管道,队列,信号等;多内核线程的话会共享进程中的地址空间和数据空间,一个线程的数据可以直接提供给其他线程使用,但方便的同时会造成变量值的混乱,所以要通过线程锁来限制线程的执行。

有时候多个任务的执行有先后顺序,可以使用进程间通讯或者线程间通讯的机制比如信号量、锁机制等等。在安全与效率之间,首先考虑的是安全。

疑问

  • 当只有一个应用进程时候,CPU有四核,那么有意识的最多创建四个内核级线程可以充分利用CPU?

  • 如果要多个应用进程,那么每个进程如何分配线程,几个应用级线程?几个内核级线程?

可分配情况的列举

在 CPU 为 4 核心的情况下。

  1. 应用分为 4 个进程,每个进程中有 n 个用户级线程;特点:基本“任务”可以分配的很多,有 4 x n 个,但形式单一。

  2. 应用分为 1 个进程,里面包含 4 个内核级线程;特点:基本“任务”只能分 4 个,且形式单一。

  3. 应用分为 2 个进程 A 和 B,其中 A 进程包含 n 个 用户级线程,B 进程包含 3 个内核级线程;特点:形式多,根据应用中 计算密集 和 IO密集 来布置。

  4. 应用分为 3 个进程 A、B 和 C, A 和 B 进程包含 n 个用户级线程,C 进程包含 2 个内核级线程;特点同上。

进程和线程的分配策略【杂记】相关推荐

  1. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】

    Linux 进程 和 线程 的基本 编程.通讯 和 例程 注:[杂记]系列为日常网搜资料的堆砌而积累成之.如有错误恭谢指出.标识为"原创"其实不完全是,只是多引用再整理和加上自己的 ...

  2. 【Linux进程、线程、任务调度】四多核下负载均衡 中断负载均衡,RPS软中断负载均衡 cgroups与CPU资源分群分配 Linux为什么不是硬实时 preempt-rt对Linux实时性的改造

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章(点击链接:点击链接阅读上一篇文章)讲了: CPU/IO消 ...

  3. [转]关于Linux下时间片分配给进程还是线程的问题

    原文地址:https://www.zhihu.com/question/64723752/answer/223613245 在Linux系统中,对于用户创建的进程(线程)来说,CPU分配时间片的单位是 ...

  4. 进程和线程基础知识全家桶,30 张图一套带走

    前言 先来看看一则小故事 我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了. 城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人 ...

  5. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  6. 【知识强化】第二章 进程管理 2.1 进程与线程

    处理机管理相关的内容.认识一个很重要的概念叫做进程. 系统当中正在运行的程序怎么怎么地,怎么怎么地,偶尔也会提到进程这个术语."进程"和"程序"这两个概念是比较 ...

  7. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  8. 全面总结:进程与线程

    首先,进程和线程的区别: 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的地址空间,进程之间的切换会有较大的开销:线程可以看做轻量级的进程, ...

  9. Memcache 内存分配策略和性能(使用)状态检查

    一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作.有兴趣的 ...

最新文章

  1. android touch screen keyboard input移植记录
  2. apache环境下配置服务器支持https
  3. string find简析
  4. 【数字信号处理】周期序列 ( 正弦序列特性 | 单个模拟周期采集 m 个数字样本 | Q 个模拟周期采集 P 个数字样本 | 非周期序列的情况 | 数字信号周期 )
  5. SLAM:VSLAM简介之详细攻略
  6. RoFormerV2:自然语言理解的极限探索
  7. MySQL——分页查询
  8. Linux 线程占用CPU过高定位分析
  9. wps合并所有sheet页_WPS里面如何批量打印(WPS2019)
  10. PLSQL快捷键使用,让你高速开发
  11. 总结一些生物成像的 开源图像与插件网站
  12. 如何在linux下观看需vodplayer播放的电影
  13. TeeChart基础使用手册
  14. 前端——》Layui-下拉多选框拼音模糊匹配
  15. Excel的基本操作(一):保护功能、快速输入数据、导入txt数据和导入Access数据库、Excel数据类型等基本操作
  16. html版权标签怎么打,版权符号怎么打_dreamweaver中版权的符号怎么打?
  17. C语言入门题库——求2+22+222+......+22222的值
  18. linux权限 rwxr xr x,小白求助:权限rwxr-xr-x是啥意思?
  19. PC端工具 WP7 PC端截图工具WP7 Screen recorder 发布 附使用教程
  20. mysql 白天范围_急求mysql 统计一个时间范围内的白天与夜上的数据方法

热门文章

  1. 基于VHDL的层次化设计:异步清零和同步使能4位十六进制加法计数器和七段显示译码器的元件例化实现
  2. 这10个Python项目很有趣
  3. 【git-02】用git管理vue项目
  4. 把树莓派4B配成一台小PC(基础入门)
  5. 关于Android studio的安装步骤与安装方法
  6. Linux下RTC时钟使用
  7. 太极链DAPP游戏最详细的解释与介绍
  8. 活体检测,人脸识别应用方案
  9. linux读苹果格式文件,mac os 如何读取 Linux ext4 格式的硬盘
  10. queen mary java_机器学习网站