进程的调度

操作系统是一个搞管理的软件,还要管理很多其他的东西。
内存管理,文件管理,设备管理。。。。进程管理

进程和任务实际上是一个意思。都是一系列程序,完成任务的模样。

但是进程和可执行文件(文件名.exe)不一样

可执行文件是静态的,躺在硬盘上,但是任务管理器中的进程是动态的
是被加载到内存中的.

一个可执行程序是一个静态的,当我们双击运行的时候,操作系统就会把这个可执行文件中的关键信息加载到内存中,并且开始运行里面的代码,就形成了一个进程
可执行文件和进程之间的关系!

进程管理.一个操作系统上,同时跑着这么多进程~
操作系统就需要把他们都安排明白了~~
管理:
1.先描述:使用一个类/结构体,把这个东西有啥特征,都表示出来
2.再组织:使用一个数据结构,把很多个这样的 对象/结构体 给整理到一起~~

进程管理是操作系统内核的功能         
操作系统优势C语言实现的        C语言的结构体就是一个低配的类.


PCB(进程控制块)就是一个结构体 这个结构体就包含了一些表示进程的核心信息.

操作系统内核中,就把若干个PCB串成了一个双向链表

PCB里面有啥?(最好的办法还是看看操作系统内核的源码)->不好找


pid ->进程的身份标识(学号).


内存指针~操作系统要把一些必要的数据加载到内存中
例如:有些要执行的指令(代码)
有些是运行时以来的数据

文件描述符表 表示了当前进程都打开了哪些文件~~
在代码中打开一个文件fopen
就会在进程的文件描述符表里给这个文件分配一个表项
每个元素就代表一个打开的文件,对应的数组下标就是"文件描述符".


上述描述了了进程持有哪些系统的资源~
也认为 进程 是操作系统中"志愿分配"的基本单位.


进程中还有一组比较关键的属性~~用来实现进程的调度~-----调度本质,当前计算机CPU是有限的,但是进程的数量是比较多的~~狼多肉少
需要尽可能的公平分配,就需要合理的调度. CPU就轮流使用,CPU的轮转速度,其实是非常快的,CPU的主频是1.9GHz,1秒有19亿个时钟周期----为什么需要调度进程~

因此,认识感知不到这样的轮转~站在宏观的角度来看,就好像这些进程都在同时执行一样~但是微观上并不是同时,而是"轮流"的方式占用CPU执行~
这就是并发式执行-----宏观上同时执行,微观上不是同时执行

由于CPU上有多个核心,每个核心上都可以跑一个进程,某一时刻就是在两个CPU核心上同时执行的.
并行式执行------宏观上同时执行,微观上也是同事执行


1.进程的优先级
对于进程来说有很多状态:
其中最典型的就是:
就绪状态: 进程是准备就绪的,随时可以上CPU执行.
阻塞状态: 进程在等待某个任务完成(读写磁盘),完成之后才能上CPU,完成之前,就没办法继续执行~
正常情况下,ABC都是就绪状态,(我随便排时间,他们都是随叫随到)
如果A出差了.(相当于进入阻塞状态),此时我就无法给A安排时间


2.进程的记账信息

操作系统在安排进程的时候,也会记录以往在CPU上执行的时间
如果发现某个进程被安排的太少,就会适当的安排的多一点

进程的上下文:

每次执行进程我都要记录好.执行进程的关键信息,当前处理的进度/中间结果
对于进程来说,上下文具体的就是CPU里面一堆寄存器里面的值,上下文就会在进程被切出CPU的时候,把寄存器的状态保存到排查表里(内存)


进程的虚拟地址空间
进程需要使用一些系统的资源,其中内存资源,就是一个很关键的资源.
为了让各个进程之间不要相互干扰,操作系统就引用了"虚拟地址空间"这样的概念~
每个进程都只能访问到自己的地址空间,互相之间不会有影响,哪怕你指针出错,操作系统也能即使发现问题,不会影响其他的进程,就算出问题,问题也被限制在进程的内部.

因为虚拟空间,进程就有了一个重要的特性

---------------------------------------------------
线程(死right)

线程和进城不是一个东西, 但是进程和线程之间确实有一定的联系

为啥要有多个进程?=>并发编程=>CPU单个核心已经发展到极致了,想要提升算力,就得使用多个核心,引用并发编程,最大的目的就是为了充分的利用好CPU的多核资源

多进程这种编程模型在需要频繁的创建/销毁进程,这个时候会比较低效,
因为创建/销毁进程本身就是一个比较低效的操作
1.创建pcb
2.分配系统资源,(尤其是内存资源),分配资源,就比较消耗时间
3.把pcb放到内核的双向链表


一个线程其实是包含在进程中的,
(一个进程可以有多个线程,每个线程也都有自己的pcb(一个进程可以有多个pcb)
同一个进程里的多个线程之间,公用一份系统资源,(意味着,新创建的线程,不必重新给他分配系统资源,字需要服用之前的即可)) 

因此,创建线程只需要
1.创建pcb
2.把pcb加入到内核的链表中  

线程,包含在进城内部的"逻辑执行流"(线程可移植性一段单独的代码,多个线程之间,是并发执行的)
操作系统进行调度的时候,其实也是以"线程为单位"来进行调度的,~~(系统内核不认进程/线程,只认pcb)
创建线程的开销要比创建进程药效,销毁线程的开销也要比销毁进程要小.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值