nginx代理负载均衡的调度算法都有哪些 操作系统磁盘调度算法wenti
nginx代理负载均衡的调度算法都有哪些
利用nginx作反向代理apache直接暴露给外界同nginx主要做负载均衡提升系统并发承载能力nginx处理静态内容apache处理态内容加快站点访问速度建议解nginx反向代理
操作系统磁盘调度算法wenti
SCAN调度算法就是电梯调度算法,顾名思义就是如果开始时磁头往外就一直要到最外面,然后再返回向里(磁头编号一般是最外面为0号往里增加),就像电梯若往下则一直要下到最底层才会再上升一样。这里的从左端开始是什么意思呢?一般是题目中会给出此时磁头指向里或是指向外的。向外则向比它小的方向扫描,向里则向比它大的方向扫描,而若求寻道时间还要知道每移动一个磁道所需的时间t,寻道时间T1={(53-37) (37-14) (14-0) (65-0) (67-65) (98-67) (122-98) (124-122) (183-124) (199-183)}*t=(53 199)*t=252t.
CSCAN循环扫描调度算法是先找出最靠近磁头位置的下一个,或是按题中规定的方向,反正就是只能是单向扫描。例如题中65距53最近,于是最先到65然后继续朝增加的方向,直到最大,然后又立即回到最小的0号开始,计算时返回的那段距离也必需计算在内。T2={(199-53) (199-0) (37-0)}*t=382t.
显然此时SCAN算法更省时。
处理机调度算法的实现
操作系统实验嘛,今学期刚做过~附上代码:
#include "stdio.h"
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10]
char state
int super
int ntime
int rtime
struct pcb* link
}*ready=NULL,*p
typedef struct pcb PCB
void sort() /* 建立对进程进行优先级排列函数*/
{
PCB *first, *second
int insert=0
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
{
p->link=ready
ready=p
}
else /* 进程比较优先级,插入适当的位置中*/
{
first=ready
second=first->link
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
p->link=second
first->link=p
second=NULL
insert=1
}
else /* 插入进程优先数最低,则插入到队尾*/
{
first=first->link
second=second->link
}
}
if(insert==0) first->link=p
}
}
void input() /* 建立进程控制块函数*/
{
int i,num
system("cls") /*清屏*/
printf("
请输入进程数: ")
scanf("%d",&num)
for(i=1i<=numi )
{
printf("
进程号No.%d:
",i)
p=getpch(PCB)
printf("
输入进程名:")
scanf("%s",p->name)
printf("
输入进程优先数:")
scanf("%d",&p->super)
printf("
输入进程运行时间:")
scanf("%d",&p->ntime)
printf("
")
p->rtime=0p->state=W
p->link=NULL
sort() /* 调用sort函数*/
}
}
int space()
{
int l=0
PCB* pr=ready
while(pr!=NULL)
{
l
pr=pr->link
}
return(l)
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("
进程名 状态 优先数 需要运行时间 已经运行时间
")
printf("|%s ",pr->name)
printf("|%c ",pr->state)
printf("|%d ",pr->super)
printf("|%d ",pr->ntime)
printf("|%d ",pr->rtime)
printf("
")
}
void check() /* 建立进程查看函数 */
{
PCB* pr
printf("
**** 当前正在运行的进程是:
") /*显示当前运行进程*/
disp(p)
pr=ready
printf("
**** 当前就绪队列状态为:
") /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr)
pr=pr->link
}
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("
进程 [%s] 已完成.
",p->name)
free(p)
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)
if(p->rtime==p->ntime)
destroy() /* 调用destroy函数*/
else
{
(p->super)--
p->state=W
sort() /*调用sort函数*/
}
}
void main() /*主函数*/
{
int len,h=0
char ch
input()
len=space()
while((len!=0)&&(ready!=NULL))
{
ch=getchar()
h
printf("-----------------------------------------------------")
printf("
现在是第%d次运行:
",h)
p=ready
ready=p->link
p->link=NULL
p->state=R
check()
running()
printf("
按任意键继续......
")
}
printf("
进程已经完成.
")
}
29、Java中用到的线程调度算法是什么?
操作系统的核心,它实际就是一个常驻内存的程序,不断地对线程队列进行扫描,利用特定的算法(时间片轮转法、优先级调度法、多级反馈队列调度法等)找出比当前占有CPU的线程更有CPU使用权的线程,并从之前的线程中收回处理器,再使待运行的线程占用处理器。