<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>操作系统 on Leanku 的博客</title><link>https://www.leanku.com/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</link><description>Recent content in 操作系统 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 18 Feb 2024 20:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>对进程、线程和协程的理解</title><link>https://www.leanku.com/post/computerscience/%E5%AF%B9%E8%BF%9B%E7%A8%8B%E7%BA%BF%E7%A8%8B%E5%92%8C%E5%8D%8F%E7%A8%8B%E7%9A%84%E7%90%86%E8%A7%A3/</link><pubDate>Sun, 18 Feb 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/computerscience/%E5%AF%B9%E8%BF%9B%E7%A8%8B%E7%BA%BF%E7%A8%8B%E5%92%8C%E5%8D%8F%E7%A8%8B%E7%9A%84%E7%90%86%E8%A7%A3/</guid><description>&lt;h1 id="对进程线程和协程的理解"&gt;对进程、线程和协程的理解&lt;/h1&gt;&#10;&lt;h2 id="一-进程"&gt;一、 进程&lt;/h2&gt;&#10;&lt;p&gt;先来了解一下操作系统的进程：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;操作系统对正在运行程序的抽象，这个就是进程（process）。&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;比如运行一个 web 浏览器，一个 text 文本，都是运行的一个一个进程。&lt;/p&gt;&#10;&lt;p&gt;有的人说：进程是程序运行资源的集合。进程是系统资源分配的最小单位等等。&lt;/p&gt;&#10;&lt;p&gt;从静态的角度来说，进程确实是运行程序的各种资源集合。&lt;/p&gt;&#10;&lt;p&gt;如果你进一步思考，进程里的各种资源都有哪些呢？&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;内存管理相关&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;文件系统&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;调度相关&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;信号处理&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;内核栈&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;进程各种状态&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;进程运行时统计信息&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;进程标识&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;等等。&lt;/p&gt;&#10;&lt;p&gt;可以看出，进程中的资源是相当多的。&lt;/p&gt;&#10;&lt;p&gt;从 Linux 操作系统对进程的定义也可以看出。&lt;/p&gt;&#10;&lt;p&gt;多进程：操作系统有多个程序运行，那么就有多个进程&lt;/p&gt;&#10;&lt;h2 id="二-线程"&gt;二、 线程&lt;/h2&gt;&#10;&lt;p&gt;《操作系统设计与实现》里说：&lt;/p&gt;&#10;&lt;p&gt;在传统操作系统中，每个进程中只存在一个地址空间和一个控制流（thread）。&lt;/p&gt;&#10;&lt;p&gt;然后，有些情况下，需要在相同地址空间中有多个控制流并行的运行，就像他们是单独的进程一样（只是他们共享相同的地址空间）。&lt;/p&gt;&#10;&lt;p&gt;这些控制流通常被称为线程（thread），有时也称为轻量级进程（lightweight process）。&lt;/p&gt;&#10;&lt;p&gt;尽管线程必须在进程中执行，但是线程和进程是可以分别对待处理的两个概念。进程用来集合资源，而线程是 CPU 调度的实体。&lt;/p&gt;&#10;&lt;p&gt;线程给进程模型增加的是，允许在同一个进程环境中有多个执行流，这些执行流在很大程度上相对独立。&lt;/p&gt;&#10;&lt;p&gt;也即是说，在进程中，程序执行的最小单位（执行流）是线程，可以把线程看作是进程里的一条执行流。&lt;/p&gt;&#10;&lt;p&gt;一个进程里可以有一条或多条线程。&lt;/p&gt;&#10;&lt;h3 id="为什么会有多线程"&gt;为什么会有多线程&lt;/h3&gt;&#10;&lt;p&gt;在一个应用程序执行过程中，应用程序里可能会有多种事件执行。&lt;/p&gt;&#10;&lt;p&gt;而有些事件执行一段时间后可能会被阻塞。如果把应用程序执行事件分解成多个并行运行的线程，即可以让程序设计变得简单，如果有阻塞的，&lt;/p&gt;&#10;&lt;p&gt;可以把这部分让出行换其他线程执行。&lt;/p&gt;&#10;&lt;p&gt;还有一个原因是：&lt;/p&gt;&#10;&lt;p&gt;线程比进程更轻量级。所以线程比进程更加容易创建，销毁。&lt;/p&gt;&#10;&lt;p&gt;第三个跟第一个有点关系，是关于性能的，若多线程都是 CPU 密集型的，那么不能获取性能上增强。如果有大量计算和大量 I/O 处理，那么&lt;/p&gt;&#10;&lt;p&gt;多线程就可以获取性能上的优势，因为允许多线程重叠执行。&lt;/p&gt;&#10;&lt;p&gt;多线程的缺点：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;对于多线程来说，进程中的资源是共享的，所以会产生资源竞争。&lt;/li&gt;&#10;&lt;li&gt;当进程中的一个线程崩溃了，会导致这个进程里的其他线程也崩溃。所以有时多进程程序更好，一个进程崩溃不会导致其他进程也崩溃。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="三-进程和线程的区别"&gt;三、 进程和线程的区别&lt;/h2&gt;&#10;&lt;p&gt;从上面进程和线程介绍知道，线程是程序执行流的最小单位，进程是操作系统分配资源的单位。&lt;/p&gt;&#10;&lt;p&gt;进程与进程之间关系：&lt;/p&gt;&#10;&lt;p&gt;进程与进程之间是相互独立的。&lt;/p&gt;&#10;&lt;p&gt;线程与进程关系：&lt;/p&gt;&#10;&lt;p&gt;线程是进程里的执行流，进程里的线程可以是一个，也可以是多个。&lt;/p&gt;&#10;&lt;p&gt;所有线程共享进程里一些资源，比如代码，数据，地址空间，信号处理，打开文件，全局变量等。&lt;/p&gt;&#10;&lt;p&gt;同时，线程也有自己的寄存器，程序计数器，堆栈，线程状态等&lt;/p&gt;&#10;&lt;h2 id="四协程"&gt;四、协程&lt;/h2&gt;&#10;&lt;p&gt;协程是建立在线程之上，一般是语言级别的 ”多线程“ 模型，比线程更加的轻量级。有的叫它微线程。它是完全运行在用户态里。&lt;/p&gt;&#10;&lt;p&gt;协程是在线程之上在进行抽象，它需要线程来承载运行。一个线程可以有多个协程。&lt;/p&gt;</description></item></channel></rss>