汽车电子嵌入式开发系列50篇(五)-OS操作系统的进程与线程

举报
格图洛书 发表于 2021/12/27 09:01:28 2021/12/27
【摘要】 进程与线程对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个 Word 就启动了一个 Word 进程。有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内...

进程与线程

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个 Word 就启动了一个 Word 进程。
有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)

类比:
进程 = 工厂
线程 = 工厂里各个流水线

注意:一个进程可能对应多个端口号,一个端口对应一个进程。

进程

进程可以认为是程序执行时的一个实例。进程是系统进行资源分配的独立实体,且每个进程拥有独立的地址空间。(即 资源的分配和调度的一个独立单元
进程控制块(Process Control Block, PCB):保存运行期间进程的数据,PCB进程存在的唯一标志

  • 进程 = 程序 + 数据 + PCB

  • 一个进程无法直接访问另一个进程的变量和数据结构,如果希望让一个进程访问另一个进程的资源,需要使用进程间通信,比如:管道、文件、套接字等。


进程的五种基本状态及其转换:
图片

  • 创建状态:进程正在被创建,尚未转到就绪状态,创建进程需要申请一个空白的 PCB,并向 PCB 写一些控制和管理进程的信息,然后由系统分配资源,将进程转入就绪状态。

  • 就绪状态:进程已处于准备执行的状态,获得了除处理机以外的一切所需资源。

  • 执行状态:进程在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程运行。

  • 阻塞状态:进程正在等待某一事件(服务请求)而暂停运行,如 等待某资源变为可用(不包括处理机)或等待输入输出 I/O 完成,即使处理机空闲,该进程也不能运行。

  • 结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行,当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收。

注意:后备队列外存中,而就绪队列内存中。

进程同步与互斥

PV 操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P 表示通过(荷兰语 passeren)的意思,V 表示释放(荷兰语 vrijgeven)的意思。

具体来源可以查看PV操作的来源

互斥与同步:

  • 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性排它性。但互斥无法限制访问者对资源的访问顺序,即 访问是无序的

  • 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。


在操作系统中,信号量S是一整数。
S≥0 时,S 表示可供并发进程使用的资源实体数
S<0 时,S 表示正在等待使用资源实体的进程数
建立一个信号量必须说明此信号量所代表的意义并且赋初值。
除赋初值外,信号量仅能通过PV操作来访问。

  • 信号量 S(semaphore) 代表“资源数”

  • P 操作的主要动作是:通过(荷兰语 passeren)(即 让进程使用资源

    • S 减 1;

      类比:“占用了一个资源”

    • 若相减结果仍大于或等于 0,则进程继续执行;

      类比:“若占用一个资源后,还有多余的资源或者刚好用完资源,那么就代表该进程有资源可以利用,进程也就可以继续执行

    • 若相减结果小于 0,则该进程被阻塞(挂起),之后放入等待该信号量的等待队列中,然后转入进程调度。

      类比:“若占用一个资源后,还欠别人资源,那么就代表该进程根本就没有资源可以用了,所以先欠着,挂个号,等待

  • V 操作的主要动作是:释放(荷兰语 vrijgeven)(即 让进程释放资源

    • S 加 1;

      类比:“资源占用完了,物归原主,释放资源”

    • 若相加结果大于 0,则进程继续执行;

      类比:“若释放资源后,资源数大于 0,就代表库存里的资源充裕,奉还资源后,还有资源可以给你利用,那就继续占用资源,继续执行

    • 若相加结果小于或等于 0,则从该信号的等待队列中释放一个等待进程(唤醒等待→就绪),然后再返回原进程继续执行 或转入进程调度。

      类比:“若一个进程结束,释放资源后,资源数还是欠别人的或者为 0,就代表库存里的资源很紧张资源刚一释放就被其他进程一抢而空,所以自己就不能用了,得先来后到把资源给下一个进程用,让下一个进程就绪
      如果执行不需要此资源,那么等自己执行完后(有的执行并不一定需要此资源)把处理机让给下一个进程用;
      如果执行需要此资源,那么转入进程调度,重新排队,等等再执行,把处理机让给下一个进程用,让下一个进程执行。”

注意:PV 操作对于每一个进程来说,都只能进行一次,而且必须成对使用

代码化如下:
P 操作:

↓CloseCode↓


P(S) {

S--;

if(S < 0) {

保留调用进程CPU现场;

将该进程的PCB插入S的等待队列;

置该进程为“等待”状态;

转入进程调度;

}

}

V 操作:

↓CloseCode↓


V(S) {

S++;

if(S <= 0) {

移出S等待队列首元素;

将该进程的PCB插入就绪队列;

置该进程为“就绪”状态;

}

}

进程通信

根据交换信息量的多少和效率的高低,进程通信分为如下低级通信和高级通信。

  • 低级通信:只能传递状态和整数值(控制信息)。(如 同步互斥工具:PV 操作)

    由于进程的互斥和同步,需要在进程间交换一定的信息,故不少学者将它们也归为进程通信。

    • 特点:传送信息量小,效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信。

    • 编程复杂:用户直接实现通信的细节,容易出错。

  • 高级通信:提高信号通信的效率,传递大量数据,减轻程序编制的复杂度。
    提供三种方式:

    • 共享内存模式

    • 消息传递模式

    • 共享文件模式

共享内存模式

在通信进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作,实现进程之间的信息交换。
图片
在对共享空间进行写/读操作时,需要同步互斥工具(如 P操作、V操作),对共享空间的写/读进行控制。

类比:
进程 = 物品
共享空间 = 钱
用钱进行交换,而不用物物交换

消息传递模式

在消息传递模式中,进程间的数据交换是以格式化的消息(Message)为单位的。
进程通过系统提供的发送消息接收消息两个原语进行数据交换。
图片

若通信进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的信息传递方法实现进程通信。

可分为直接和间接两种通信方式:

  • 直接:将消息发送给接收进程,并将它挂在接收进程的信息缓冲队列中,接收进程从消息缓冲队列中取得消息。

  • 间接:将消息发送给某个中间实体(信箱),接受进程从中间实体中取得消息,又称为信箱通信方式。

    类比:
    甲给乙写信
    直接:甲直接把信交给乙
    间接:甲通过邮差把信交给乙

共享文件模式

共享文件:用于连接一个发送进程和一个接收进程,以实现它们之间通信的文件,就是共享文件,又名 pipe(管道)文件
向管道提供输入的发送进程,以字节流形式将大量的数据送入管道;
而接收管道输出的接收进程,则从管道中接收数据。
图片

为了协调双方的通信,管道机制必须提供互斥、同步和确定对方存在三方面的协调能力。

共享内存模式与共享文件模式的区别

共享内存和消息队列,FIFO,管道传递消息的区别:

消息队列,FIFO,管道的消息传递方式一般为:

  1. 服务器得到输入

  2. 通过管道,消息队列写入数据,通常需要从进程拷贝到内核。

  3. 客户从内核拷贝到进程

  4. 然后再从进程中拷贝到输出文件

上述过程通常要经过4次拷贝,才能完成文件的传递。

共享内存只需要:

  1. 从输入文件到共享内存区

  2. 从共享内存区输出到文件

上述过程不涉及到内核的拷贝,所以花的时间较少,共享内存最快。

参考:https://blog.csdn.net/m0_37806112/article/details/81671429

线程

对线程最基本的理解就是“轻量级进程”,它是一个基本的 CPU 执行单元,也是程序执行流的最小单元,由线程 ID、程序计数器、寄存器集合和堆栈组成。(即 CPU 调度的基本单元
线程控制块(Thread Control Block, TCB):保存运行期间线程的数据,TCB线程存在的唯一标志

  • 线程属于进程,是进程的一个实体,是被系统独立和分配的基本单位。

  • 线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。

  • 一个进程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

区别

  • 进程是资源分配和调度的一个独立单元;
    线程是 CPU 调度的基本单元。

  • 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

  • 进程的创建调用 fork 或者 vfork,而线程的创建调用 pthread_create;
    进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。

  • 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的。

  • 线程中执行时一半都要进行同步和互斥,因为它们共享同一进程的所有资源。

  • 线程有自己的私有属性 TCB、线程 id、寄存器、硬件上下文;
    进程也有自己的私有属性进程控制块 PCB,
    这些私有属性是不被共享的,用来表示一个进程或一个线程的标志。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。