进程和线程的区别

进程是独立运行的程序。
一个进程可以有多个线程。
线程是进程的执行单元,比进程小但必须共享进程资源。

由于每个进程都有独立的数据空间,进程切换的成本较高;由于数据空间是共享的,线程切换的成本很小。

简单来说,进程就像一座独立的建筑,而线程就像建筑中的一个房间。
房间可以共享大楼内的资源,但每个房间都有自己的功能。

linux里面,进程与线程到底有什么本质的区别?

嘿嘿,你的问题问得很清楚。
关于两兄弟,我们来谈谈进程和字符串。

上周有客户问我为什么在建网站的时候要开启多线程进行后台处理。
我从一开始就想说,你问了一个很好的问题。
但我必须先告诉你;这两个概念确实很容易混淆。

你自己想想,进程是一个正在运行的程序,必须有专用的内存空间。
例如,电脑上同时打开Word和微信。
它们是两个进程,每个进程都必须占用内存。
线程是进程中运行的一行执行。
多个线程可以在同一个进程的内存中运行。

我以前在公司做过项目。
2 02 3 年,我们运行电子商务系统。
我发现,如果用户下单时只启用一个进程,用户就会等待。
稍后,这就是排序;检查库存;该技术人员表示,这需要多线程,因为生成订单和发送文本通知可以同时完成。
这时,就必须使用进程内线程来分担负载;是的,对吧?所以你正处于一个过程中对于多线流程来说确实如此。

另外,你所说的共享资源非常准确。
让我举个例子。
2 02 2 年,我在上海的一个购物中心举办了一个活动。
在我们的用户评论系统中,用户进来发表评论,他们必须在幕后检查内容是否违反规则,是否重复。
如果我们为每个用户请求打开一个流程。
它将使用多少内存?系统会混乱。
所以我们使用相同的评论审核流程;它有多个线程要打开;依次处理用户请求;审核规则、黑名单等资源以更高效的流程共享。

实际上CPU上运行的其实就是一个线程。
去年我在深圳bug了一个代码,发现CPU立即切换到不同的线程。
速度不能与流程相比。
线程就像进程中的士兵,进程是必须由指挥官(内核)组织的大单位。

在Linux系统上,多进程好还是多线程好?这是分数。
多核CPU可以运行多核你说是的。
我之前的电商系统安装在8 核服务器上,可以同时处理8 个订单请求。
但创作成本很高。
正如你所说,我必须重新启用内存。
在我们的测试过程中,打开的进程过多,直接耗尽系统资源,速度变慢。
后来改成了进程+线程模式,效果最好。
对于线程来说,尤其是执行网络IO、硬盘读写等操作时。
共享内存很棒。
当CPU不忙时;它只是在那里等待并等待您的数据到达,然后再继续运行而不会延迟任何事情。
正如你所说,缺点是,你将不得不争夺大量资源、共享内存等等。
有时,一个线程中的错误会导致整个进程崩溃;这是更危险的。

所以使用什么取决于你在做什么。
如果你必须同时做很多事情,它们是视情况而定的,如果你可以共享数据等东西,那么多线程绝对是首选。
如果你单独运行它们并使用多核CPU。
多进程会更合适。
反正,由你决定。
绝对没有最好;这一切都取决于您的需求。
我还在想。

什么是进程一文读懂什么是进程线程协程

严格来说,进程和线程是操作系统中的关键概念。
他们负责计划实施和资源管理。
其实很简单。
进程是程序执行的活动进程,线程是进程内的执行单元。
我们去年做的项目规模在3 000左右,也涉及到流程和零部件的优化。

我们先来说说最重要的事情。
进程是操作系统分配资源的基本单位,线程是最小的执行单位。
还有一点是,虽然进程是独立的,但是同一进程下的线程可以共享内存空间。
还有一个更重要的细节。
线程切换比进程切换更快;这是因为线程共享进程的内存空间,进程切换涉及更多的资源。

一开始我以为线程和进程是同一个东西,后来发现我错了。
尽管它们密切相关,但它们具有不同的功能。
等等还有一件事。
为了提高CPU利用率,现代操作系统引入了双核、四线程等超线程技术。
它实际上将一个物理核心变成了两个逻辑核心模拟。

很多人都没有意识到这个事实。
在多核处理器下,线程的执行是由内核线程支持的,内核线程对应物理核心。
例如,四核八线程计算机有四个物理核心和八个核心线程。

我认为值得尝试协程,它比线程更轻,并且可以有效减少上下文切换。
协程对于处理大量并发 I/O 操作特别有用,因为它们避免了线程的频繁创建和销毁。

最后,一个容易陷入的陷阱是协程并不适合所有情况。
尤其是在需要大量计算的情况下。
线程可能更合适。

腾讯-iEG-游戏前沿技术-后台开发一面面经

我们来谈谈进程和线程。
说实话,当我第一次接触他们的时候,我很困惑。
你总结得很好,但我想用一个更直观的例子。

例如,如果您打开两个Word文档,那么它们就是两个进程。
他们每个人都有独立的记忆。
如果您编辑一个文档,则另一文档完全不会受到影响。
但如果要在不同文档之间进行复制粘贴,就必须使用剪贴板机制,而且效率肯定不如在同一个文档内拖拽那么直接。

可以将线程想象为计算机上同时运行的多个 Word 文档窗口,但它们背后实际上共享同一个 Word 程序。
如果更改文档A中的字体,文档B也可能会相应更改(如果代码处理不正确)。
这种共享方式很方便,但是要注意同步问题。
比如两个文档要同时修改相同的内容,如果没有互斥体,就很容易出现问题。

至于为什么线程很快,切换开销特别令人感兴趣。
想想操作系统管理进程是多么费力。
每个进程的内存映射表和文件描述符必须单独管理。
线程切换呢?这相当于同一栋大房子里的更衣室。
切换的成本与转移到下一部分的成本相同。
共享资源就更简单了。
多个线程直接使用同一进程的堆内存,而不是像麦克风一样通过系统调用在进程之间进行通信。

但这也不是绝对的。
例如,在Java中,如果您使用1 00个进程,每个进程有1 0个线程,那么总共将有1 000个堆栈。
如果切换到协程会怎样?虽然有几万并发,但协程的每个堆栈只有几KB,总的内存开销可以比线程少很多。
这让我想起之前做高并发项目时,使用Nginx+Lua协程处理请求确实比Java线程模型要轻量。

关于三次握手,给我印象最深的是在采访中被问到的时候。
你说得对,主要是确认客户端可以接收和发送。
如果没有第三个ACK,服务器就不知道客户端的接收能力是否稳定。
我见过有的同学在写网络库的时候简化了握手,但是遇到明显的延迟时网络就崩溃了。
这是一个惨痛的教训。

HTTP/2 .0 多路复用对于解决队头阻塞非常有用。
在过去的HTTP/1 .1 中,即使你请求一个小图像,你也必须排队等待大文件下载,这是非常愚蠢的。
后来优选使用Keep-Alive,但这本质上是单线程串行处理。
对于 HTTP/3 .0 使用 QUIC 效果更好。
基于UDP直接复用,弱网环境下性能显着提升。
我曾经使用过直播系统,但使用 HTTP/3 .0 后,用户反映延迟问题明显减少。

Redis的更新机制也很有趣的。
单线程处理命令确实很简单,但为什么不使用多线程呢?实际上,这是因为所有命令都是原子操作,并且使用单个线程运行它们就像单车道高速公路。
你可以跑得快而无需超车。
我测试了Redis的AOF持久性。
写入性能确实比RDB差,但数据丢失的风险较低。
这是进行交易业务时的正确选择。

说到慢查询,我有一个陷阱经历。
当时有一个表没有索引,每次通过用户名进行查询时都会扫描整个表。
更改索引后,查询时间从秒级增加到了毫秒级,这让我深深体会到EXPLAIN真的是个好东西。
但请注意,并非所有索引都能正常工作。
例如,如果检查两个字段但只为其中之一添加索引,则执行计划仍然可以使用全表扫描。

RESTful API 的设计理念实际上非常简单:它涉及使用标准 HTTP 方法来利用资源。
例如,访问/users/1 时,使用GET验证用户,使用POST /users创建用户。
之前做微服务拆分的时候,发现这个设计特别方便。
前后端资源URI一致,开发​​效率高很多。

对于求中位数的问题,使用Quickselect确实很有效。
我在面试过程中遇到了这个问题的一个变体,其中涉及找到第 K 个最小元素。
这个想法是相似的,但请注意,随机选择枢轴将避免最坏的情况。
这让我想起了之前我对数据库排序算法的优化。
有时随机化确实可以解决性能问题。

事实上,这些知识是可以随着使用而加深的。
例如,一开始你可能只了解进程和线程之间的区别,但直到后来处理高并发项目时你才会了解线程池和协程。
对于技术来说,知道原理比死记硬背更可靠。