操作系统--进程与线程

什么是进程,什么是线程,这个问题一直困扰了我很久。学完后只能理解的很抽象,但不明其所以然。网上也均以概念居多,所以我尝试换个角度从源码去深挖到底什么是进程与线程。

我们先从历史的发展来看,为什么会引入进程和线程。

我们从计算机发展的历史角度来看,在早期的计算机中,只有一个CPU的时候,只能一个程序一个程序的执行,直到一个程序运行完成或者运行过程中出现问题而停止,下一个程序才会进入内存然后使用CPU。这时候的系统我们称之为单道批处理系统。如果遇到IO输入输出,或者打印机这种相对CPU来说比较慢速的设备来说,CPU就要闲置在那等待这些事件的完成。那么CPU的利用率就非常低。CPU是昂贵的,于是人们想办法提升CPU的利用率,让它无时无刻不在工作。于是出现了多道批处理系统。可以同时处理多个程序。那么想实现多道批处理系统,会遇到什么困难呢?首先一个困难就是多个程序都在内存的时候,如何实现他们的并发执行而不会出现混乱,当一个程序遇到阻塞时如何切换其他程序来使用CPU呢,于是人们觉得要引入一些新特性来把这些程序区别开来,这就是进程的引入。

我们先区别程序和进程:

程序的概念:

那么什么是程序呢,一个程序是由代码和数据组成的。能实现某些特定功能。程序如果放在磁盘上,那么它只是一些二进制数据流是死的没有生命的。当它放入内存让CPU执行起来的时候,CPU像赋予了程序生命,能完成各色各样的任务。

进程的概念:

结合程序的概念,我们知道当它进入内存中执行的时候,它的身份就转换了,它是一个实体。它就像活了一样有自己的生命,此时不能在把它叫程序,应该叫进程。程序是死的,进程是鲜活的,好比如你画了一个卡通人物设计图,在纸上它叫图纸,设计出来它就是模型。长的虽然一样,但在不同的环境下叫法是不一样的。但是单单只是叫法不一样,不能解决我们的问题,我们特此还为进程配置了一个专门的数据结构--TCB(进程控制块)因此,进程比程序多了一个PCB来本质的区别进程和程序。

进程控制块(PCB):

其实可以把PCB理解为一个进程的“自传”,描述它这一生的路程,也就是从诞生到死亡的每一步记录,这是一个内核数据结构,用于表示和管理进程的状态和相关信息。它是内核维护的一个数据结构,包含了操作系统需要了解和跟踪一个进程所需的所有信息,比如进程的标识符、状态、程序计数器、寄存器状态、资源使用情况、内存分配、打开的文件等。PCB通常存储在内核的进程表中,并由内核维护和管理。这是操作系统感知进程存在的一种很重要的手段

现在我们理解了进程和程序的区别。有了PCB,操作系统就能感知有多少个进程在内存,要给哪个进程分配CPU等工作。这是实现进程并发的一个重大突破。在只有一个CPU的机器上,通过时间片的轮转来实现并发。达到一种能同时处理多个任务的假象。我们再引入两个概念。

并发的概念:

并发的意思在一个CPU上,通过轮转的方式进行多进程的运行。是一种“假”并行。

并行的概念:

真实存在多个CPU同时执行多个进程。比如此时有4个CPU,同时处理着4个进程,那么这就是并行。是真实的同时运行。

那么什么是线程呢?线程其实就是进程代码段中分割出来的小的代码序列。

既然已经有了进程了,还很好的处理了并发的运行,为什么还要提出新的概念线程呢?前辈们提出新的概念肯定是有它的道理的。任何一样新事物的发明肯定不是平白无故的,是用来解决实际问题。每当我无法理解一个概念的时候,我常常会思考为什么要提出这个问题,它的出现是为了解决什么。搞明白这些那么一些抽象难以理解的概念可能会在一瞬间通透。

我们知道程序是完成一个特定功能的代码流和数据流的集合。那么进程就是运行过程中程序的实体。现在我们假设有如下场景,在一个浏览器进程中,我想一边看新闻,一边听歌,同时我还想在这个浏览器中写笔记。这些子功能都属于浏览器这一个进程。那么如何在一个进程中实现并发呢,这就引入了我们线程的概念。把进程再次划分成小的模块,我们称之为线程。线程和进程一样有一个线程控制块,也就是线程的“自传”。引入线程有很多好处。既能解决我们想实现进程中子模块的并发,又能减少进程切换的开销。那么减少进程切换开销如何谈起呢?我们接着往下看。

前面我们说到,实现进程的并发首先要让操作系统感知进程的存在。其次要指定进程切换的规则,比如时间片轮转,优先级调度等。我们这里讨论时间片轮转。每个进程使用CPU的时间是一定的。时间片用完就会切换别的进程使用CPU。在进程切换的过程中,我们要保存即将放弃CPU的进程的上下文,以便一会恢复它的执行。然后才执行切换流程,将控制权交给切换过来的进程。

什么叫保存进程的上下文呢?其实很容易理解,就是保存进程1被中断时候执行到哪一步,寄存器的状态,eflags寄存器等的值都应该保存起来。方便一会恢复继续执行。这里就涉及到一个性能问题。进程的切换会带来的额外的性能开销。要保存一些寄存器,运行的堆栈,还有进程所拥有的空间地址等。但是线程切换所带来的性能损耗是比较低的。因为线程只是进程代码段中的一小段代码序列。本质上只是对进程的再次分割。它共享进程所拥有的地址空间和数据。在切换的时候只需要保存它自身运行状态的相关寄存器和堆栈即可。开销远比进程切换小。但是对于单核CPU来说,线程是透明的。也只是通过轮转的方式实现线程的并发。这就是用户级线程。还有一种内核级线程,我们以后再讨论,未完待续......

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值