【操作系统基础】线程的理解 多线程模型 fork函数简单认识

创建子进程函数–fork( )

要了解线程我们先来了解fork()函数:fork() 函数的功能是在当前的进程创建一个子进程;

❓那fork()函数的执行机制是什么?

  1. 执行fork函数,会在内存中创建一份和父进程完全一样的子进程出来;
  2. 该子进程和父进程是两个完全独立的空间;用进程编号pid来区分父子进程;
  3. 父进程fork()之后的代码会被并发的执行两遍,是因为子进程和父进程在交替执行fork()之后代码的原因;
  4. fork()函数返回0表示为执行子进程的代码,返回pid编号表示执行父进程,返回-1表示创建子进程失败

下图是父子进程的大概内存布局:有编号那些是进程的代码段
在这里插入图片描述


对于fork()出来的子进程:我们是好处和坏处的;
好处就是:同一段代码,可以有两个不同的执行流,也就是说可以同一段代码可以完成两个不同的事情;
坏处就是:资源浪费:创建一份完全一样的子进程出来,又要复制一份父进程的代码到内存中,很浪费资源!其实很没必要!
在这里插入图片描述


线程的理解

线程之所以出现:也是进程的浪费资源问题相应而出的。
我们最初的想法是,能不能在不创建子进程的同时,也可以有同一份代码,却又有多个执行流!即一份代码可以做不同的事,并且不用创建子进程!
在这里插入图片描述


要给线程一个直观的定义的话:那么线程就是进程中的一个执行流!并且该执行流是并发执行的
在这里插入图片描述
有了线程:那么cpu的调度单位就不再是进程了,而是进程的执行流,也就是线程,因为它们是并发执行的,我们成为并发的线程


一个小例子理解-----线程

  1. 假设有个cpu运行了一个进程,该进程执行执行者代码时候,突然来了一个下载文件的代码,此时进程就发生了调度,cpu去服务其他进程,原进程进入等待状态;
  2. 此时这个下载文件由于太大了,你觉得下载时间好长吖,你就想中断它,让进程继续执行下面其他的代码;
  3. 但是呢。很不巧,你没有书写到中断下载的代码,此时,你无法中断这个下载过程,因为你的进程处于等待状态吖!无法获取cpu来执行你的进程!除非你直接退出该进程,但是直接退出该进程,你却就再也无法执行该进程下面的代码了!这种方式很暴力,不推荐!

在这里插入图片描述


于是乎,你就重新设计了一份新代码,这个代码使用上了线程的技术
当你执行下载文件线程1时候,进程进入等待状态,cpu为其他进程服务。
此时你觉得文件太大,下载时间很长,不想继续下载了,那么你就可以取消它下载;
如何取消呢?那就是你设计线程技术,这个线程2的代码功能是等待进程取消下载文件;
所以当你发出取消的指令时候,那么该线程2就会进入就绪状态,当cpu为其他进程服务结束后,进运行该线程2;一旦运行了该线程2,那么下载文件的线程1就结束啦!此时,就线程1就不下载文件咯。可能线程1下载文件就进入就绪状态,或者结束,直接运行后面的代码!
在这里插入图片描述


于是乎又人就问了!!用进程完成不了吗
fork()一个子进程,这个子进程的功能是取消下载文件!
答案是可以的:但是呢,子进程创建出来,不就是会浪费资源嘛!多了一份和父进程完全相同的代码,此时这样内存就多了一份!所以说用线程的方式好得很多,并且线程是再同一份内存中执行代码的,而进程确实在两份内存中执行代码,父子进程的切换也需要开销。


为什么要有线程

在这里插入图片描述
首先线程不是一开始就被提出来的技术概念!!而是由历史的发展而来的,也就是说我们现在研究的是线程的动机是什么!

打个比喻就是一个引用程序要做很多工作!如web浏览器,又要显示图片,文字,视频的!
假如这三个动作是顺序执行的,也就是说,一个网页显示完图片再显示文字,再显示视频,那么很明显这对用户来说是体验非常不好的,这样对cpu的利用也不高!
那么此时,就引入了进程的概念!我们希望这些三个动作,也就是文字,图片,视频能够“同时”的显示在网页上,那么就是说这三个程序需要并发或者并行(能并行那是因为有多个cpu)执行,此时,我们的网页就可以”同时“显示这三个内容!因为并发的进程是走走停停,交替执行,这个速度很快,快到我们人认为是同时进行的!此时,我们把这些能够同时执行的任务成为”执行流“,也就是说,在进程的概念中,执行流就是进程!,这里又文字,图片,视频三个执行流!很明显我们知道进程的创建和切换,也就是说并发执行是很耗时耗费资源的!
所以我们又提出了线程的概念,也就是说我们能否在一个进程中,执行这三执行流,其实可以的!
线程就是在一个进程中的一个执行流!有线程的概念我们就可以在一个进程执行这三个任务,不需要创建多个进程,并且进行进程切换!我们的线程在一个进程中,可以并发或者并行的执行!这样就大大减少了资源开销!


从内存块的角度理解线程

在这里插入图片描述

  1. 比如一个单线程的进程,其实他就等价于一个进程中的任务!和进程区别不大!这个线程(执行流)共享进程的代码段,数据段,打开文件的信息等内容!同时进程的栈空间也是线程的栈空间!
  2. 假如有多线程的进程,比如三个线程:说明:这个进程中有三个执行流,这个三个会有三个不同的空间,但是都属于一个进程中,它们有自己的栈空间,能够单独的执行自己的任务!但是这三个线程共享一个进程中的代码段,数据段,打开文件的信息等。
  3. 共享带来的好处就是访问这些共享资源的代价低,存储资源节省!不再需要进程那样又要多一份空间存储资源!

线程就是cpu调度的单位了,而进程就是资源分配的单位了,因为即使一个进程只有一个线程,真正执行的还是进程中的线程!


线程的定义

英文解释:
在这里插入图片描述
中文大概意思:

一个线程线程就是cpu利用的单元,线程包含了线程id,程序计数器,寄存器,和栈空间!
线程之间是共享进程的代码段,数据段,还有操作系统资源,比如打开文件或者一些信号量!
一个传统的进程就是一个单一的线程控制的如果进程含有多个线程控制,那么该进程就表现为同一时刻可以做多个任务!


多线程模型

在这里插入图片描述


M:1模型

也就是多个用户线程对一个内核线程!
在这里插入图片描述
这种模型的好处就是,对于用户来说,它看的多个线程在并行执行!
在实际来说,多个线程占用一个内核线程,这个意思就是,用户线程中有一个线程占用了cpu资源,那么其他的用户线程就不可以执行,只能进入等待状态了!


1:1模型

一个用户线程对于一个内核线程,假如内核线程和用户线程数量不匹配的话,那么就会开多内核线程和用户线程匹配起来
在这里插入图片描述
好处就是多个线程真正意义上实现了并发或并行执行;
缺点就是:内核开销很大!


不过实际上使用的线程模型也是1:1的比较多

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呋喃吖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值