操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型)

这篇具有很好参考价值的文章主要介绍了操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

一.进程的基本概念

  • 冯诺依曼体系的计算机在运行时,内存中会预加载许多程序(数据+运算指令集),然而CPU同一时刻只能执行一个程序(多个程序竞争CPU资源),此时就需要操作系统对内存中的诸多程序进行管理,让CPU资源得到合理的分配,于是便有了进程的概念:

    • 进程:描述程序的结构体对象(PCB结构体)和其所指向的程序(数据与运算指令集)
    • 在Linux中PCB结构体被命名为task_struct
  • 进程的PCB结构体在操作系统中会被组织进各种数据结构,同一个PCB结构体对象会同时位于多个数据结构中,比如:操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

  • 操作系统对进程进行管理是通过对PCB结构体对象形成的数据结构进行增删查改实现的

  • Linux中进程的PCB通过PID(一个数字)唯一地标识:操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

进程间的基本关系:父子关系

  • Linux系统中,一个进程可以通过库函数fork()创建子进程
    • pid_t fork(void);
    • 一个进程通过fork函数创建子进程后,父子进程共享fork()函数所在的代码语句以及其后的代码段
    • fork函数返回值说明:若子进程创建成功,frok函数在父进程中返回子进程的PID,在子进程中返回0,若子进程创建失败,则fork函数在父进程中返回-1
    • 子进程刚被创建时,会共享父进程的所有数据,后续子进程对于父进程的数据会进行写时拷贝
    • 根据父子进程中fork()返回值的不同,我们便可以令父子进程后续执行不同的代码段
int main()
{
  printf("hello world\n");
  size_t childPid = fork();//创建子进程
  if(childPid == 0)
  {
    //子进程执行的代码段
    while(1)
    {
       printf("我是子进程,Pid:%d,PPid:%d\n",getpid(),getppid());
       sleep(1);
    }
  }
  else
  {
    //父进程执行的代码段
    while(1)
    {
       printf("我是父进程,Pid:%d,PPid:%d\n",getpid(),getppid());
       sleep(1);
    }
  }

  return 0;
}

操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

  • 运行状态:操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构
    操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构
  • 一个父进程可以有多个子进程,而一个子进程只有唯一的父进程,在操作系统中,依据父子进程的关系,PCB结构体对象会形成一个树形数据结构
  • 总之,在操作系统中,PCB结构体对象处于众多数据结构交织成的网中

二.进程状态

  • 进程状态总览(Linux操作系统):操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

(1)进程的运行状态R

  • CPU一次只执行一个进程,一个CPU对应唯一一个运行队列(Linux中实质上是一个哈希桶),处于运行状态的进程的PCB结构体会被链入运行队列中,操作系统会依次调度运行队列中PCB结构体所指向的程序,将其交给CPU执行运算.
  • 进程的PCB会记录该进程的调度优先级(一个整数),进程的调度优先级会影响其在运行队列中的位置.
  • Linux中的进程优先级分为140个等级,其中0级到99级分给实时进程,100级到139级分给非实时进程
    • 140个等级对应140条运行队列分支(140条运行队列分支以哈希桶的结构进行组合)
    • 进程task_struct运行队列中的位置由其动态优先级决定操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

Linux进程调度的大O(1)算法数据结构模型(运行队列哈希桶):

操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-618451.html

  • 在Linux内核中还有一个160个比特位大小的位图用于记录run哈希桶中的各个队列是否为空,一旦run哈希桶中的队列都为空,就交换指向run和tem两个数组的指针,然后继续执行进程调度
  • 得益于上图所示的数据结构,Linux操作系统无须对各个task_struct结构体进行依据优先级的快速排序,同时可以在任意时刻以O(1)的时间复杂度快速定位某个优先级的进程所在的分支运行队列(同时进行O(1)的队列判空),task_struct结构体对象的入队出队操作也是O(1)的时间复杂度,实现了Linux操作系统高效的进程调度机制

进程的运行时间片

  • 每个进程都有一个运行时间片(比如20ns),进程的时间片决定了CPU对其执行运算的单次最长时间,一个进程在CPU中完成了一个时间片的运算后就会暂时退出运行队列等待下一次调度
  • 有了时间片的限制,在一定时间段内(比如20ms),所有在运行队列中的进程都会被CPU执行运算一次,形成了进程的并发执行,CPU资源因此得到了合理的分配充分地使用
  • 我们感觉到电脑同时运行着多个程序,其实本质上是CPU在根据进程时间片极速地遍历执行着每一个进程而形成的进程并发的结果.

(2)进程的睡眠状态(S和D)

  • Linux系统中进程的睡眠状态对应着操作系统学科理论中的进程阻塞状态
  • CPU的运算速度数据流动速度是不对等的,因此进行数据交互的进程时常会处于等待反馈信息的状态
  • 当一个进程处在等待某种资源的状态时,其PCB结构体就会退出运行队列进入到阻塞队列中,比如某个进程需要键盘输入数据,这时它就会进入到键盘的阻塞队列中
  • 操作系统中,阻塞队列的数量是不确定的,系统中有多少种通信过程,就存在多少种阻塞队列:操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构
  • Linux中位于阻塞队列中的进程处于可中断睡眠状态(S状态),当系统内存不足时,操作系统会将一些处于阻塞队列中的进程对应的程序(数据和指令集)暂时存放到swap磁盘分区中,进程进入挂起状态
  • Linux操作系统在内存不足时,还会选择性地杀死一些位于阻塞队列中的进程,如果某个进程执行的是非常重要的任务(比如向磁盘中写入重要数据时,等待磁盘反馈),那么就需要将该进程标记为不可中断睡眠状态(D状态),处于不可中断睡眠状态的进程在被执行结束前不会相应操作系统的请求

(3)进程的僵尸状态和死亡状态

  • Linux系统中,当一个父进程的子进程终止时,该子进程就会进入僵尸状态(Z状态),Z状态的进程会等待其父进程来回收其PCB结构体中的终止信息(以便判断它是正常终止还是异常终止),只有当父进程处理了它的终止信息,子进程才会由Z状态进入死亡状态(X状态),这时,操作系统才会将子进程所占用的内存资源完全回收
  • 如果父进程一直不处理僵尸子进程的终止信息,那么僵尸子进程PCB结构体以及相关数据就会一直留在内存中,造成内存泄漏
  • 如果父子进程中的父进程率先终止了,其子进程就会被托孤给操作系统,成为操作系统的子进程,这样的进程称为孤儿进程
    操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型),青菜的Linux专栏,linux,算法,数据结构

到了这里,关于操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2.3为什么要共享写时拷贝 1.2.4 什么时候发生写时拷贝 1.3 fork函数返回值详解 1.3.1引入fork返回值的作用 1.3.2 fork返回执行逻辑剖析

    2024年03月21日
    浏览(44)
  • 操作系统课程设计(作业调度、内存管理、进程调度、进程阻塞等)

    资源下载: https://download.csdn.net/download/fufuyfu/85811450 操作系统是计算机系统配置的基本软件之一。它在整个计算机系统软件中占有中心地位。其作用是对计算机系统进行统一的调度和管理,提供各种强有力的系统服务,为用户创造既灵活又方便的使用环境。本课程是计算机及

    2024年02月03日
    浏览(33)
  • 操作系统实验(进程调度)

      1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。   2.1设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。   2.2建立进程就绪队列。   2.3编制两种进程调度算法:优先权调度

    2024年02月06日
    浏览(31)
  • 【操作系统】进程调度

    目录 调度的概念 调度目标     所有系统     批处理系统     交互式系统     实时系统 调度算法     非抢占式调度算法         先来先服务         最短作业优先         非抢占式优先级调度     抢占式调度算法         最短剩余时间优先         轮转

    2024年02月04日
    浏览(31)
  • 操作系统与进程调度

    操作系统是一组做计算机资源管理的软件的统称,我们在日常生活常接触到的操作系统有: windows、IOS、Android、鸿蒙,以及Linux系统 等等,那么 操作系统是什么?计算机是如何运行的? 计算机是由软件、硬件相互配合工作;事实上,操作系统可以看做是介于软硬件之间的一组软

    2024年02月05日
    浏览(49)
  • 【操作系统核心概念】进程管理和进程调度

    本文主要讲的是操作系统的一些核心概念, 主要讲解 进程管理和进程调度 的问题, 当然学习完本篇并不会让你能从零打造一个操作系统, 而只是让读者有了对操作系统核心概念的基本认识. 关注收藏, 开始学习吧🧐 操作系统是一组做计算机资源管理的软件的统称 , 其本质上也

    2024年02月12日
    浏览(51)
  • 「 操作系统 」聊聊进程调度算法

    图文并茂!谈谈进程调度那些算法 Cone 进程调度/页面置换/磁盘调度算法 xiaolinCoding 图解经典的进程调度算法 飞天小牛肉 进程调度算法是操作系统中非常重要的一部分,它决定了操作系统中各个进程的执行顺序和时间片。在单核CPU下,任何时刻都只可能有一个程序在执行,比

    2024年02月04日
    浏览(47)
  • 操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。 2. 按照下表

    2024年02月06日
    浏览(29)
  • 操作系统课程设计进程调度模拟

    程序下载链接:https://download.csdn.net/download/m0_56241309/86945709 进程调度模拟 摘要 :进程调度是操作系统中必不可少的一种调度,在3中OS中都无一例外地配置了进程调度。此外,它也是对系统性能影响最大的一种处理机调度,在操作系统中具有十分重要的地位。本次模拟,旨在全

    2024年02月08日
    浏览(27)
  • 【操作系统之进程调度算法习题】

    在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短作业优先调度算法。现有如下所示的作业序列, 注意 1.具有三道作业的批处理系统指的是内存最多能有3个作业; 2.表格样式是考试时候的格式,练习时候也按这个格式练习各作业的周

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包