父子进程、进程、线程、协程、芊程

一、进程定义

编写的代码只是⼀个存储在硬盘的静态⽂件,通过编译后就会⽣成⼆进制可执⾏⽂件(存储在硬盘),当我们运⾏这个可执⾏⽂件后,它会被装载到内存中,接着 CPU 会执⾏程序中的每⼀条指令,那么这个运⾏中的程序,就被称为 「进程」(Process)
在这里插入图片描述
1、进程是并发执行的
单核的 CPU 在某⼀个瞬间,只能运⾏⼀个进程。但在 1 秒钟期间,它可能会运⾏多个进程,这样就
产⽣并⾏的错觉,实际上这是并发。

2、并发和并行
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
在这里插入图片描述

二、进程的状态

1、⼀个进程的活动期间⾄少具备三种基本状态,即运⾏状态、就绪状态、阻塞状态。
在这里插入图片描述
上图中各个状态的意义:

  • 运⾏状态(Runing):该时刻进程占⽤ CPU;
  • 就绪状态(Ready):可运⾏,由于其他进程处于运⾏状态⽽暂时停⽌运⾏;
  • 阻塞状态(Blocked):该进程正在等待某⼀事件发⽣(如等待输⼊/输出操作的完成)⽽暂时停⽌运⾏,这时,即使给它CPU控制权,它也无法运⾏;

当然,进程还有另外两个基本状态:

  • 创建状态(new):进程正在被创建时的状态;
  • 结束状态(Exit):进程正在从系统中消失时的状态;

于是,⼀个完整的进程状态的变迁如下图:
在这里插入图片描述
参考:《图解操作系统》——小林

三、进程控制块(PCB:Processing Control Block)

进程的内核对象:即我们通常所讲的PCB(进程控制块),该结构只能由该内核访问,他是操作系统用来管理进程的一个数据结构,操作系统通过该数据结构来感知和管理进程;它的成员负责维护进程的各种信息,包括进程的状态(创建、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。
或者说,OS是根据PCB来对并发执行的进程进行控制和管理。PCB通常是占用系统内存中一块连续的内存空间,存放着操作系统用于描述进程情况及控制进程运行的全部信息。
PCB是操作系统核心中一种数据结构,主要表示进程状态,其作用是使一个程序成为一个能够独立运行的基本单位,并且可以并发执行的进程。
注:具体结构参照Linux的task_struct数据结构。

在进程创建状态的时候创建pcb、在进程终止的时候销毁pcb

PCB区域解释
CPU_state当p停止时,由各种硬件寄存器(register)和状态标志(flag)组成的CPU当前状态保存在该区域中。当p恢复执行时,保存的信息被复制回CPU中。(比如程序计数器)
process_state储存进程p当前的状态。如,运行、就绪或者堵塞。
memory描述分配给p的内存区域。在最简单的情况下,该区域会指向主储存器中。在使用虚拟内存的系统中,该区域也可以指向内存页或段的层次结构。
scheduling_information包含被调度器使用的信息,用来决定p将何时运行。该信息通常记录p的CPU时间(CPU time),系统中的真实时间(real time),优先级(priority)和任何可能的截止期限(deadlines)。
accounting_informaton跟踪计数和计费所需的信息。如,使用CPU的时间或内存量。
open_files跟踪当前由p打开的文件。
other_resources跟踪p已请求并成功获取的任何资源。如,打印机。
parent每一个进程都是由其他一些正在运行的进程创建的。进程p的父进程(parent process) 是创建p的进程。parent区域记录的p的父进程的信息。
children进程p的子进程c (child process) 是由p创建的进程。进程p是进程c的父进程。进程p每一个子进程的信息被记录在children区域中。

参考:
2.3 进程控制块
【windows 操作系统】进程控制块(PCB)

四、线程

进程的问题

  • 进程之间如何通信,共享数据?
  • 维护进程的系统开销较⼤,如创建进程时,分配资源、建⽴ PCB;终⽌进程时,回收资源、撤销PCB;进程切换时,保存当前进程的状态信息;

那到底如何解决呢?需要有⼀种新的实体,满⾜以下特性:

  • 实体之间可以并发运行
  • 实体之间共享相同的地址空间

这个新的实体,就是线程(Thread),线程之间可以并发运⾏且共享相同的地址空间。

1、线程是进程当中的⼀条执⾏流程。
同⼀个进程内多个线程之间可以共享代码段、数据段、打开的⽂件等资源,但每个线程各⾃都有⼀套独⽴的寄存器和栈,这样可以确保线程的控制流是相对独⽴的
线程的优点:

  • ⼀个进程中可以同时存在多个线程;
  • 各个线程之间可以并发执行;
  • 各个线程之间可以共享地址空间和⽂件等资源;

线程的缺点:

  • 当进程中的⼀个线程崩溃时,会导致其所属进程的所有线程崩溃。

2、线程的上下⽂切换
在前⾯我们知道了,线程与进程最⼤的区别在于:线程是调度的基本单位,⽽进程则是资源拥有的基本单位。
所以,所谓操作系统的任务调度,实际上的调度对象是线程,⽽进程只是给线程提供了虚拟内存、全局变量等资源。
另外,线程也有⾃⼰的私有数据,比如栈和寄存器等。

3、线程的实现
主要有三种线程的实现⽅式:

  • 用户线程(User Thread):在⽤户空间实现的线程,不是由内核管理的线程,是由⽤户态的线程库来完成线程的管理;
  • 内核线程(Kernel Thread):在内核中实现的线程,是由内核管理的线程;
  • 轻量级进程(LightWeight Process):在内核中来⽀持⽤户线程;

3.1、⽤户线程如何理解?存在什么优势和缺陷?

  • 用户线程是基于⽤户态的线程管理库来实现的,那么线程控制块(Thread Control Block, TCB) 也是在库⾥⾯来实现的,对于操作系统⽽⾔是看不到这个 TCB 的,它只能看到整个进程的 PCB。
  • 所以,用户线程的整个线程管理和调度,操作系统是不直接参与的,⽽是由⽤户级线程库函数来完成线程的管理,包括线程的创建、终⽌、同步和调度等。

⽤户线程的优点:

  • 每个进程都需要有它私有的线程控制块(TCB)列表,⽤来跟踪记录它各个线程状态信息(PC、栈指针、寄存器),TCB 由⽤户级线程库函数来维护,可⽤于不⽀持线程技术的操作系统;
  • ⽤户线程的切换也是由线程库函数来完成的,⽆需⽤户态与内核态的切换,所以速度特别快;

⽤户线程的缺点:

  • 由于操作系统不参与线程的调度,如果⼀个线程发起了系统调⽤⽽阻塞,那进程所包含的⽤户线程都不能执⾏了。
  • 当⼀个线程开始运⾏后,除⾮它主动地交出 CPU 的使⽤权,否则它所在的进程当中的其他线程⽆法运⾏,因为⽤户态的线程没法打断当前运⾏中的线程,它没有这个特权,只有操作系统才有,但是⽤户线程不是由操作系统管理的。
  • 由于时间⽚分配给进程,故与其他进程⽐,在多线程执⾏时,每个线程得到的时间⽚较少,执⾏会⽐较慢;

3.2、那内核线程如何理解?存在什么优势和缺陷?

  • 内核线程是由操作系统管理的,线程对应的 TCB ⾃然是放在操作系统⾥的,这样线程的创建、终⽌和管理都是由操作系统负责。

内核线程的优点:

  • 在⼀个进程当中,如果某个内核线程发起系统调⽤⽽被阻塞,并不会影响其他内核线程的运⾏;
  • 分配给线程,多线程的进程获得更多的 CPU 运⾏时间;

内核线程的缺点:

  • 在⽀持内核线程的操作系统中,由内核来维护进程和线程的上下⽂信息,如 PCB 和 TCB;
  • 线程的创建、终⽌和切换都是通过系统调⽤的⽅式来进⾏,因此对于系统来说,系统开销比较大;

3.3、轻量级进程(Light-weight process,LWP)是内核⽀持的⽤户线程,
⼀个进程可有⼀个或多个 LWP,每个 LWP 是跟内核线程⼀对⼀映射的,也就是 LWP 都是由⼀个内核线程⽀持。
另外,LWP 只能由内核管理并像普通进程⼀样被调度,Linux 内核是⽀持 LWP 的典型例⼦。

五、进程和线程的比较

在这里插入图片描述
1、线程与进程的⽐较如下:

  • 进程是资源(包括内存、打开的文件等)分配的单位,线程是 CPU 调度的单位;
  • 进程拥有⼀个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;
  • 线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;
  • 线程能减少并发执行的时间和空间开销;

2、对于,线程相比进程能减少开销,体现在:

  • 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,⽐如内存管理信息、⽂件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,⽽是共享它们;
  • 线程的终止时间⽐进程快,因为线程释放的资源相比进程少很多;
    同⼀个进程内的线程切换⽐进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同⼀个进程的线程都具有同⼀个页表,那么在切换的时候不需要切换⻚表。⽽对于进程之间的切换,切换的时候要把⻚表给切换掉,而页表的切换过程开销是⽐较⼤的;
  • 由于同⼀进程的各线程间共享内存和⽂件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

六、协程

在这里插入图片描述
协程是一种基于线程之上,但又比线程更加轻量级的存在,这种由程序管理的轻量级线程也被称为用户空间线程,对于内核而言是不可见的。正如同进程中存在多条线程一样,线程中也可以存在多个协程。

协程在运行时也有自己的寄存器、上下文和栈,协程的调度完全由用户控制,协程调度切换时,会将寄存器上下文和栈保存到分配的私有内存区域中,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。(当然也有无栈协程,后面会有章节讲下详细的定义和代码实现)
参考
(十四)深入并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解
打开线程 | 进程 | 协程的大门

七、芊程

纤程(Fiber)是Microsoft组织为了帮助企业程序的更好移植到Windows系统,而在操做系统中增加的一个概念,由操作系统内核根据对应的调度算法进行控制,也是一种轻量级的线程。

  • 芊程我们后面会讲下代码实战,其实看了代码,你会觉得芊程更像是LWP的概念的实现。但是没有文章介绍说明,我们在此说下个人的理解
    在这里插入图片描述

八、协程和芊程

纤程和协程的概念一致,都是线程的多对一模型,但有些地方会区分开来,但从协程的本质概念上来谈:纤程、绿色线程、微线程这些概念都属于协程的范围。纤程和协程的区别在于:

  • 纤程是OS级别的实现,而协程是语言级别的实现,纤程被OS内核控制,协程对于内核而言不可见。

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大胡子的艾娃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值