• 进程、线程、协程
    • 进程间通信方式
    • 进程调度算法
    • 零拷贝
    • 缺页中断
  • IO 模式

  • 常用命令

    • 查看前 10 的 IP

进程、线程与协程

  • 进程:

系统进行资源分配和调度的基本单位,是应用程序运行的载体。
进程是一个抽象的概念,一般由程序、数据集合和进程控制块三部分组成。
程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
多进程中的数据天然是隔离的,不存在并发的问题;但是创建线程时间上面的开销很慢

  • 线程:

线程是进程的一个实体,一个进程可以由多个线程,是 CPU 调度与分派的基本单位,由线程ID、程序计数器、寄存器集合和堆栈组成,共享进程的内存空间。
它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

  • 协程

轻量级的线程,一个线程拥有多个协程;协程的暂停完全由程序控制,发生在用户态,没有内核切换的开销

  1. 线程的切换由操作系统负责调度,协程由用户自己进行调度
  2. 线程 Stack 默认为 1M,协程更加轻量,接近 1K
  3. 由于在同一个线程上,避免的竞争关系而使用锁
  4. 适用于被阻塞且需要大量并发的场景。但不适合大量计算的多线程

    进程间通信(IPC,InterProcess Communication)

  • 管道

半双工
只用于父子进程,兄弟进程
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

  • 有名管道(FIFO)

有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信,因此,通过有名管道不相关的进程也能交换数据

  • 信号(Signal)

信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。
如果该进程当前并未处于执行状态,则该信号就有内核保存起来,知道该进程回复执行并传递给它为止。
如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消是才被传递给进程。

  • 消息(Message)队列

消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。

  • 共享内存(share memory)

多个进程可以可以直接读写同一块内存空间,是最快的可用 IPC 形式

  • 信号量(semaphore)

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步

  • 套接字(socket)

让不在同一台计算机但通过网络连接计算机上的进程进行通信。

进程与线程的上下文切换

进程切换分两步
1.切换页目录以使用新的地址空间。
2.切换内核栈和硬件上下文。

线程的上下文切换基于 CPU 时间片的分配,切换的虚拟内存空间是一样的。
分配算法:轮询,短作业优先

死锁

一组进程,互相申请被其它进程所占有的资源,而自己不释放已获得资源的一种永久互相等待状态,若无外力作用,它们将无法推进下去。

死锁发生的必要条件

必要条件就是当系统发生死锁时候,下面的情况会一定存在:

  • 互斥:某个时间段内一个资源只能被一个进程所持有,其它进程想要获取只能等待
  • 请求与保持:一个进程因为请求其它资源而阻塞,而对已获得的资源保持不放
  • 不可剥夺:进程已获得的资源,在未完全使用完之前,不能被强行剥夺,只能自己释放
  • 循环等待:若干个进程之间形成头尾相接的环形等待资源的关系

    如何避免死锁

  • 资源预分配,进程运行前先获取全部所需资源,满足条件再运行(避免请求与保持)

  • 当进程占有独占资源又申请其它独占资源而无法满足时,释放已有资源(避免不可剥夺)
  • 资源有序分配,按照相同顺序访问资源(避免循环等待)

    银行家算法

    分配资源前,先判断系统是否安全,安全再进行资源分配
    如下图所示,5 个进程 P0~P5 所需资源 MAX 以及已分配资源 Allocation
    系统根据资源可分配情况 Available,判定各个进程所需资源 Need,得到一个资源分配的安全序列:P0、P3、P4、P0、P2
    操作系统 - 图1