操作系统 - 进程, 线程, 协程 - 学习/实践

1.应用场景

了解熟悉计算机内部运行的原理, 帮助开发高质量程序.

最主要是弄清楚到底是个什么玩意儿。

2.学习/操作

1.文档

进程与线程的区别-----面试题_WangY.H-CSDN博客

进程与线程的概念和原理_{竹子} -CSDN博客

Windows下进程与线程_HHHUANG-CSDN博客

Linux进程与线程的区别_laviolette的专栏-CSDN博客_linux进程和线程的区别

记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背_帅地-CSDN博客

给女朋友讲 : Java线程池的内部原理_万猫学社-CSDN博客

进程和线程 - 廖雪峰的官方网站

2021-04-24 - PHP - 多进程编程「含线程/协程」 - 学习/实践_william_n的博客-CSDN博客

14|调度算法:操作系统中的进程是如何调度的?-极客时间 -- 推荐

并发介绍 · Go语言中文文档  -- 推荐阅读

golang 语言面试题总结 - 《GO 面试题》 - 技术池(jishuchi.com)

25 | 答疑(二):GIL与多线程是什么关系呢?-极客时间

2. 整理输出

2.1 进程 【内核态】

进程是资源分配的最小单位。

一个进程至少有一个线程

2.2 线程【内核态】

线程是程序执行的最小单位

一个线程可以有n个协程 n是自然数

2.3 协程【用户态】程序操作,所以可能有可能无,根据编写的程序而定

比线程更小的单位.

11 | 多任务:进程、线程与协程-极客时间

网友-一步

对于协程的概念没有理解,协程不也是走系统调用吗?走系统调用不就是走到了系统内核态呢?后面任务调度,cpu执行指令

作者回复: 协程不走系统调用。协程切换只是寄存器的保存和恢复,所以可以在用户态下自己来实现。

网友-Linuxer

有一个疑问:协程属于用户态的线程,它跟线程之间怎么对应呢?协程之间也需要切换,那线程切换的那些成本它一样有啊,没想明白它的优势在哪

作者回复: 从单位时间成本来说,有一定优势但也不会特别大。主要少掉的代价是从用户态到内核态再回到用户态的成本。这种差异类似于系统调用和普通函数调用的差异。因为高性能服务器上io次数实在太多了,所以单位成本上能够少一点,积累起来也是很惊人的。

其他网友问题:

网友-Eric:如果只是减少内核态用户态的状态切换,零拷贝也可以做到呀?区别在于 零拷贝不能修改改文件内容么?

shupian419 > Eric:

零拷贝是为了避免cpu将数据从一个内存地址拷贝到另一个内存地址;用户态到内核态切换要做的是执行软中断,查询中断向量表,cpu执行权限从用户态到内核态。这应该不一样吧。

2.4 区别/优劣势,以及之间的关系,本质

不论是进程还是线程,或者协程,都统一叫做执行体。

线程间共享进程所拥有的全部资源。


进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间,共享大部分数据。线程间通信方便)
启动一个线程所花费的资源远远小于启动一个进程所花费的资源。
线程,它们彼此之间使用相同的地址空间。

11 | 多任务:进程、线程与协程-极客时间

网友-王棕生

我理解: 线程是CPU调度的基本单位,进程是资源(包括CPU计算资源)分配的基本单位;操作系统在决定谁来使用CPU的时候,操作系统不会去关注进程,而是关注线程,只有要切换到其它进程的线程时,才会关注进程。

比如:进程p1有三个线程t1 t2 t3,进程p2有三个线程t4 t5 t6, 操作系统关注的是这6个线程的调度,比如从t1切换到t2,从t2切换到t3,当从t3切换到t4的时候,发现t4是属于另一进程的,这个时候就会不知线程要调度,进程也要调度。

麻烦许老师点评一下,这样理解是否准确?

作者回复: 我们想一下进程的本质是什么。我们以内存资源为例,内存在不同进程中的逻辑地址与物理地址的映射表不同,更具体来看其实就只是几个寄存器的值的差异而已。所以实际上,并不存在线程调度和进程调度的区别,线程调度了,寄存器变了,进程也就切换了。

Geek_03056e

有几个问题请教一下老师:

1 cpu时间片运行执行体,选择执行体时,是cpu控制,还是操作系统控制?进程、线程、协程获得的概率是一样的吗?

2 通过sh,cpu知道了进程的首地址,执行进程,这个线程是怎么执行的呢?

3 文中提到网络服务器的存储是个共享状态,这个存储指哪些存储呢?

作者回复:

1、文章中有表格 [就是下面的图片表格],里面的调度方就是你说的控制方。不同执行体控制方不一样,调度算法不一样,概率也就不一样。

2、线程知道函数地址就行,一样是入口。

3、共享存储包括内存、数据库等等。

表格形式展示

TBD

2.5 思考

TBD

后续补充

...

3.问题/补充

1. 设备CPU进程号是随机产生还是有固定分配? 20200107

进程号是按照进程启动的顺序分配的,有些进程是在设备启动过程中调用的,这些进程启动的顺序是一定的,所以进程号就是固定的。

比如linux中init进程号一定是“1”。

而有些进程是设备完全启动后用户配置的,那这些进程号就是可变的[即便用户不配置, 有些进程的端口也是操作系统随机分配的 -- 参见<<PHP核心技术与最佳实践>>]

简单说,有固定,有随机,系统初始进程是固定进程号的,后系统运行过程中,进程号便是随机产生的,类比于生活中,想一下也能明白~

2. 进程、线程、端口间关系

进程是指在系统中正在运行的一个应用程序

线程系统分配处理器CPU时间资源的基本单元,或者说 进程之内独立执行的一个单元。

对于操作系统而言,其调度单元是线程。

一个进程至少包括一个线程,通常将该线程称为主线程。

一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务

端口计算机与外界通讯的出口,端口将接收到的数据包给到指定的应用程序来处理。

进程或是线程可同时监听多个端口. // key point

3. 什么是线程安全?

线程安全意味着二进制文件可以在多线程的Web服务器上下文中工作,如Windows上的Apache2。

这句话也意味着,即便我们在编程语言中,没有开启/或者语言本身不支持多线程编程,我们的代码也是运行在多线程中,因为web容器本身就是多线程/多进程

线程安全性的工作原理

是在每个线程中创建一个本地存储副本,这样数据就不会与另一个线程发生冲突。 

Key Point:

只要是在多线程模式下运行,就可能存在线程安全问题.

解决方案:TBD

扩展问题:

所以线程安全存在诸多限制条件?

比如,文件是二进制文件,还要是在多线程的Web服务器中?

个人认为,存在这些疑问的原因在于,没有搞清楚线程安全的本质,本质原因.

Keep Learning

4. CPU核心数与线程的关系?四核八线程是什么意思?

这里面涉及到超线程技术,想要了解超线程技术,首先要了解CPU的核和线程到底是什么?


核是CPU的物理核心数量
线程是核心的工作进程[线程其实就是一种轻量级的进程]


核和线程是一种上下级关系


CPU的核负责运算和判断
线程则负责具体的数据处理工作


过去CPU的一个核心就对应着一个线程
处理数据的能力有限
只能通过堆更多的核心来提升CPU的性能
而现在因特尔发明了超线程技术
让一颗核心可以同时控制两个线程
将原本一颗核心的性能提升了一倍

以四核八线程的CPU为例
就是四核的CPU能够同时进行八线程的工作
性能与八核八线程的CPU相当 [在某些情况下]

简单来说

把核看作是CPU的将军,线程是将军手下的士兵
有的将军能力有限, 只能带一个兵
这样四核的CPU就只有四个士兵的战力
这就是简单的 单核单线程 的CPU


有的将军实力超群,能够同时带两个兵,
这样四核的CPU就拥有八个士兵的战力
这就是 单核双线程 拥有的超线程技术的CPU

那为甚么又说

线程系统分配处理器CPU时间资源的基本单元?

TBD Keep Learning

5. 异步编程提升系统性能的本质

10 | 如何使用异步设计提升系统性能?-极客时间

看了不少的评论,感觉大家对操作系统这块都不是很熟悉,还是好好学习下操作系统吧,当然我是菜鸟,也需要好好学习。

还是说下个人的理解:
"会出现机器的cpu、磁盘、内存都不高(因为等待的线程是不占CPU的)很多请求超时之类的情况。异步的话,就是让线程调用处理接口就直接返回" -- 这是下面某个网友的评论的一段话

系统资源的利用率不高,不代表那些系统资源你可以使用。
比如,并发请求,导致创建了很多的线程来处理,结果是,cpu,内存等系统资源虽然利用率不高,但是系统已经没办法,再创建线程,这时线程成了限制瓶颈,导致请求超时 --- 创建线程也是需要分配占用资源的,但是这些资源是否被利用,则是另外一回儿事儿,尽管线程等待的时候,会让出CPU,但是内存等系统资源,并不会让出,被系统回收,所以成为了限制瓶颈。

供参考

6. 关于Python 语言中的多线程/多进程相关问题 -- 可以帮助理解多进程/多线程,各个语言中的实现

25 | 答疑(二):GIL与多线程是什么关系呢?-极客时间

7. 01 | 使用了并发工具类库,线程安全就高枕无忧了吗?

Java

01 | 使用了并发工具类库,线程安全就高枕无忧了吗?-极客时间

8. macOS 进程/线程 与 php脚本创建多进程执行

 

4.参考

进程与线程的区别-----面试题_WangY.H-CSDN博客

进程与线程的概念和原理_{竹子} -CSDN博客

Windows下进程与线程_HHHUANG-CSDN博客

Linux进程与线程的区别_laviolette的专栏-CSDN博客_linux进程和线程的区别

记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背_帅地-CSDN博客

给女朋友讲 : Java线程池的内部原理_万猫学社-CSDN博客

进程和线程 - 廖雪峰的官方网站

2021-04-24 - PHP - 多进程编程「含线程/协程」 - 学习/实践_william_n的博客-CSDN博客

14|调度算法:操作系统中的进程是如何调度的?-极客时间

并发介绍 · Go语言中文文档

golang 语言面试题总结 - 《GO 面试题》 - 技术池(jishuchi.com)

后续补充

...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值