线程?进程?-----该停下来思考一下了

Vue3 - Element Plus 组件库 Tabs 标签页右侧区域插入按钮,<el-tabs> / <el-tab-pane> 选项卡组件右侧自定义插槽内容教程(右边区域添加自定义按钮功能区) vue3,elementplus,tabs选项卡如何在插槽按钮,tabs标签页组件怎么自定义右侧内容,vue3elementplustabs组件右侧插槽按钮,element-plus在el-tabs组件的最右侧添加按钮,如何在选项卡右边加入按钮搜索框等内容,哪个属性能在tab选项卡右侧插入自定义按钮,在el-tabs组件最右侧添加按钮,vue3el-tabs组件怎么自定义右侧插槽内容,Tabs标签页右侧自定义插槽,ElementPlusTab右边加按钮,el-tabs组件自定义右侧按钮,在E 阅读详情

多线程,当今在IT圈子内部最普遍的概念。有多少人理解它的实质,它的精髓?(我不甚懂,这篇文章只是在使劲往前冲的时候让我停下了,吃点有营养的东西,然后继续冲)甚至在多线程还没有完全吃透的情况下,现在又冒出了什么并行计算,网格,云等等......

做技术应该迷恋技术,但不应该迷信技术!要吃透它,上升到理论的高度!

在计算机时代早期,只有任务,后来有了批处理,但是本质上还是一个任务,后来为了更加密集的应用资源产生了多道程序设计,这就开始了多进程时代,世界开始热闹了。多进程(多道程序设计)本质上是在一台硬件机器上虚拟N台硬件机器,有了N台机器,那么很自然的就可以跑N个进程了,这样,计算机领域的最伟大的 思想诞生了-----虚拟分层思想。该思想本质上是在某层(n层)通过外加一个下层(n-1层)的管理模块,向上层(n+1层)提供一个完整的抽象,这个 抽象可以让上层(n+1)的模块认为自己完全运行在下层(n-1)。这很拗口,我用实例说明一下:我把机器硬件设想为n-1层,多进程操作系统作为n层, 而应用软件为n+1层,我们看看是不是这个道理,每个进程(应用软件)都认为自己享有了整个机器,其他进程被操作系统这个管理者给隔离了,进程间通信被假象成两台不同机器的通信,所以古老又伟大的unix把套接字作为进程间通信的手段的一种。分层虚拟思想有两个很重要的层面,一个是隔离,一个是共享,很矛盾,但却是共存的,也许这就是我们的世界吧。隔离和共享再抽象一点就是个性和共性,隔离的是个性,共享的是共性。在我举的例子里面,共享的是硬 件,隔离的是进程私有的东西。按照科学界的做法,总是出一个量化的东西,那么我说:共享的是n层往下包括n层的东西(共享n-1层往下的层就没多大意义了,概念上是共享,但是注意,分层思想的另一个核心就是屏蔽,n层会为n+1层屏蔽掉n层下面层次的异构性),隔离的是n+1层的东西。这么说就很简单 了,但是这只是个开始,随着讨论的深入,我会把层次进一步的分割或合并,最终产生我们正 
在用的windows或linux,或者,我的皮肤,我的家庭,或者,我们的世界.....(或者,世界之外....)。虚拟分层包括两层含义,一是虚拟,而是分层,虚拟指的是类似分形的我中有你,你中有我的一个总体结构,而分层是一个部分的,低耦合高内聚的组成实体,它对上层屏蔽下层,使用下层的接口服务为上层提供统一接口服务。

按照这个思想,多线程就有运而生了,现在已经有了:硬件(cpu等)-〉操作系统-〉进程,的层次关系了,而且在操作系统的管理之下,进程运行在操作系统提供的虚拟cpu上,同样的道理,这里把虚拟cpu当作真正的cpu的话,就可以在这个cpu(虚拟的)上实现多道程序设计了,进程作为管理者,再向上抽象一层,这就是线程!这里的进程成了属于它的线程的“操作系统”,每个线程都认为自己拥有整个虚拟cpu,所有线程实际上共享这个虚拟cpu。截至目前我 们的层次化表示为:硬件cpu-〉操作系统-〉进程-〉线程;而虚拟化表示为:硬件cpu(操作系统)-〉虚拟cpu(进程)-〉线程。这么看来,继续下 去是可行的,我们可以再进一步抽象,进程可以提供一个虚拟虚拟cpu,从学术意义上,这是很优美的,但是从技术上,却是没有意义,因为我们没有理由这么做,学术上往往从和谐和美学角度分析问题,但是在技术上,做一件事必须有一个可实施的非空洞理由!往往很多成果都是现有了理论,然后当那个理由很充分的时 候,技术上的对应物就出现了,上面谈的都是理论的东西,那么促使多道程序设计和线程出现的那个理由到底是什么呢?

最开始的时候,应用计算机就是为了计算一些数值运算,退一步说就是给它一个1,给它一个+,再给它一个1,问它结果等于几,诸如此类的问题,那么可以直接 用硬连线实现,随着半导体的发展,计算机的运算性能不断提高,仅仅用于计算大大浪费,所以就用它来做很多的事情,从而产生了批处理系统,但是一个时间做一件事情也不好,于是,多道程序设计就出现了,当时多道程序设计刚起步,人们的想法还只是很简单的隔离进程的思想,进程间通信的代价很大,就像不同机器的通 信差不多,随着时间的推移以及多道程序设计的进一步完善,加之人们共享概念的生成,很自然的需要在不同进程之间共享一些资源,所以对进程间通信提出了挑战,最终促使了多线程的产生......

基本概念我们都明白了,那么现在你能理解现实中的系统了吗?能理解intel的VT技术吗?实际上全是虚拟分层思想的套用,intel为了在其处理器上并发运行不同操作系统,那么必须在硬件和操作系统之间加一层管理层,这就是VT-xxx技术了。

注意,我上面的讨论中,丝毫没有提到存储器和IO,其实,计算和存储两大部分只是冯诺依曼机器的模型,很多并行机并非那样,如果非要说说冯诺依曼机器和虚拟分层思想的对应,那么就只有两点需要注意,一个是计算,一个是存储,负责计算的是进程或线程,负责存储的就是另一大部分了---虚拟存储器,文件和外设 IO,而虚拟存储器也是一个分层的东西。而IO为何一般不向上层抽象呢? 
我们上面讨论虚拟机思想的时候说到了抽象,操作系统把cpu指令都抽象给了进程,那为什么没有把IO给进城呢?每当进程需要IO服务时,必须请求操作系统 系统调用。因为在冯诺依曼机中cpu是核心,一切控制的核心,所有控制序列都是从cpu发起的,cpu的核心就是计算,而IO设备并不具备这样的机制,形象一点说,不管是多道程序设计还是多线程都是cpu提供的机制,操作系统提供的策略,执行一条指令,cpu中的硬件逻辑(寄存器上下文)知道这个指令属于 哪个进程或者线程,而且也控制好了互斥等等,然而IO外设则不然,你发给它一条指令,它只会傻乎乎的执行,它并没有控制逻辑,它只有要么I,要么O接口, 控制逻辑是外设相关的,比如你把一个字符串写到ntfs格式磁盘和写道xfs格式磁盘,或者写道el1000网卡的格式是不一样的,

外设内在地并 不支持多进程多线程和控制逻辑,所以这么直接在进程(线程)上下文执行IO是很危险的,因此,外设不能简单地抽象给进程。我个人认为,把cpu和外设同等 对待,在外设上也加入复杂的控制逻辑,就可以将外设抽象给进程了,但是那样硬件的设计就复杂了,外设的多样性使得提供统一的指令级别的接口变得不可能,而且也违背了机制策略分离的原则(cpu提供那么多的控制功能恰恰没有问题,因为它的任务就是控制计算,而计算很大程度上接口是很容易统一的)。于是在各个处理器指令集里,io指令被称为敏感指令,而还有一些指令是无论如何,进程都不能触及的,这就是cpu控制进程或线程的特权指令。

前面说了那么多,同时又闲扯了上面这一段,还是回到多线程,我们真的该用多线程吗?我们符合多线程带来实惠的条件吗?不少人为了展示自己多懂编程,动不动就pthread_create,包括我也一样,当你真正理解多线程以后,看过多线程的实现以后,你会不禁一叹!多线程建立销毁的开销,多线程切换的开销,多线程互斥的开销,你富裕到足够消费这些的程度了吗?如果你仅仅拥有单cpu,那么对于cpu密集型的计算只会徒增复杂性和开销而已,到头来程序更 慢,对于io密集型的计算,多线程倒是个好主意,因为一个在等io的时候另一个可以进行计算,单cpu上,线程就是时间片。考虑一下在只有一个经理的情况下,他要处理5个文件,如果他一心一意处理文件,没有别的打扰,而且他从不停顿的话,是让一个人把5个文件一下子全部拿来好呢,还是5个人每人拿一份文 件,一次进去一个人送一份文件,等经理处理完后让他出去叫另一个拿文件进来好呢?计算机里面的东西在现实中都有相应的模型,比如找零钱问题,处理器流水线....如果你在现实世界没有找到一个模型或者说和现实世界的做法背道而驰,而把它引入计算机系统的话,那将不是一个好的主意!
 

Python爬虫教程:如何爬取多平台电商商品信息(价格、评价、库存) 本文介绍了如何编写一个跨平台电商商品爬虫,爬取多个平台的商品信息,包括商品名称、价格、评价等数据。通过Python的爬虫库(如requestsSelenium)和数据处理库(如pandasmatplotlib)的结合,我们可以高效地获取和分析电商平台上的商品信息。 阅读详情

相关推荐

Windows 下安装 ros2 的超详细教程

Windows11 ROS安装

2401_83363439的博客 3316

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程;进程VS.线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线程ID、程序计数器、...

weixin_30399797的博客 250

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 672

linux中exec操作对线程组的影响

在linux的多线程程序中,如果一个线程调用了exec会怎样?是影响整个进程还是仅仅影响单个线程?实际上是影响整个进程,因为exec就是替换进程 地址空间的,而线程是共享进程地址空间的,从本质上讲,线程是没有地址空间这个概念的,只不过在linux中,其独特的线程实现方式使得进程和线程的概念 更加模糊了,在linux中只要一个执行绪就有一个task_struct结构体与之对应,但是实际上按照现代的操

TCP/IP 6703

芯片设计新思路:如何用SystemC+TLM2.0快速搭建ESL性能模型(附GEM5实战案例)

本文探讨了在芯片设计早期利用SystemC和TLM2.0标准快速构建电子系统级(ESL)性能模型的方法。通过对比不同抽象层次,详细介绍了如何搭建事务级模型,并与GEM5仿真平台协同,实现高效的架构探索和性能评估。文章最后通过一个片上网络(NoC)带宽优化的实战案例,展示了该方法如何驱动数据驱动的设计决策,从而在流片前规避风险、优化芯片性能。

fire9的博客 368

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 564

OpenSSL多线程互斥的解决方案--一种新的锁

自己曾经将基于传统套接字的通信程序修改为了SSL的套接字程序,可是却在运行中出了问题,具体就是在SSL_write的地方遇到了NULL指针,不是SSL为NULL了,而是其中的一个字段为NULL但是在SSL_write中却用到了,因此就出错了,究其原因,罪魁祸首就是多线程,openssl的文档上也明文规定不能将一个SSL指针用于多个线程,可是我们程序的需求必须用于多个线程,在库的实现与我们的需求矛盾

TCP/IP 1万+

​​10.3 时间敏感网络(TSN)协议适配​

本文探讨了时间敏感网络(TSN)协议在PCIe网络加速卡开发中的适配方案,重点分析了时间同步、流量调度和冗余传输三大核心问题。研究从协议实现、硬件加速设计和驱动优化三个维度展开,提出采用FPGA实现PTP时钟同步、动态TAS调度器以及双路径冗余传输等技术方案。通过工业控制网络案例验证,该方案将端到端延迟从120μs降至8μs,带宽利用率提升至92%,同时实现了100%的确定性保障。研究还总结了调试工具和典型问题解决方法,为TSN在PCIe网络中的实际应用提供了技术参考。

amy_mhd的博客 364

epoll + 多线程实现并发网络连接处理

简介   触发方式   条件触发   边沿触发   主要的应用接口 Epoll的创建   根据man手册介绍, epoll_create(int size) 用来创建一个epoll实例,向内核申请支持size个句柄的资源(存储)。Size的大小不代表epoll支持的最大句柄个数,而隐射了内核扩展句柄存储的尺寸,也就是说当后面需要再向epoll中添加句柄遇到存储不够的时候,内

Stay hungry, Stay foolish! 1885

15、降维算法:原理、实现与应用

本文深入介绍了多种降维算法,包括线性方法如主成分分析(PCA)和线性判别分析(LDA),以及非线性方法如Sammon映射、t分布随机邻域嵌入(t-SNE)和自编码器。文章通过C++库Dlib和Shogun展示了这些算法的具体实现,并结合图像压缩和数据可视化等实际案例,分析了不同算法的适用场景。此外,还探讨了降维算法的选择策略、优化改进方法以及未来发展趋势,为读者提供了全面的技术理解和应用指导。

lemon的博客 115

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 673

J.U.C Review - 基本概念:进程、线程、线程组、优先级

在Java中,我们可以通过继承Thread类或实现Runnable接口来创建线程。虽然Thread类使用起来简单,但Runnable接口更加灵活,更符合面向对象设计原则。当需要线程有返回值时,可以使用Callable接口,而Future接口和FutureTask类提供了获取异步任务结果的机制。

小工匠 5333

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 236

操作系统——进程管理

进程是程序在某个数据集合上的一次运行活动。注意抠字眼,进程是运行活动,前提是程序在某个数据集合上,这个数据集合就是软、硬件环境,被多个进程共享的环境,

weixin_59913110的博客 4054

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JavaSE——多线程(进程和线程概念,多线程安全问题,同步代码块,同步方法,Lock锁)

线程和进程的概念并行和并发的区别多线程程序实现案例分析引出线程安全问题JDK1.5之后的Lock锁的使用 线程和进程的概念 进程 概念:进程就是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有他自己的内存空间和系统资源 多进程的意义:单进程计算机只能做一件事情,而我们现在的计算机都可以一边玩游戏,一边听音乐,我们常见的操作系统都是多进程操作系统,例如Windows,Linux等等 思考:对于单核计算机来说,游戏进程和音乐进程是同时进行吗?当然不是,因为CPU在某个时间点上只能做一件.

wozhendeb的博客 287

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

进程与线程:09 进程同步与信号量

进程与线程:09 进程同步与信号量

weixin_44399845的博客 925

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

多线程的思考

这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.com] ps:有件事我忘记说明, 我是游戏服务器程序员, 工作是在linux, 本文中很多观点只适合我的工作环境, 并不适合windows下的朋友, 谢谢. 1. 为什么要使用多...

weixin_30662109的博客 62

Java多线程初阶-基础概念与线程操作

本篇笔记介绍了JavaEE中的重要一站,理解和掌握多线程是提升程序性能、构建高响应应用的关键。这篇文章可以作为多线程学习之旅的起点,旨在帮助初学者建立对线程的清晰认识。内容将从“什么是线程”这个基本问题出发,探讨其与进程的区别,并动手编写第一个多线程程序。接着,会深入学习`Thread`类的常用方法,掌握如何创建、启动、中断和等待一个线程。最后,会全面解析线程的生命周期与各种状态,为后续理解更复杂的并发问题打下坚实的基础。

weixin_73966418的博客 1357

谈谈我对多线程的理解

一、提到多线程,就不得不理解以下几点: 1.程序,进程,线程这三者之间的关系? 简单来说,一程序可以调用多个进程,比如一个视频播放器程序,里面就存在两个进程:一个是播放视频的进程,一个是下载上传视频的进程。 一个进程又同时调用多个线程,这个线程是隐藏的,用进程管理器看不到,可用其它的进程管理软件来查看。 三者的逻辑关系是程序调用进程,进程调用线程,一般来说程序下面都是多进程,不同的进程

DongMeng1994的博客 2万+

浅谈对多线程的理解

一、提到多线程,就不得不理解以下几点:1.程序,进程,线程这三者之间的关系?简单来说,一程序可以调用多个进程,比如一个视频播放器程序,里面就存在两个进程:一个是播放视频的进程,一个是下载上传视频的进程。一个进程又同时调用多个线程,这个线程是隐藏的,用进程管理器看不到,可用其它的进程管理软件来查看。三者的逻辑关系是程序调用进程,进程调用线程,一般来说程序下面都是多进程,不同的进程分工不同;进程下面也...

mxsf_lrj的博客 305

【Java从入门到放弃 之 多线程 一】

我们在现在操作系统上进行一系列操作的时候,通常感觉很多是同时发生的,比如说,我可以一边听歌,一边发电子邮件。这两个操作好像是同时进行的。实际上操作系统是通过CPU分片,轮流执行这些程序,只不过CPU分片的大小太小了。以至于我们人感觉好像在同时发生一样。

Snow的博客 481

操作系统学习系列——2.1进程管理

在这里我们需要学习了线程,进程的相关知识 ,都是一些比较抽象的东西,我们如果不理解还是要看看书或者相关知识。

z3551906947的博客 223
上一篇: 【python入门到实践1】简介和环境搭建
下一篇: 系统设计---分层,分级,分块
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值