有关线程和进程的一些小感悟

之前学多线程编程的时候,一直搞不明白,为什么,我们最开始编程的那些简单的程序而不会被处理器当作多线程程序来运行呢?之前有问过老师,老师说因为你没有写多线程函数,那为啥写了多线程函数就可以多线程了呢,现在cpu不都是支持多线程的吗?莫非有什么多线程开关?不过,我也没好意思再问下去了。。。

今天看了一下os真相还原里的第九章,觉得醍醐灌顶,遂来记录一下

?️No.1什么是线程什么是进程

可能大家觉得这个再小儿科不过了,但是真正理解一个问题,必然是从它的最本质来了解的。这里有一个公式我觉得很重要:
进程 = 线程 + 资源

进程,我们一般都知道是运行起来的程序,我们的进程也可以分为:单线程进程和多线程进程。

那我们刚开始学编程时写的那些程序也就是单线程进程。这里我们又不得不引入另一个概念

执行流

我们都知道,任务调度器在内核中维护了一个任务表,通过一定的算法,从任务表中每次选出一个任务,放到处理器上运行,当任务运行的时间片到期后,再从任务表中找另外一个任务放到处理器上运行,这样周而复始。
那我们现在就有一个疑问,什么是任务,也就是什么样的程序才可以存到任务表里,等待着被调度呢?

答案就是:执行流 处理器上运行的每个任务都是调度器给分配的执行流。(线程就是执行流)

我们把程序计数器PC中下一条指令地址所组成的执行轨迹称为程序的控制执行流。

执行流是独立的,它的独立性体现在每个执行流都拥有自己独立的栈,一套自己的寄存器映像和内存资源。也就是说任何想单独在处理器上执行的代码块,只要给它准备好它所依赖的上下文环境,从而,其就具备了独立性,也就可以被当作任务来进行调度了。

而我们的进程也就是执行流的集合,其内部至少要包含一个执行流(也就是线程)。当只有一个执行流的时候,我们叫单线程进程,有多个执行流的时候我们叫多线程进程。

但是只有进程拥有自己独享的地址空间,进程与进程之间是通过操作系统的页保护机制,来是其各自在各自的地址空间里互不干扰。但是线程没有自己地址空间,它的运行必须要有相应的资源,而进程就是这个资源的提供者。所以,离了进程谈线程,毫无意义。

进程 = 线程 + 资源

?️No.2为什么我们最开始写的那些简单的程序,不会被当成多线程来执行?

原因就是,我们进程的内部只有一个执行流,也就是单线程的进程。当我们使用库函数提供给我们的线程函数的时候,使调用的函数变成一个执行流,也就是线程,从而就可以独立作为任务等待着调度到CPU上。所以,也就是多线程的程序,处理起来也就是按照多线程来处理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值