进程调度1.0

(UP才疏学浅,以下可能存在纰漏,非常欢迎各路大神指出错误和改进)

查看任务管理器的进程,我们可以看到又非常多的进程,每个进程有都需要执行,执行就需要占用cpu资源,但是cpu的资源又有限,例如我的电脑只有16个逻辑处理器,就意味着我的电脑只能同时处理16个进程,那其他进程怎么办呢?那么我们就需要了解一下进程调度了。

每个cpu就像一个工人,每个人都完成自己的任务,各个cpu之间互不影响;

进程调度的核心原则就是四个字:分时复用

一个cpu核心同个时刻只能执行一个进程执行,16核心同个时刻只能执行16个进程,就像不同的铁轨同一个时刻就可以跑不同的火车,这16进程同时执行就叫做并行执行

但是一个核心不同时刻可以执行不同进程,就像铁轨一样,不同时刻可以有不同班次的车在跑,这种不同的进程在同个cpu上执行的情况就叫做并发执行;

CPU把总的执行时间,切换成若干个时间片段,每个片段执行一个进程,每个时间片段叫做“时间片”,又因为切换进程的时间非常短,人为是无法识别的,所以我们总感觉这非常多的进程是同时执行的;

并行执行,在微观上是同时执行的;

并发执行,在宏观上是同时执行的,在微观上是串行执行(就是轮流执行);

我们把“并行执行”和“并发执行”统称“并发执行”,所以当有人说到并发的时候要分清说的是并发还是并行,还把解决并发安全问题的编程叫做“并发编程”;

接下来进一步了解一下PCB中的四个属性,用来支持进程调度的

1.状态

        状态分两种,“就绪状态”和“阻塞状态”;

        在操作系统中,进程的就绪状态是指进程已经准备好运行,但由于某些原因(例如,正在等待CPU调度)尚未被调度执行。在多道程序设计环境下,有多个进程同时准备运行,但是操作系统一次只能将一个进程加载到CPU中执行。因此,就绪状态的进程处于一种等待执行的状态,一旦获得CPU时间片,就可以开始执行。

        进程的阻塞状态是指进程在运行的过程,由于某种原因导致进程无法继续进行而处于一种等待状态,无法在CPU上继续进行,直到满足特定条件位置才能继续在CPU上继续执行,原因例如等待IO进程就会进入阻塞状态,就如进程中有Scanner.next(),此时进程就会进入阻塞转状态;

2.优先级

        进程的执行是抢占式,进程的运行需要占有CPU资源,有的进程需要更多的CPU资源,有的进程相对就不需要那么多,就需要适当的分配好CPU资源,设置优先级高的分配更多的资源,设置优先级低的分配少的资源,优先级的高低就可以决定进程运行的次序,优先级高的可能反复在CPU上执行;

3.上下文

        进程的上下文,每一个进程都有独立的上下文,会记录这个进程在退出CPU时执行到那里了,数据也会从CPU上的寄存器存到内存上;就比如你再算一道题,算一半突然有人向你请教另外一道题,你会先记住自己的题算到那里了,把数据存好,以便回头来算的可以接着算,等你帮同学算的过程中他说她明白了,想自己算,你可能也会记住他的这道题做到哪里,如果再问你你可以接着演示给他看;进程就像时每一道题一样,进程的上下文就相当于题目算到哪里了,并且每个进程的上下文就像题目算的数据一样是不同的,每一个进程都有独立的上下文

4.记账信息

        进程的记账信息可以说是进程的优先级的继续,在操作系统中,进程的记账信息通常是指系统对进程执行过程中产生的统计数据和日志信息的记录。这些信息对于监视系统性能、调优和故障排除非常有用。

=========================================================================

感谢你看到这里,接下来我就分享一下,老师讲的例子,以便更好地理解PCB中这四个支持进程调度的属性;

        (故事背景)女神同时交往三个男朋友,A是个富哥,B是帅哥,C就是能够提供情绪价值的(tg);

       1. A有家族生意,所以需要出差,不能被随时和女神约会啦,需要回来(特定条件)才能约会,进程才能运行,由于出差(这就是阻塞状态),但是tg就不一样了,属于是女神随叫随到的那种,就是一直处在就绪状态,只要女神有需要,就一定到(只要有CPU资源给他,他就一定能够执行);

        2.一周有七天,女神打算一三五给A,二四六给B,为了不失去一个能够提供情绪价值就勉强把周日分给C吧;因为A有钱,会给女神更多有价值的东西,为了获得更多与价值的东西,女神就要分配更多的时间分给他(CPU资源),又比如B可以养眼,带出去给她闺蜜看有面子之类的,也分配更多的时间给B,但是女神也需要C来舔她,利用他,就分点时间给他,这就是进程的优先级影响CPU资源的分配;

        3.A的妈妈要生日,女神准备了一些营养品;B约女神去海边玩,女神准备了一套性感的泳衣;这就对应了不同的事情有不同的安排,不同的进程有不同的上下文吧;不能女神把泳衣送给A的妈妈,而准备了两本书带去海边吧;(不过也不是不可以,但是后果就很难预料啦)

        4.由于女神给AB分配了三天,只给C分配了一天,C不乐意了,说不要再舔你了,女神就说接下来一周都陪你,C就又屁颠屁颠地继续舔了,进程的记账信息就类似这样了,记录了CPU给它分配了多少资源,CPU会根据这个适当的分配资源;

(以上故事纯属虚构,好好学习,天天向上,建设好祖国和自己的家庭);

操作系统中进程调度算法有多种,其中比较常见的有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度等。下面是这些算法的简单介绍和C语言代码示例。 1. 先来先服务(FCFS) 先来先服务是一种非抢占式的调度算法,按照进程到达的先后顺序分配CPU时间片。如果当前正在执行的进程没有完成,那么后续到达的进程就必须等待。这种算法的优点是简单易实现,但如果有长时间的进程到来,则会导致后续进程长时间等待。 C语言代码示例: ```c #include<stdio.h> int main() { int n, bt[20], wt[20], tat[20], avwt=0, avtat=0, i, j; printf("Enter total number of processes(maximum 20):"); scanf("%d", &n); printf("\nEnter Process Burst Time\n"); for(i=0;i<n;i++) { printf("P[%d]:",i+1); scanf("%d",&bt[i]); } wt=0; //Waiting time for first process is 0 //Calculating waiting time for(i=1;i<n;i++) { wt[i]=0; for(j=0;j<i;j++) wt[i]+=bt[j]; } printf("\nProcess\t\tBurst Time\tWaiting Time\tTurnaround Time"); //Calculating turnaround time and average waiting time for(i=0;i<n;i++) { tat[i]=bt[i]+wt[i]; avwt+=wt[i]; avtat+=tat[i]; printf("\nP[%d]\t\t%d\t\t%d\t\t%d",i+1,bt[i],wt[i],tat[i]); } avwt/=i; avtat/=i; printf("\n\nAverage Waiting Time:%d",avwt); printf("\nAverage Turnaround Time:%d",avtat); return 0; } ``` 2. 短作业优先(SJF) 短作业优先是一种非抢占式的调度算法,按照进程的执行时间长度来进行调度。当有多个进程的执行时间相同时,按照到达时间的先后顺序进行调度。这种算法的优点是可以减少平均等待时间,但如果有长时间的进程到来,则会导致后续进程长时间等待。 C语言代码示例: ```c #include<stdio.h> int main() { int n, bt[20], wt[20], tat[20], avwt=0, avtat=0, i, j, pos, temp; printf("Enter total number of processes(maximum 20):"); scanf("%d", &n); printf("\nEnter Process Burst Time\n"); for(i=0;i<n;i++) { printf("P[%d]:",i+1); scanf("%d",&bt[i]); } //Sorting burst time in ascending order using selection sort for(i=0;i<n;i++) { pos=i; for(j=i+1;j<n;j++) { if(bt[j]<bt[pos]) pos=j; } temp=bt[i]; bt[i]=bt[pos]; bt[pos]=temp; } wt=0; //Waiting time for first process is 0 //Calculating waiting time for(i=1;i<n;i++) { wt[i]=0; for(j=0;j<i;j++) wt[i]+=bt[j]; } printf("\nProcess\t\tBurst Time\tWaiting Time\tTurnaround Time"); //Calculating turnaround time and average waiting time for(i=0;i<n;i++) { tat[i]=bt[i]+wt[i]; avwt+=wt[i]; avtat+=tat[i]; printf("\nP[%d]\t\t%d\t\t%d\t\t%d",i+1,bt[i],wt[i],tat[i]); } avwt/=i; avtat/=i; printf("\n\nAverage Waiting Time:%d",avwt); printf("\nAverage Turnaround Time:%d",avtat); return 0; } ``` 3. 时间片轮转(RR) 时间片轮转是一种抢占式的调度算法,每个进程被分配一个时间片,当时间片用完时,该进程就会被挂起,并且把CPU分配给下一个进程。如果进程在时间片用完之前完成了任务,则它会被立即切换下一个进程。这种算法适用于处理多个短进程。 C语言代码示例: ```c #include<stdio.h> int main() { int i, n, qt, count=0, time, remain, flag=0, wt=0, tat=0, at[20], bt[20], rt[20]; printf("Enter Total Process:\t "); scanf("%d",&n); remain=n; for(i=0;i<n;i++) { printf("Enter Arrival Time and Burst Time for Process Number %d :",i+1); scanf("%d",&at[i]); scanf("%d",&bt[i]); rt[i]=bt[i]; } printf("Enter Time Quantum:\t"); scanf("%d",&qt); printf("\n\nProcess\t|Turnaround Time|Waiting Time\n\n"); for(time=0,i=0;remain!=0;) { if(rt[i]<=qt && rt[i]>0) { time+=rt[i]; rt[i]=0; flag=1; } else if(rt[i]>0) { rt[i]-=qt; time+=qt; } if(rt[i]==0 && flag==1) { remain--; printf("P[%d]\t|\t%d\t|\t%d\n",i+1,time-at[i],time-at[i]-bt[i]); wt+=time-at[i]-bt[i]; tat+=time-at[i]; flag=0; } if(i==n-1) i=0; else if(at[i+1]<=time) i++; else i=0; } printf("\nAverage Waiting Time=%f\n",wt*1.0/n); printf("Average Turnaround Time=%f\n",tat*1.0/n); return 0; } ``` 4. 优先级调度 优先级调度是一种非抢占式的调度算法,每个进程被分配一个优先级,按照优先级高低进行调度。如果有多个进程优先级相同,则按照到达时间的先后顺序进行调度。这种算法的缺点是可能导致低优先级的进程长时间等待。 C语言代码示例: ```c #include<stdio.h> int main() { int n, bt[20], wt[20], tat[20], p[20], i, j, pos, temp; float avwt=0, avtat=0; printf("Enter total number of processes(maximum 20):"); scanf("%d", &n); printf("\nEnter Burst Time and Priority\n"); for(i=0;i<n;i++) { printf("\nP[%d]\n", i+1); printf("Burst Time:"); scanf("%d", &bt[i]); printf("Priority:"); scanf("%d", &p[i]); } //Sorting burst time and priority in ascending order using selection sort for(i=0;i<n;i++) { pos=i; for(j=i+1;j<n;j++) { if(p[j]<p[pos]) pos=j; } temp=p[i]; p[i]=p[pos]; p[pos]=temp; temp=bt[i]; bt[i]=bt[pos]; bt[pos]=temp; } wt=0; //waiting time for first process is zero //calculating waiting time for(i=1;i<n;i++) { wt[i]=0; for(j=0;j<i;j++) wt[i]+=bt[j]; avwt+=wt[i]; } avwt/=i; //average waiting time printf("\nProcess\t\tBurst Time\tWaiting Time\tTurnaround Time"); //calculating turnaround time and average turnaround time for(i=0;i<n;i++) { tat[i]=bt[i]+wt[i]; avtat+=tat[i]; printf("\nP[%d]\t\t%d\t\t%d\t\t%d", i+1, bt[i], wt[i], tat[i]); } avtat/=i; //average turnaround time printf("\n\nAverage Waiting Time=%f", avwt); printf("\nAverage Turnaround Time=%f", avtat); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a添砖Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值