操作系统之进程管理

目录

进程与线程

调度算法

进程通信方式

(1)管道

(2)消息队列

(3)共享内存

(4)信号量

(5)信号

(6)Socket

避免死锁

(1)互斥条件

(2)持有并等待条件

(3)不可剥夺条件

(4)环路等待条件


进程与线程

        进程,顾名思义,就是正在进行中的程序。而线程就是“进程中的进程”,一个进程可以包括多个线程,这些线程可以并发运行,共享地址空间和文件等资源。使用线程弥补进程的一些缺点,比方说多进程之间的数据共享问题、维护进程的系统开销大的问题等。当然线程也有缺点,线程崩了会连带同个进程中的线程一起崩。

        线程与进程的比较如下:

        ①进程是资源(包括内存、打开的文件等)分配的单位,线程是 CPU 调度的单位;

        ②进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;

        ③线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;

        ④线程能减少并发执行的时间和空间开销;

        其中第①点是线程与进程最大的区别,即线程是调度的基本单位,而进程则是资源拥有的基本单位

调度算法

        调度算法主要有两种类别:抢占式和非抢占式,区别在于抢占式的算法只让程序运行一段时间后挂起,而非抢占式的让程序运行直到阻塞。设计一个调度算法需要考虑到多种该因素:CPU利用率、系统吞吐量、周转时间、等待时间、响应时间等。

        进程调度的算法主要有6种:先来先服务、最短作业优先、高响应比优先、时间片轮转、最高优先级、多级反馈队列。

进程通信方式

        由于进程间的用户空间都是独立的,一般情况下无法通信,但内核空间是共享的,是通信不可绕行的桥梁。因此,基于内核空间,进程有6种通信方法,分别为管道、消息队列、共享内存、信号量、信号、Socket等。

(1)管道

        在Linux中的【|】 便是管道,能够实现前一个命令的输出作为后一个命令的输入,这是一种单向的传输方式。简单归简单,但是通信方式效率低,不适合进程间频繁地交换数据。所谓的管道,就是内核里面的一串缓存

https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/5-%E7%AE%A1%E9%81%93-pipe.jpg

(2)消息队列

         消息队列是保存在内核中的消息链表,通信双方一个往队列里塞消息,一个往队列里读消息,就是邮件往来一样。这种方式可以让通信双方频繁交换数据,但是也有明显的缺点,比如通信不及时,数据大小有限制等。实现消息的软件有kafkarabbit等。

(3)共享内存

        消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销。而共享内存就没有这个问题。顾名思义,共享内存就是不同程序的一部分虚拟内存映射到同一块物理内存,可以大大加快读写速度。

(4)信号量

        共享内存也不是完美的,可能会造成读写冲突问题,因此需要保护机制,使得共享的资源在某个时间内只能由一个进程访问。信号量就是这样一种机制。

        信号量是一个整形的计数器,通过P操作和V操作实现资源的互斥和同步。两个进程互斥访问共享内存,可以设置信号量初始为1,当进程访问资源时进行P操作,使得信号量-1,此时信号量为0,该进程成功占用资源 。当释放资源时进行V操作,信号量+1。

        也可以使用信号量实现多进程同步,初始信号量设置为0,保证进程A先于进程B执行。

(5)信号

        信号和信号量可以两个不同的概念,信号的作用是在异常情况下通知进程采取操作。比方说,在终端中,使用Ctrl+C就是发送一个SIGINT的信号,终止该进程。信号是进程间通信机制中唯一的异步通信机制,进程有3种方式处理信号,分别为执行默认操作、捕捉信号(定义一个函数去处理)、忽略信号。

(6)Socket

   上面的同时方式都是在本机环境下的通信方式,如果要实现互联网上的进程通信,就需要通过Socket套接字。

避免死锁

        在实现程序的互斥和同步方式中,除了信号量,还有加锁的方式。然而,这种方式可以会导致死锁的发生。

        简而言之,当两个线程都在加了锁,都在等对方释放锁,此时便形成了死锁。但是,死锁的发生是有迹可循的,必须同时满足这4个条件:①互斥条件;②持有并等待条件;③不可剥夺条件;④环路等待条件。

(1)互斥条件

        指的是多个线程不能同时拥有同一个资源,必须等待对方释放才能够进行占据。

https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4@main/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%AD%BB%E9%94%81/%E4%BA%92%E6%96%A5%E6%9D%A1%E4%BB%B6.png

(2)持有并等待条件

        指的是线程在申请资源时,等待这个资源被释放的过程中不会释放已持有的资源。

https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4@main/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%AD%BB%E9%94%81/%E6%8C%81%E6%9C%89%E5%B9%B6%E7%AD%89%E5%BE%85%E6%9D%A1%E4%BB%B6.png

(3)不可剥夺条件

           指的是线程在释放资源之前,资源不能被其他线程所剥夺。

https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4@main/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%AD%BB%E9%94%81/%E4%B8%8D%E5%8F%AF%E5%89%A5%E5%A4%BA%E6%9D%A1%E4%BB%B6.png

(4)环路等待条件

        指的是,在死锁发生的时候,两个线程获取资源的顺序构成了环形链。

https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4@main/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%AD%BB%E9%94%81/%E7%8E%AF%E8%B7%AF%E7%AD%89%E5%BE%85%E6%9D%A1%E4%BB%B6.png

        避免死锁问题就只需要破环其中一个条件就可以,最常见的并且可行的就是使用资源有序分配法,来破环环路等待条件

        内容来源之小林coding的学习总结,更详细的内容可访问小林coding (xiaolincoding.com)

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值