初识进程和线程


1.一台电脑的组成

CPU+主板+内存+硬盘+电源+散热器+机箱+显卡
最关键的部分:CPU+存储器+输入设备+输出设备(冯诺依曼体系)

CPU:中央处理器,衡量一个CPU的好坏主要通过频率/主频,值越大,说明CPU越牛。CPU执行的每个操作的最小单元称为“指令”。
在这里插入图片描述
2.5GHz表示一秒钟能够执行25亿条指令
主板:一般和CPU配套
内存:写的代码都需要在内存上运行
硬盘:存放数据
显卡:核心部分为GPU
GPU与CPU的区别:CPU就像一个大学生,既可以算1+1,也可以算微积分;GPU就像一群小学生,之只会算1+1,但是计算速度很快。显卡是用来显示图形的,图形的显示就需要大量的计算,都是比较简单的类似1+1的计算,这种使用CPU也能算,但是就大材小用了,而GPU来算就非常合适。

2.寄存器

  • 寄存器是用来辅助CPU完成指令的执行的,是CPU的一部分。
  • 寄存器的存储空间更小,访问速度更快,成本更高,掉电后数据会丢失。
  • 寄存器的速度是内存的3-4个数量级,相差很大。
  • 存储数据的东西:寄存器、内存、硬盘。访问速度:寄存器>内存>硬盘;空间大小:寄存器<内存<硬盘

3.缓存

由于寄存器和内存之间在速度和空间上差异太大了,难以协调工作,CPU往往引入了“缓存(cache)”来调和寄存器和内存之间的速度。
缓存的存储空间介于内存和寄存器之间,由于两者差距太大,所以一个缓存可能不够用,所以可能存在几个缓存一起使用,现代的CPU都是典型的3级缓存结构,也就是3个缓存。
在这里插入图片描述

CPU上要进行一系列的计算,在计算过程中会反复用到一些内存中的较多数据,而在寄存器中又存不下,为了避免不断反复从内存中取,浪费时间,所以就将这些数据放在了缓存中。

4.操作系统

操作系统是一个用于管理的软件。计算机的CPU、内存、硬盘以及各种I/O设备等都是需要相互配合才能够进行良好的工作的,而操作系统这个软件就是总指挥,指挥各设备完成怎样的操作、如何配合。

  • 操作系统对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境。
  • 计算机在给我们解决实际问题时,是要依靠一些软件的,而软件只有在操作系统上才能够执行。
  • 硬件是千差万别的,不可能写软件的人都考虑硬件的差别和兼容性写不同的代码程序,所以操作系统将硬件屏蔽起来,对软件提供一组api(系统调用),让软件来调用。

操作系统必须弄清楚的概念:进程、线程

5.进程的基本概念

当程序被运行之后,就变成了一个进程。进程是系统分配资源的基本单位。

每一个进程运行过程中会消耗一定的硬件资源,包括内存、硬盘、网络带宽等等,所以说进程是系统分配资源的基本单位。

6.进程是如何进行管理的

操作系统对下要管理各种硬件设备,对上要给各种应用程序提供一个稳定的运行环境。操作系统管理进程的方式:

①先描述

操作系统利用PCB结构体来描述进程的各个属性,包括但不限于以下属性:

1.pid:
pid就是进程的身份标识。一个系统中,同一时刻的每个进程的pid一定是不一样的。类似于一个班级中每个学生的学号是不一样的。
通过任务管理器可以查看每个进程的pid:
在这里插入图片描述
有时候运行一个.exe文件,可能涉及到多个进程。

2.内存指针:
该进程使用的内存资源是什么样的.
而内存资源中主要存储从exe可执行文件中加载过来的指令和数据,以及一些运行过程中产生的中间结果。
·指令:这里指的是二进制指令,是程序员编写的程序逻辑代码编译成的二进制的形式,使得cpu可识别,进一步交给cpu执行。(就像演戏:exe文件就像剧本,exe文件被加载到cpu中就像演员将剧本加载到自己的大脑中,cpu运行程序变成进程,就像演员根据大脑中的内容演戏)
·数据:执行指令会依赖到的数据
总的来说:内存指针明确了内存资源中哪些地方是保存指令的,哪些地方是保存数据的,哪些地方是保存中间结果的,有一个明确的划分,这些规则都是通过内存指针来表示的。

3.文件描述表:
每个进程会有一个文件描述表,来记录当前进程正在使用哪些文件。
操作系统打开一个文件,就会产生一个文件描述符,就像文件的身份标识一样,当然只是在进程内部生效的,同时使用文件描述表(类似数组)把文件描述符组织起来。
·文件:描述当前进程使用了哪些硬盘资源,进程并非直接访问硬盘,而是访问“文件”,“文件”是硬盘的一个抽象概念,程序通过操作硬盘上的文件,实现硬盘的操作。

进程的调度
进程需要在cpu中执行,现代cpu为多核心的,也就是多个进程可以同时运行,但cpu有特定数量的核心,而进程的数量很大,此时就涉及到进程的调度。进程调度的方式:

并行
同一时刻,两个进程同时运行在两个cpu逻辑核心上
并发
两个进程在一个cpu逻辑核心上轮着运行。由于cpu切换进程的速度极快,所以微观上,两个进程是串行执行的;宏观上,两个进程就是“同时”进行的(实际上不是同时的)。
应用程序时感受不到系统到底时按照什么方式调度当前程序的,同时,两种调度方式在宏观上的体现效果时一样的,所以通常用“并发”这个词代替“并行”和“并发”。

进程的调度又会依赖进程的以下几种属性:

4.进程的状态
就绪状态:表示一个进程以及做好了随时在cpu上执行的准备。
阻塞状态/睡眠状态:表示进程还没有准备好被调度。
实际进程还有许多状态,上面两种状态最为关键。
优先级:系统进行调度的时候,不是完全公平的,会根据优先级的不同,来决定时间分配的权衡,这样可以把系统资源调配给更重要的进程。
5.上下文:由于进程轮流被调度,一次运行不玩,就需要保证下一次被调度的时候,能够从上一次运行到的位置继续往后运行。上下文就是该进程执行过程中,寄存器中对应的数据,这些寄存器,有的存中间结果,有的存一些具有特定含义的数据(比如下一条指令是在哪里,当前的函数调用关系等)。这些寄存器的数据就需要在进程离开cpu之前都保存好,保存到进程的PCB的上下文字段中(内存中),下次该进程回到cpu执行,就可以把PCB中到的上下文里的数据恢复到寄存器中,这个时候,进程就和上次执行的状态一模一样了。
6.记账信息:相当于一个统计信息,会统计每个进程在cpu上都执行多久了,执行了多少指令了,是对于进程的调度工作进行一个“兜底”,避免某个进程太久得不到cpu资源。

②再组织

操作系统利用双向链表的数据结构,把多个PCB结构给串起来。当打开一个新的进程的时候,就相当于创建一个新的PCB结构,并将该结构添加到双向链表中;查看进程的列表,就相当于遍历链表;结束一个进程的时候,就相当于把这个PCB结构从链表中进程删除并释放。

7.虚拟地址空间

为了解决进程间干扰,如果直接给每个进程分配真实的内存物理空间,一旦一个进程中的代码出现bug,就可以影响到其他进程的运行,影响系统的稳定性。故引入虚拟地址空间,可实现操作系统对进程使用的内存空间进行自动化校验,将一个进程的问题局限在进程内部,使其不影响其他进程,提升系统的稳定性。

在这里插入图片描述在这里插入图片描述

①进程的隔离性

进程之间不会相互干扰,每个进程自己的内存空间都是独立的,都是不能相互访问的。

②进程间通信

有时候需要进程进行配合、联系,此时就需要进行进程间通信,进程通信的本质就是找一个公共区域,这个区域每个进程都可以访问到,此时就可以实现进程通信,这个公共区域可以是内存、可以是硬盘、也可以是网络等

8.线程

当多核的cpu形成之后,多个进程可以同时运行,实现了并发编程,但是这样存在一个缺点:进程太重,导致:
1)资源消耗的多 2)速度更慢
如果进程创建销毁的速度很快,那么系统就需要不断的为进程分配资源,这样就很费时,系统开销会比较大。故出现了线程(Thread)。

线程是轻量级进程,是操作系统进行调度执行的最小单位。其原理是:
线程包含在进程中,一个进程中可以包含一个线程,也可以包含多个线程,当进程中出现第一个线程的时候,会创建PCB,然后为其分配需要的资源,包括内存、硬盘等,而后续出现在该进程中的线程,不需要再为其分配内存和硬盘资源,直复用第一个线程的内存、硬盘资源,但是这些线程各自独立的在cpu上进行调度。这样,不需要创建多个进程,为每个进程分配一次资源。
线程既能够完成并发编程,又可以以比较轻量的方式来运行。
线程也是用PCB来描述的,一个PCB对应一个线程,多个PCB对应一个进程(就像上面Chrome浏览器的pid那样)
PCB中的内存指针、文件描述表,同一个进程中的多个PCB这两个字段的内容都是一样的,但是上下文、状态、优先级、记账信息这些支持调度属性的这些PCB信息每个线程是不一样的。

总结

计算机由CPU、主板、内存、硬盘、电源、散热器、机箱、显卡等硬件组成,寄存器用于辅助CPU完成指令的执行,而缓存用于调和内存和CPU之间的速度差异。

我们需要解决的实际问题要靠软件来完成,而软件需要在操作系统上才能够运行,操作系统是一个用于管理的软件,向上管理各硬件设备,向下给各种软件提供稳定的运行环境,了解操作系统需要了解进程。

进程(Process)是正在跑起来/运行的程序,没有正在运行的程序不叫进程,同一个程序运行多次就可能产生多个进程。而平时所说的程序,指的是一些exe的可执行文件。在操作系统中,管理进程的核心思路是先描述在组织,描述进行的结构体叫做PCB(进程控制块),管理进程的数据结构是双向链表,PCB中包含了进程的pid、内存指针、文件描述符、进程状态、进程优先级、进程上下文以及记账信息等属性。不同进程在CPU上运行需要进行进程调度,而调度需要考虑进程状态、进程优先级、进程上下文以及记账信息等信息。进程之间空间地址相互独立隔离,但是也需要进行通信。

线程是为解决多进程过重的问题引出的,一个进程可以包含多个线程,同一个进程中包含的线程共用一份内存、硬盘资源,但是每个线程单独去CPU上调度(状态、上下文、优先级、记账信息等属性每个线程各自又各自的一份)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值