【王道操作系统2:进程

2023年 10月 3日 65.3k 0

进程

当一个程序被加载运行时,就会为该程序分配一个进程(记录该程序的运行状态的)

进程包含的内容

这些内容都被放到一个数据结构中了,叫做PCB

PCB

  • PID
  • UID
  • 分配资源:内存、IO设备、文件描述符表
  • 运行情况:CPU使用时间、磁盘使用情况、网络流量等等(进程调度的根本)
  • 进程状态:五态模型、七态模型(包含了挂起态)
  • 处理器相关信息:PSW,PC等各寄存器,也是辅助进程调度的
  • 程序段

    程序自己的指令(比如:QQ运行起来,会执行自己内部的指令;PCB只是描述程序在内存中的状态的,真正程序运行还是靠执行程序的的指令的)

    数据段

    存放程序运行过程中产生的数据(比如:变量)

    总结

    进程是动态的,而进程实体是静态的

    进程特性

    image.png

    进程的五态模型

    image.png

    进程控制

    进程控制就是实现进程状态的转换,使用原语进行实现【原语使用两个特权指令实现的 - 开/关中断】

    进程创建

    image.png

    进程终止

    image.png

    阻塞唤醒

    image.png

    进程切换

    image.png

    进程间通信

    因为进程的隔离性,所以引入了进程间通信【多种通信方式本质上都是使用一块能够公共访问的空间】

    共享存储

    一个进程除了自己的虚拟地址空间外,还会申请一块共享区域【通过增加页表项/段表项,会将共享区域映射到自己独立的虚拟地址空间,然后可以进行访问】,两个进程只要申请的共享区域是同一块区域,就可以进行通信了 - 访问共享区域需要进行互斥访问

    image.png

    消息传递

    以Message为单位进行通信,发送/接收Message均由原语进行完成(Message 包含消息头、消息体;头中包含发送方PID,接收方PID,长度等信息)

    直接通信

    需要指明接收方的PID,指名道姓给谁

  • 发送方构造msg,然后使用send原语进行发送 send(接收方PID,msg)
  • 原语执行结束后,msg被放到内核中接收方PCB的消息队列中,等待被接收
  • 接收方调用receive原语进行接收,就是在自己的消息队列中找到某个人发来的消息 receive(发送方PID,msg)
  • 简介通信

    通过“信箱的方式”进行间接通信

  • 发送方构造msg,然后使用send原语进行发送 send(信箱,msg)
  • 原语执行结束后,msg被放到内核中的信箱中等待被接收
  • 接收方调用receive原语进行接收,就是从对应信箱中获取信息 receive(信箱,msg)
  • 管道通信

    一条管道是一个单向通信的道路,管道其实就是一个共享内存区域【循环队列】****

    注意:

  • 一个管道允许多个写进程,一个读进程
  • Linux下,允许多个写进程,多个读进程;读进程轮流进行读取
  • 管道通信与共享内存的区别:

    共享内存是申请一块区域,然后随意任何位置进行写入,读取的;而管道通信则是按顺序进行填充

    TCP/IP网络通信

    线程

    线程的出现主要是为了提高程序的并发度,进程在创建的时候向操作系统申请内存空间的操作非常耗时,而引入了线程的话,线程直接向进程索要空间,就提高了效率了

    线程的实现方式

    用户级线程 - 一对一

  • 优点:用户级线程的切换在用户态即可完成,不需要发生“变态 ”操作,效率高
  • 缺点:一个线程阻塞,整个程序都被阻塞了
  • image.png

    内核级线程 - 多对一

  • 优点:一个程序阻塞,不影响其他程序的运行
  • 缺点:需要变态,成本高
  • image.png

    多对多

  • 减少了内核级线程个数,减少了变态切换的次数
  • 同时保留了一个内核级线程可以在用户态下进行并发操作(切换着执行多个程序)
  • image.png

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论