理解进程线程的十个知识点

266 阅读5分钟

前言

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

本文主要讲述跟进程线程相关的十个知识点,主要是辅助理解,如果想进一步了解进程、线程和协程的区别,也可以看看这篇文章

一、操作系统

第一个知识点就是简单认识下操作系统,毕竟进程线程都是运行在操作系统上的。

什么是操作系统呢?在《现代操作系统》这本书中写到,我们的计算机是由处理器(CPU)、内存、磁盘、键盘等硬件设备所组成的,为了更方便地管理这些硬件设备,就在计算机上安装了一层软件,称为操作系统

为了方便理解,这里也给出了一张概览图,最底层是我们的硬件层,从下往上依次是我们的操作系统、用户接口程序(Shell或GUI)和我们的应用(即进程)。

20211109230614.png

二、硬件驱动

硬件驱动,即操作系统操纵硬件设备的接口。根据上图,可以看到硬件驱动介于操作系统和硬件之间,是他们之间沟通的桥梁。

为什么会有硬件驱动呢?这是因为同一件硬件设备,比如硬盘,存在多个厂商生产,而每个厂商使用的技术不同,所以操作的方式也会有所不同。

解决兼容的方式有两个,一是操作系统兼容硬件设备,即有新的厂商出现,操作系统都要做修改,当然这种方式肯定不现实;二是硬件设备兼容操作系统,也就是硬件驱动

三、系统调用

可能一开始接触编程的朋友并不太熟悉系统调用,毕竟一般情况下编程语言又在系统调用上再封装了一层,使得我们接触的机会比较少。

其实系统调用就是操作系统提供给用户操作硬件设备的接口,如果将操作系统比作第三方库,系统调用就是这个库开放的各种函数

典型的系统调用有 fork,用于创建进程(针对Unix系统)。

四、内核态与用户态

当你运行一个程序的时候,你可以理解为你的程序处于用户态,但当你要执行文件操作、网络数据发送等操作时,需要涉及到 write、send 等系统调用,此时会从用户态切换到内核态

用户态和内核态主要区别在于权限不同,用户态的权限较低,这是为了避免用户不小心执行了一些危险操作,从而导致系统奔溃。

从用户态切换到内核态的三种方式:

  • 1.系统调用:系统调用本身是一种中断,但是是软件中断,而不是硬件中断
  • 2.进程异常:当用户态的进程发送异常,就会触发进程切换
  • 3.外设中断:当外设完成用户的请求,会向CPU发生中断信号。

五、中断处理

操作系统需要对连接到计算机上的所有硬件设备进行管理,要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能:

  • 1.轮询(polling):让内核定期对设备的状态进行查询,然后做出对应的处理
  • 2.中断(interrupt):让硬件在有需要的时候向内核发出信息,从而变内核主动(轮询)为硬件主动

第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,会大量地耗用 CPU 时间,因此效率比较低下,所以一般都是采用第二种方案。

在第二种方案中,中断是一种电信号,由硬件设备产生,并由中断控制器向处理器(CPU)发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当的处理。

六、寄存器

在讲进程线程的切换时,经常会涉及到寄存器的概念,简单理解的话,寄存器就是一个容器,用来存储中间结果。

比如有一个线程计算从1加到100,但是在50的时候会切到另外一个线程,这时就得把1加到50的中间结果保存在寄存器中,如果不保存的话,程序又会从1开始,从而使程序错乱。

寄存器的种类有四种,比较重要的有三种,堆栈指针标志寄存器以及程序计数器(下图使用红色星星标出)。

jicunqi.jpg

七、多核与多CPU

早期的时候,只有单CPU单核,后面为了让计算机执行更快,执行的任务数更多,就出现了多CPU;而增加CPU的成本太高,所以就出现了CPU多核。计算机并行数量等于: CPU数量 * 单个CPU的核心数

八、并发与并行

并发指计算机允许执行多个任务,但这些任务不是同时进行,而是交替执行;并行指计算机允许执行多个任务,但这些任务是同时进行的,同时进行的任务数量取决于CPU数量,以及每个CPU的核心数

九、CPU密集型与IO密集型任务

CPU密集型任务指该任务大部分的时间用来做计算、逻辑等耗费CPU的操作(CPU负载高);IO密集型任务指该任务大部分的时间都在等待IO读写(CPU负载低)

十、异步与同步

A函数调用B函数,且必须等待B函数执行完毕,称为同步;A函数调用B函数,不需要等到B函数执行完毕,就可以向下执行C函数,称为异步。