Round Robin 轮询调度算法

Round Robin 轮询调度算法,第1张

轮询调度(Round-Robin Scheduling)

轮询调度(Round Robin Scheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选芹庆首出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所嫌数以它是一种无状态调度。

轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。

轮询调度算法流程

假设有一组服务器N台,S = {S1, S2, …, Sn},一个指示变量i表示上一次选择的服务器ID。变量i被初始化为N-1。一个很经典的算法程序如下:

轮询调度算法假设所有服务器的处理性能都相同,不关心每台服务器的当前连接数和响应速度。当请求服务间隔时间变化比较差哗大时,轮询调度算法容易导致服务器间的负载不平衡。

所以此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。

口令是最重要的单个用户标识符。通过它,系统可验证一个用户的身份,以便允许该用户访问系统。由于口令在使用、存储或已知的情况下容易泄露,因此必须始终秘密保存。下列各节将进一步讨论口令。

系统管理员职责

系统管理员以及系统中的每个用户必须共同承担保护口令安全的职责。系统管理员执行下列安全任务:

确保所有用户都有自己的口令。

在所有系统文件中应用适当的权限,包括标准的口令文件和组文桐带拦件,即 /etc/passwd 和 /etc/group。

对于无权再访问系统的用户,应删除其用户 ID 和口令,或者使其用户 ID 和口令无效。

验证是否所有应用程序口令都已加密。

验证为 /var/adm/btmp 和 /var/adm/wtmp 设置的权限是否正确。

对每次 guest 访问使用一次性口令。

告知用户与口令安全性相关的职责。

利用口令时限性强制用户定期更改其口令。

防止重新使用最近的口令。

在 /etc/default/security 文件中配置系统范围的安全属性。有关详细信息,请参阅“定义系统安全属性”,并参考 security(4)。

转换系统以使用影子口令。有关详细信息,请参阅“/etc/shadow 影子口令文件”以及 shadow(4) 和 pwconv(1M)。

用户职责

每个用户必须遵守下列规则:

记住口令,并始终将它秘密保存。

立即更改初始口令,并坚持更改口令。

报告任何状态变更,以及任何值得怀疑的安全违规现象。

确保输入口令时无人监视。

好口令的标准

选择口令时应遵守下列准则并将其传达给用户:

选择的口令至少应有 6 个字符,最多不超过 80 个字符。特殊字符可以包括控制符以及诸如星号和斜杠之类的符号。在标准模式下,只使用前 8 个字符。

不要选择可以在任何语言的字典中找到的单词,即便反过来拼也不可以。有一些软件程序可以找到并匹配您使用的单词。

不要选择容易与用户关联起来的口令,例如家庭成员或宠物的名字,或者是某种业余爱好。

不要使用简单的键盘序列(例如 asdfghjkl)或登录名的重复(例如,如果登录名为 ann,则 annann 便不是好的口令)。

可以考虑使用拼错的单词或两个不相关单词的音节组合来组成适合的口令。另一种常用的方法是使用最喜欢的标题或短语的前几个字符作为口令。

可行并以考虑使用口令生成器来组合音节以生成可发音的混乱文字。

不要与其他用户共享口令。管理人员必须禁止共享口令。

始终使用口令。不要清除 /etc/passwd 文件中的口令字段。

更改 /etc/passwd 口令文件

标准系统维护一个口令文件:/etc/passwd。

所有口令输入后便立即加密,并存储在口令文件 /etc/passwd 中。在比较过程中仅使用加密的口令。局胡

如果需要更改口令文件,请遵守下列准则:

不允许有任何空的口令字段;否则便是安全违例。空口令字段允许任何用户为该帐户设置口令。

不要直接编辑口令文件。应使用 HP SMH 或者 useradd、userdel 或 usermod 命令来修改口令文件条目。如果必须直接编辑口令文件,请使用 vipw 命令,并使用 pwck 命令进行检查。有关详细信息,请参阅vipw(1M) 和 pwck(1M)。

passwd 命令示例

下面是一些有用的 passwd 命令示例:

重置用户的口令:

# passwd user1

在下次登录时强制更改口令:

# passwd -f user1

锁定或禁用帐户:

# passwd -l user2

启用口令时限性:

# passwd -n 7 -x 28 user1

查看特定用户的口令时限性状态:

# passwd -s user

查看所有用户的口令时限性状态:

# passwd -sa

/etc/passwd 文件格式

/etc/passwd 文件用于在用户登录时验证其身份。对于 HP-UX 系统中的每个帐户,该文件都包含一个相应的条目。每个条目均由冒号分隔的七个字段组成。典型的 /etc/passwd 条目应与下面的示例类似:

robin:Z.yxGaSvxAXGg:102:99:Robin Hood,Rm 3,x9876,408-555-1234:/home/robin:/usr/bin/sh

字段包含下列信息(按顺序列出),各信息之间用冒号分隔:

robin - 用户(登录)名,最多由 8 个字符组成。

Z.yxGaSvxAXGg - 加密口令字段

102 - 用户 ID,为 0 到 MAXINT-1(等于 2、147、483、646 或 231 -2)之间(含)的整数。

99 - 组 ID,来自 /etc/group,为 0 到 MAXINT-1 之间(含)的整数。

Robin Hood,Rm 3,x9876,408-555-1234 - 注释字段,用于标识诸如用户的全名、位置和电话号码等信息。由于历史原因,该字段也称为 gecos 字段。

/home/robin - 主目录,用户的起始登录目录。

/usr/bin/sh - 登录 shell 路径名,用户登录时执行。

用户可以分别通过调用 passwd、chfn 以及 chsh 来更改口令、注释字段(第五个字段)以及登录程序路径名(第七个字段)。余下的字段由系统管理员设置。用户 ID 必须是唯一的。有关详细信息,chfn(1)、chsh(1)、passwd(1) 和 passwd(4)。

/etc/shadow 影子口令文件

可用于恶意口令解密器的计算能力的不断提高使 /etc/passwd 文件中的非隐藏口令非常容易被解密,

而影子口令将加密的口令隐藏在影子口令文件中,从而增强了系统安全性。可以将先前存储在公共可读文件 /etc/passwd 中的加密口令移动至 /etc/shadow 文件中,只有具有适当权限的用户才可以访问此文件。

使用下列命令可启用、验证和禁用影子口令:

pwconv 命令创建影子口令文件,并将加密的口令从 /etc/passwd 文件复制到 /etc/shadow 文件。

pwck 命令检查文件 /etc/passwd 和 /etc/shadow 中的不一致性。

pwunconv 命令将加密的口令和时限性信息从 /etc/shadow 文件复制到 /etc/passwd 文件中,然后删除 /etc/shadow 文件。

有关详细信息,请参阅 pwconv(1M)、pwck(1M)、pwunconv(1M) 和 shadow(4)。

请注意有关影子口令功能的下列各点。

启用影子口令功能后,如果应用程序直接访问 /etc/passwd 文件的口令字段来获取口令和时限性信息,则这些应用程序会受到影响。此字段现在会包含一个 x,表示此信息位于 /etc/shadow 中。

使用 PAM 接口进行验证的应用程序不会受到影响。

要以编程方式访问 /etc/shadow 文件,请使用 getspent() 调用。这些调用类似于 /etc/passwd 的 getpwent() 调用。有关详细信息,请参阅 getspent(3C) 和 getpwent(3C)。

在 /etc/nsswitch.conf 文件中,影子口令受 files、NIS 和 LDAP 名称服务支持,但是其他名称服务器转换后端可能不支持影子口令。要配置系统使其仅使用 files、NIS 和(或) LDAP,请确保 /etc/nsswitch.conf 中的 passwd 行仅包含 files、NIS 和(或) LDAP。如果 /etc/nsswitch.conf 不存在,或者其中不存在 passwd 行,则缺省值仅是 files。有关详细信息,请参阅 nsswitch.conf(4)。

影子口令基于在其他 UNIX 系统中提供的 de facto 标准。

/etc/default/security 中定义的下列属性适用于影子口令。有关详细信息,请参阅“定义系统安全属性”以及 security(4) 联机帮助页。

INACTIVITY_MAXDAYS - 帐户过期前可处于非活动状态的天数。

PASSWORD_MINDAYS - 可以更改口令前的最少使用天数。

PASSWORD_MAXDAYS - 口令的最大有效天数。

PASSWORD_WARNDAYS - 警告用户口令过期之前的天数。

下列产品支持影子口令:

轻量级目录访问协议 (LDAP)

Ignite-UXht 目录访问协议 (LDAP)

Serviceguard

下列软件不支持影子口令:

Process Resource Manager (PRM)

预期口令保存在 /etc/passwd 中的应用程序

有关详细信息,请参阅下列联机帮助页:

passwd(1)、pwck(1M)、pwconv(1M)、pwunconv(1M)、getspent(3C)、putspent(3C)、nsswitch.conf(4)、passwd(4)、security(4)、shadow(4)

在 /etc/passwd 中消除伪帐户并保护密钥子系统

传统的 /etc/passwd 文件包含大量的“伪帐户”,即与各个用户无关且没有真正的交互式登录 Shell 的条目。

其中的一些条目(例如 date、who、sync 和 tty)是为方便用户而形成的,它们提供无需登录即可执行的命令。为了加强安全性,在分发的 /etc/passwd 中已将其删除,这样这些程序只能由已登录的用户运行。

其他类似的条目则保留在 /etc/passwd 中,因为它们是文件的属主。具有属主的程序(例如 adm、bin、daemon、hpdb、lp 和 uucp)可作用于整个子系统,并且代表一种特例。由于它们授予对它们所保护或使用的文件的访问权限,因此必须在 /etc/passwd 中列出相应的条目,以便允许这些程序作为伪帐户运行。传统的伪帐户和特殊帐户如示例 3-1 “伪帐户和特殊系统帐户”所示。

示例 3-1 伪帐户和特殊系统帐户

root::0:3::/:/sbin/sh

daemon:*:1:5::/:/sbin/sh

bin:*:2:2::/usr/bin:/sbin/sh

sys:*:3:3::/:

adm:*:4:4::/var/adm:/sbin/sh

uucp:*:5:3::/var/spool/uucppublic:/usr/lbin/uucp/uucico

lp:*:9:7::/var/spool/lp:/sbin/sh

nuucp:*:11:11::/var/spool/uucppublic:/usr/lbin/uucp/uucico

hpdb:*:27:1:ALLBASE:/:/sbin/sh

nobody:*:-2:-2::/:

这些子系统特权状态的关键是能够授予对受其管辖的程序的访问权限,而无需授予超级用户访问权限 (uid 0),相反,它们设置可执行文件的 setuid 位,并使进程的有效用户对应于可执行文件的属主。例如,cancel 命令是 lp 子系统的一部分,因此它作为有效用户 lp 运行。

设置 setuid 后,该子系统的安全调停机制会强制将所有程序的安全性局限在子系统范围内,而不是整个系统范围内。因此,子系统中有害于安全性的弱点也仅仅只局限于这些子系统内的文件。违例不能影响到其他子系统下的程序。例如,lp 下的程序不会影响到 daemon 下的程序。

使用 HP-UX Secure Shell 进行安全登录

HP-UX Secure Shell 提供安全的远程登录、文件传输和远程命令执行功能。客户端和服务器之间的所有通信都经过加密。通过网络传输的口令不再以明文形式发送。有关详细信息,请参阅 ssh(1) 和 “使用 HP-UX Secure Shell (SSH) 保护远程会话”。

保护存储在 NIS 中的口令

网络信息服务 (NIS) 是网络文件系统 (NFS) 的一部分。NIS 支持从一个中心位置(即主服务器)对多个主机进行配置管理。不是将主机配置分别存储在各个主机上,而是将信息整合到一个中心位置。/etc/password 文件是存储在 NIS 服务器上的多个配置文件之一。

/etc/shadow 影子口令文件在 NIS 上不受支持。

有关 NIS 的信息,请参阅《NFS Services Administrator's Guide》。

保护存储在 LDAP 目录服务器中的口令

LDAP-UX Client Services 与 PAM 进行交互来验证存储在 LDAP 目录服务器上的口令。PAM_LDAP 库提供验证服务

真不容易啊,怕是没人弄了!

优先级调度算法程序:

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

typedef struct node

{

char name[10] /*进程标识符*/

int prio /*进程优先数*/

int round /*进程时间轮转时间片*/

int cputime/*进程占用CPU时间*/

int needtime/*进程到完成还要的时间*/

int count /*计数器*/

char state/*进程的状态*/

struct node *next/*链指针*/

}PCB

PCB *finish,*ready,*tail,*run/*队列指针*/

int N/*进程数*/

/*将就绪队列中的第一个进程投入运行*/

firstin()

{

run=ready /*就绪队列头指针赋值给运行头指针*/

run->state='R' /*进程状态变为运行态*/

ready=ready->next /*就绪对列头指针后移到下一进程*/

}

/*标题输出函数*/

void prt1(char a)

{

if(toupper(a)=='P') /*优先数法*/

printf(" name cputime needtime priority state\n")

else

printf(" name cputime needtime count round state\n")

}

/*进程PCB输出*/

void prt2(char a,PCB *q)

{

if(toupper(a)=='P') /*优先数法的输出*/

printf(" %-10s%-10d%-10d%-10d %c\n",q->name,

q->cputime,q->needtime,q->prio,q->state)

else/*轮转法的输出*/

printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,

q->cputime,q->needtime,q->count,q->round,q->state)

}

/*输出函数*/

void prt(char algo)

{

PCB *p

prt1(algo) /*输出标题*/

if(run!=NULL) /*如果运行指针不空*/

prt2(algo,run)/*输出当前正在运行的PCB*/

p=ready /*输出就绪队列PCB*/

while(p!=NULL)

{

prt2(algo,p)

p=p->next

}

p=finish /*输出完成队列的PCB*/

while(p!=NULL)

{

prt2(algo,p)

p=p->next

}

getch() /*压任肆慎意键继续*/

}

/*优先数的插入算法*/

insert1(PCB *q)

{

PCB *p1,*s,*r

int b

s=q /*待插入的PCB指针*/

p1=ready/*就绪队列头指针*/

r=p1/*r做p1的前驱指针*/

b=1

while((p1!=NULL)&&b) /*根据优先数确定插入位置*/

if(p1->prio>=s->prio)

{

r=p1

p1=p1->next

}

else

b=0

if(r!=p1) /*如果条件成立说明插入在r与p1之间*/

{

r->next=s

s->next=p1

}

else

{

s->next=p1 /*否则插入在就绪队列的头*/

ready=s

}

}

/*轮转法插入函数*/

insert2(PCB *p2)

{

tail->next=p2 /*将新的PCB插入在当前就绪队列的搭斗尾*/

tail=p2

p2->知雹磨next=NULL

}

/*优先数创建初始PCB信息*/

void create1(char alg)

{

PCB *p

int i,time

char na[10]

ready=NULL/*就绪队列头指针*/

finish=NULL /*完成队列头指针*/

run=NULL/*运行队列指针*/

printf("Enter name and time of process\n")/*输入进程标识和所需时间创建PCB*/

for(i=1i<=Ni++)

{

p=malloc(sizeof(PCB))

scanf("%s",na)

scanf("%d",&time)

strcpy(p->name,na)

p->cputime=0

p->needtime=time

p->state='w'

p->prio=50-time

if(ready!=NULL) /*就绪队列不空调用插入函数插入*/

insert1(p)

else

{

p->next=ready/*创建就绪队列的第一个PCB*/

ready=p

}

}

clrscr()

printf(" output of priority:\n")

printf("************************************************\n")

prt(alg) /*输出进程PCB信息*/

run=ready/*将就绪队列的第一个进程投入运行*/

ready=ready->next

run->state='R'

}

/*轮转法创建进程PCB*/

void create2(char alg)

{

PCB *p

int i,time

char na[10]

ready=NULL

finish=NULL

run=NULL

printf("Enter name and time of round process\n")

for(i=1i<=Ni++)

{

p=malloc(sizeof(PCB))

scanf("%s",na)

scanf("%d",&time)

strcpy(p->name,na)

p->cputime=0

p->needtime=time

p->count=0/*计数器*/

p->state='w'

p->round=2 /*时间片*/

if(ready!=NULL)

insert2(p)

else

{

p->next=ready

ready=p

tail=p

}

}

clrscr()

printf(" output of round\n")

printf("************************************************\n")

prt(alg) /*输出进程PCB信息*/

run=ready /*将就绪队列的第一个进程投入运行*/

ready=ready->next

run->state='R'

}

/*优先数调度算法*/

priority(char alg)

{

while(run!=NULL) /*当运行队列不空时,有进程正在运行*/

{

run->cputime=run->cputime+1

run->needtime=run->needtime-1

run->prio=run->prio-3/*每运行一次优先数降低3个单位*/

if(run->needtime==0) /*如所需时间为0将其插入完成队列*/

{

run->next=finish

finish=run

run->state='F' /*置状态为完成态*/

run=NULL /*运行队列头指针为空*/

if(ready!=NULL) /*如就绪队列不空*/

firstin()/*将就绪对列的第一个进程投入运行*/

}

else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/

if((ready!=NULL)&&(run->prio<ready->prio))

{

run->state='W'

insert1(run)

firstin()/*将就绪队列的第一个进程投入运行*/

}

prt(alg)/*输出进程PCB信息*/

}

}

/*时间片轮转法*/

roundrun(char alg)

{

while(run!=NULL)

{

run->cputime=run->cputime+1

run->needtime=run->needtime-1

run->count=run->count+1

if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/

{

run->next=finish

finish=run

run->state='F'

run=NULL

if(ready!=NULL)

firstin()/*就绪对列不空,将第一个进程投入运行*/

}

else

if(run->count==run->round) /*如果时间片到*/

{

run->count=0 /*计数器置0*/

if(ready!=NULL) /*如就绪队列不空*/

{

run->state='W'/*将进程插入到就绪队列中等待轮转*/

insert2(run)

firstin()/*将就绪对列的第一个进程投入运行*/

}

}

prt(alg)/*输出进程信息*/

}

}

/*主函数*/

main()

{

char algo /*算法标记*/

clrscr()

printf("type the algorithm:P/R(priority/roundrobin)\n")

scanf("%c",&algo)/*输入字符确定算法*/

printf("Enter process number\n")

scanf("%d",&N)/*输入进程数*/

if(algo=='P'||algo=='p')

{

create1(algo)/*优先数法*/

priority(algo)

}

else

if(algo=='R'||algo=='r')

{

create2(algo)/*轮转法*/

roundrun(algo)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12324522.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存