操作系统进程线程相关知识总结

操作系统

1.进程线程基本知识

  • 进程:我们编写的代码只是一个存储在硬盘中的静态文件,通过编译后就生成二进制可执行文件,当我们运行这个可执行文件后,他会被装载到内存中,接着CPU会执行程序中的每一条指令,那么这个运行中的程序就被称为进程。 可简单理解为:进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的基本单位。

  • 并发和并行:并发可以理解为一个处理器核心交替处理多个任务,并行可以理解为多个处理器核心同时处理多个任务。

  • CPU可以从一个进程切换到另外一个进程,在切换之前必须要记录当前进程中运行的状态信息,已备下次切换回来可以恢复执行。

  • 进程的状态:一个进程至少具备三种状态 即运行状态、阻塞状态、就绪状态。当然还有另外两个基本状态创建状态和结束状态。

    • 运行状态(Running):该时刻进程占用CPU
    • 就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行
    • 阻塞状态(Blocked):改进程正在等待某一事件的发生(如等待输入输出操作的完成)而暂时停止运行,这时,即使给他CPU控制权,也无法运行
    • 创建状态(New):进程正在被创建时的状态
    • 结束状态(Exit):进程正在从系统中消失的状态
  • 如果存在大量阻塞进程占用着物理内存空间,那么存在浪费的情况,所以将阻塞状态的物理内存换出到磁盘中,需要在次运行的时候,在从硬盘换入到物理内存。

    • 阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现
    • 就绪挂起状态:进程在外存(硬盘),但只要进入内存,立刻运行
  • 进程的控制结构(PCB):PCB是进程存在的唯一标识

  • PCB具体包含的信息

    • 进程描述信息 :进程标识符、用户表示符

    • 进程控制和管理信息:进程当前状态、进程优先级

    • 资源分配清单:有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的I/0设备信息

    • CPU相关信息:CPU中各个寄存器的值,当进程被切换时,CPU的状态信息都会被保存在相应的PCB中,以便进程重新执行时,可以从断点处继续行

  • 每个PCB是如何组织的呢?

    通常是通过链表的方式进行组织,把具有相同状态的进程链在一起,组成各种队列。

    eg:所有就绪状态的进程链在一起,称为就绪队列;所有因等待某事件而处于等待状态的进程链在一起就组成了各种阻塞队列

  • 进程的上下文切换

    各个进程之间是共享CPU资源的,在不同的时候进程之间需要切换,让不同的进程可以在CPU执行,那么这个进程切换到另一个进程运行,称为进程的上下文切换。

  • 线程:线程是进程当中的一条执行流程,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

  • 协程:协程是一种用户态的的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈。

  • 调度:非抢占式调度算法 挑选一个进程,然后让该进程运行直到被阻塞或者直到该进程退出彩绘调用另外一个进程

    ​ 抢占式调度算法 时间片机制

  • 调度原则:

    • 原则一:为了提高CPU利用率,在这种发送I/O事件导致CPU空闲的情况下调度程序需要从就绪队列中选择一个进程来运行
    • 原则二:需要提升吞吐率,调度程序要权衡长任务和短任务进程的运行完成数量
    • 原则三:如果进程的等待时间很长而运行的时间很短,那周转时间就很长,这不是我们所期望的,调度程序应该避免这种情况的发生。
    • 原则四:就绪队列中进程的等待时间也是调度程序所需要考虑的原则
    • 原则五:对于交互式比较强的应用,响应事件也是调度程序需要考虑的原则

    针对上面的五种原则,总结如下:

    1. CPU利用率:调度程序应该确保CPU是始终匆忙的,这可提高CPU的利用率;
    2. 系统吞吐量:吞吐量表示的是单位事件内CPU完成进程的数量,长作业的进程会占用较长的CPU资源,因此会降低吞吐量,相反,短作业的进程会提升系统吞吐量
    3. 周转时间:周转时间是进程运行和阻塞时间总和,一个进程的周转时间越小越好;
    4. 等待时间:这个等待时间不是阻塞状态的时间,而是进程处于就绪队列的时间,等待的时间越长,用户越不满意;
    5. 响应时间:用户提交请求到系统第一次产生响应所花费的时间,在交互式系统中,响应时间是衡量调度算法好坏的主要标准;
  • 调度算法:

    • 先来先服务调度算法
    • 最短作业优先调度算法
    • 高响应比优先调度算法
    • 时间片轮换调度算法
    • 最高优先级调度算法
    • 多及反馈队列调度算法

2.进程间通信

  1. 管道:

    1. 匿名管道:顾名思义,没有名字标识,是特殊文件只存在于内存,没有存在于文件系统中,shell中的"|"竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,只能适用于存在父子关系的进程间通信。
    2. 命名管道:突破了匿名管道只能在亲缘关系进程间的通信限制,使用前提是需要创建一个类型为管道的设备文件,那么毫无关系的进程都可以通过这个设备文件进行通信。

    管道写入的数据都还存在内核中,遵循先入先出原则。

  2. 消息队列:消息队列克服了管道通信的数据是无格式的字节流问题,是一个保存在内核中的消息链表,消息队列通信的速度不是最及时的,毕竟每次数据的写入和读取都需要经过用户态和内核态之间的拷贝过程。

  3. 共享内存:共享内存可以解决消息队列通信中用户态和内核态之间数据拷贝过程带来的开销,它直接分配一个共享空间,每个进程都可以直接访问,就像访问进程自己的空间一样,大大提高了通信的速度,享有最快进程间通信方式之名,带来的问题是多进程竞争同个共享资源会造成数据错乱。

  4. 信号量:用来保护共享资源,确保任何时刻只能有一个进程访问共享资源,这种方式是互斥访问,信号量不仅可以实现访问的互斥性,还可以实现进程间的同步P操作与V操作。

  5. 信号:信号是进程间通信机制中唯一的异步通信机制,进程有三种方式响应信号

    • 执行默认操作
    • 捕捉信号
    • 忽略信号

    信号在内核和应用进程之间进行交互

  6. Socket:不同主机之间通信,使用Socket通信,Socket三种常见的通信方式

    • 基于TCP协议的通信方式
    • 基于UDP协议的通信方式
    • 本地进程间通信方式

3.多线程同步

  • 互斥:由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区,它是一个访问共享资源的代码片段,一定不能给多线程同时执行;保证一个线程在临界区执行时,其他线程应该被阻止进入临界区。

  • 同步:所谓同步,就是并发进程/线程在一些关键点上可能需要等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步

  • 为了实现进程/线程间正确的协作,操作系统必须提供实现进程协作的措施和方法,主要的方法有两种:

    • 锁:加锁、解锁等操作
    • 信号量:P、V操作
  • 死锁:两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么可能会造成两个线程都在等待对方释放锁,这些线程会一直等待,就没办法继续运行,这种情况就是死锁。

  • 避免死锁问题的发展:使用资源有序分配法来破坏环路等待条件

    eg:两个线程都是先获取A资源然后获取B资源
    
  • 悲观锁、乐观锁、互斥锁、自旋锁、读写锁

    • 互斥锁加锁失败后线程会释放CPU,给其他线程
    • 自旋锁加锁失败后,线程会忙等待,直到它拿到锁

    所以如果你能确定被锁住的代码执行时间很短,不应该选互斥锁,应该使用自旋锁;当加锁失败时,互斥锁用线程切换来应对,自旋锁则用忙等待来应对。

    • 读写锁:读写锁适用于能明确区分读操作和写操作的场景

    原理:当写锁没有被线程持有时,多个线程可以并发的持有读锁,读锁是用于读取共享资源的场景

    ​ 当写锁被线程持有后,读线程的获取读锁会被阻塞,而且其他写线程的获取写锁的操作也会阻塞

    公平读写锁:简单理解为用队列把获取锁的线程进行排队

    • 悲观锁:前面提到的互斥锁、自旋锁、读写锁都是悲观锁,多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问资源前上锁
    • 乐观锁:先修改完共享资源在验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,操作完成;如果发现有其他线程已经修改过这个资源,就放弃本次操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值