进程与线程

进程与线程总结

1.什么是进程?

进程其实是一个运行中的程序,从操作系统的角度来看,进程是一个pcb,是对运行程序的描述,在linux下,这个pcb其实是一个task_struck{…}结构体

2.什么是线程?

线程是进程的一条执行流,是进程的一个实体,一个进程中可以有多条线程,同一个进程中的线程共享进程中的大多数资源,因此,线程可以说是一个轻量级进程。

3.进程与线程的区别

根本区别:

进程是资源调度和分配的基本单位;
线程是cpu调度的基本单位;

从资源开销方面讲:

进程有自己独立的代码和空间,进行进程间切换是开销比较大;
同一类线程共享进程的资源,开销比较小

从内存分配方面讲:

进程中的资源和地址空间是独立运行的
同一进程中的线程共享进程中的资源与空间

4.多进程与多线程

多进程:

同时运行多个程序。比如:qq,微信,浏览器同时运行;

多线程:

同一时刻执行多条线程。比如说:在浏览器上一边下载视频,一边看视频;

5.并发与并行

并发:

当一个进程中有多条线程运行时,如果操作系统只有一个cpu,根本不可能同时运行一条以上线程,只能把cpu运行时间分为多个时间段,再把这些时间段分配给各个线程去执行,这就是并发。

并行:

当一个系统有一条以上的cpu时,线程的运行有可能非并发,当一个cpu执行一条线程时,另一个cpu执行另一条线程,两个线程互不抢占cpu资源,可以同时进行,我们称这种情况为并行。

6.线程安全

概念:

就是线程对临界资源的访问是安全的。

实现:

通过同步与互斥实现的。
同步:使线程按照某一秩序访问临界资源,保证访问的合理性。
互斥:使进程在同一时间内只有一个访问资源,保证访问的安全性。

同步的实现:

通过条件变量实现。条件变量提供了一个等待队列,以及使线程阻塞或唤醒的接口,程序员根据流程控制,使线程在不满足资源获取或访问的情况下阻塞,在满足访问条件下唤醒阻塞线程。

互斥的实现:

互斥主要通过互斥锁来实现的。互斥锁的本质是一个0/1计数器,它标记了临界资源的两种访问状态,当有一个线程在访问临界资源时,互斥锁将临界资源置为不可访问状态,而当这个线程不再访问时,互斥锁就将临界资源置为可访问状态,这样其他线程就可以争抢该资源。

7.死锁

概念:

死锁描述的是同一组进程中,一个进程无限等待被同一组进程中的另一进程所占有的资源,导致这个处于等待中的程序流程无法推进,出现程序卡死的状态。

产生死锁的四个必要条件

互斥条件:一份资源每次只能分配给一个进程所使用

请求与保持条件:进程在申请新资源的同时保持对原有资源的占有。也就是说,进程并不是一次性地得到所有资源,而是得到一部分后,继续申请其他资源。

不可剥夺条件:资源申请者不能强行从资源占有者手中夺取资源,资源只能有占有者主动释放。

环路等待条件:存在一个进程等待队列 {p1,p2…pn},其中p1等待被p2占有的资源,p2等待被p3占有的资源…pn等待被p1占有的资源,形成一个进程等待环路。

预防死锁:

破坏产生死锁的必要条件,加解锁顺序一致,如果无法解锁则释放已有的锁。

避免死锁:

银行家算法,死锁检测算法

8.线程池

概念:

线程池是多线程的一种处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

组成:

线程池管理器:用于创建和管理线程池。
工作线程:线程池中的线程
任务接口:每个任务都必须实现的接口,以便于工作线程对任务的调度执行。
任务队列:用于存放一些没有处理的任务。提供一种缓冲机制。

功能作用:

节省了大量线程频繁创建和销毁所带来的的时间成本上的开销。
避免了资源无限使用导致资源耗尽的风险。

9.进程间通信

进程间通信方式有:管道,消息队列,共享内存,信号量。

原因:

因为进程之间具有独立性(每个进程都有自己独立的虚拟地址空间),因此它们无法进行直接通信,所以操作系统提供了进程间的通信方式来实现进程间通信。

管道:

内核中的一块缓冲区,多个进程通过进入同一个管道(同一块缓冲区)就可以实现通信。

管道分类:匿名管道/命名管道

依据:根据有没有标识符进行区别
匿名管道没有标识符,命名管道含有标识符。

管道特性:

1.半双工通信(通信双方都可以发送信息,但不能同时发送,这种通信方式是一方发送另一方接收,过一段时间再反过来)
2.读写特性(管道中没有数据则read阻塞/管道中数据满了则write阻塞/关闭所有读端write会出发异常导致进程退出/关闭所有写端read会返回0不再阻塞)。
3.自带同步与互斥。
同步:通过条件判断实现对临界资源的访问合理性。
互斥:通过唯一访问实现对临界资源的访问安全性。
4.生命周期随进程

消息队列

概念:

内核中的一个优先级队列,多个进程通过访问同一个队列,进行添加或获取节点的方式实现进程间通信。

流程:

1.创建消息队列(在内核中创建一个优先级队列)
2.进程向消息队列里添加/删除节点
3.销毁消息队列

消息队列特性:

自带同步与互斥
生命周期随内核

共享内存:

本质原理:

在物理上开辟一块内存空间,多个进程可以将同一块内存空间映射到自己的虚拟地址空间,通过自己的虚拟地址访问这块空间,通过这种方式实现进程间通信。

共享内存的流程:

1.创建共享内存–在物理上开辟空间
2.进程将共享内存映射到自己的虚拟地址空间
3.基本的操作都可以在这块空间上完成
4.解除虚拟地址空间与内存空间的关系
5.释放共享内存资源

共享内存特征:

1.最快的进程间通信方式
2.生命周期随内核
3.共享内存并没有自带同步与互斥,光使用共享内存进行进程间通信是存在安全隐患的。

信号量:

实现进程间的同步与互斥。

本质:

信号量的本质是内核中的一个计数器+pcb等待队列。

具体实现:

信号量实现同步:

通过计数器对资源计数;计数>0表示进程可以直接获取资源;计数<=0表示进程不能直接获取资源,进程通过等待队列接口进入等待队列,等有资源再唤醒进程。

信号量实现互斥:
只需保证信号量的资源不会大于1就可以实现了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值