乐趣区

关于linux编程:进程概念

冯诺依曼体系结构

  • 大多数的计算机、服务器等都遵循冯诺依曼体系结构
  • 存储器用于快慢设施之间的缓冲作用,进步零碎的效率(内存能够事后装载数据)

    • 解决数据时,必须先将数据预装载到内存中(一次性装载多条数据,由操作系统实现)
  • 在硬件和数据层面上:CPU 只和内存进行交换,外设也只与内存进行交换。
  • 寄存器不仅只存在于 CPU 中,其余的外设中也存在。
  • 各硬件之间是用总线进行链接(IO 总线、系统总线)

操作系统概念

  • 操作系统本质上是一款专门搞治理的软件。
  • 操作系统包含内核(过程治理、文件治理、驱动治理)和其余程序(库函数、shell 程序等)

过程管制块 PCB

  • PCB:为了便于零碎形容和治理过程的运行,内核为每个过程专门创立的一个构造体对象。(一个 PCB 对应一个过程)
  • PCB 是过程实体的一部分,用于存储过程所需的所有信息。
  • CPU 在执行过程时,是找的 PCB,再通过 PCB 去调用程序代码和数据。
  • Linux 中 PCB 的构造体是 struct task_struct{}
  • 零碎中 PCB 是采纳双链表的模式链接起来的。
  • PCB 次要存储的信息:

    • 标示符:形容此过程的惟一标示符,用于辨别其余过程(PID 等)
    • 状态:休眠状态 S、运行状态 R
    • 如果过程是前台运行时,则会标识为 R+
    • 如果过程是后盾运行时,则会标识为 R
    • 优先级
    • 程序计数器(PC 指针):保留程序中行将被执行的下一条指令的地址。
    • 内存指针:程序代码和过程相干的数据指针,和其余过程共享的内存块指针
    • 上下文数据:过程执行时处理器的寄存器中的数据。

      • 例如:以后过程被打断,去执行另一个过程,当另一个过程执行完后要如何回到之前过程被打断的地位呢?上下文数据就是用来保留这类数据。
      • 上下文数据是保留在 PCB 中的。
    • IO 状态信息

查看存储过程信息的文件

  • 过程信息能够通过 /proc 零碎文件夹查看(文件夹的名称就是该过程的 PID)

过程状态

过程的 5 种状态

  • 就绪态 R:期待被运行。(期待 CPU 调度)
  • 运行态 R:正在运行。(占用 CPU)(运行态蕴含就绪态,所以运行态能够同时有多个)
  • )僵尸态 Z:父过程还在运行,子过程完结还未被回收时,子过程相干信息任然被保留着。
  • 期待态(休眠态)(浅度睡眠 & 深度睡眠):期待肯定条件进入就绪态,期待态下即便给它 CPU 也无奈运行。

    • 浅度睡眠 S:期待时能够被唤醒(即便没有等到某个条件,收到信号也能够被唤醒)
    • 深度睡眠 D:期待时曾经不能被唤醒了,只有等到某个条件能力主动唤醒(收到信号也不能被唤醒),并且该过程不能被杀死,即便是操作系统也不行。
  • 进行态 T:过程只是被临时进行了,还是能够复原的(不是过程完结了)
  • 死亡态 X:过程死亡,这个状态只是一个返回状态,工作列表中是看不到这个状态的。

僵尸过程

  • 子过程先于父过程完结。子过程曾经完结了,然而父过程还未帮子过程收尸(即父过程没有读取到子过程退出时返回的代码),这一个子过程就被称为僵尸过程。
  • 回收僵尸子过程办法一:

    • 父过程能够通过应用 wait 或 waitpid 来显示回收子过程,并且获取子过程退出的状态。
  • 回收僵尸子过程办法二:

    • 父过程本人完结时,会主动回收子过程的资源。

    孤儿过程

  • 父过程先于子过程完结,此时子过程就变成了孤儿过程。
  • Linux 零碎规定:所有的孤儿过程都主动成为一个非凡过程(过程 1,也就是 init 过程)的子过程。

过程优先级

优先级的计算

  • Linux 中能够应用 ps -la 显示零碎过程 PID 和优先级
  • Linux 中理论优先级 = PRI + NI(在执行这个算法时,PRI 始终都是最初始的优先级)

    • PRI 代表这个过程的优先级,值越小越先执行。
    • NI 代表这个过程的 nice 值(它是优先级的修改值,取值范畴 -20 ~ 19,默认为 0)
    • 所以调整过程优先级是调整 nice 值。

优先级的更改

  • 终端中应用命令 sudo top 进入更改状态
  • 进入 top 后按 r 进入输出状态
  • 输出过程 PID 而后回车
  • 再输出新的 nice 值即可

过程相干性质

  • 竞争性:CPU 资源很少,而过程较多,所以过程之间是具备竞争性的,为了高效实现工作,正当分配资源,于是有了优先级。
  • 独立性:多过程运行是互相独立的,独享各种资源,过程之间互不烦扰。
  • 并行:多个过程在多个 CPU 下同时运行。
  • 并发:多个过程在同一个 CPU 下采纳过程切换的形式,让多过程在宏观上实现同时运行。

环境变量

  • 环境变量本质就是一个零碎级别的全局变量。
  • PATH:指定命令的默认搜寻门路
  • 将门路导入 PATH 环境变量:echo PATH=$PATH:门路
  • HOME:指定用户的主工作目录(即用户登录到 Linux 时进入的默认目录)

环境变量相干命令

  • echo $ 环境变量(查问相干环境变量)(echo $? 返回最近一次程序执行后的返回值)
  • env(显示所有环境变量)
  • unset(删除环境变量)
  • set(显示本地定义的 shell 变量和环境变量)(本地变量只在本过程中无效)
  • export(导入新的全局的环境变量)

main 函数带的参数(argv、argv、envp)

  • argc:命令行参数个数
  • argv:命令行参数列表
  • envp:环境变量

过程地址空间

  • 留神:过程地址空间不是理论的物理内存,而是映射出的虚拟地址(不同过程的虚拟地址是雷同的,然而理论映射的物理内存是不同的地址)
  • 每个过程都有本人的过程地址空间和对应的页表(用于示意映射关系)
  • 过程地址空间本质是物理内存中的一种内核数据结构(mm_struct)

应用过程地址空间的劣势

  • 防止了野指针的呈现(野指针在页表中没有映射)
  • 防止零碎级别的越界拜访,页表只会映射以后过程的物理内存,不会映射到其余地址。
  • 对立过程的排布,即所有过程在过程地址空间中排布形式都是雷同的,并且空间范畴也是雷同的。
  • 每个过程都相当于独立进去的,更好的实现过程独立及正当应用内存空间。
退出移动版