当前位置:首页 » 操作系统 » sig算法

sig算法

发布时间: 2022-08-25 03:15:57

⑴ 怎样求大组合数(取模)(ACM算法

这种题目然做过的,
意思比较简单,就由 m 个共 0 和 n 个 1 组成一个串,但从左到右要1出现的次数不少于0出现的次数。
由大牛的算法: 结果就是 C(m+n, n) - C(m+n, m-1) 再取模,我们可以对式子化简一下就是:
(n+m)!*
(n-m+1) / ((m)!* (n+1)!)
再取模,但由于组合数很大,直接用大数乘除就会超时了,看了别人的报告才知道原来可以用素数化简快速求模的, n! = 2^p[i] *
3^p[i] * 5^p[i]*...... 再求模就可以很快了~(^ = ^)~。。。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define M 2000005
#define mm 20100501
bool sig[M];
int prime[150000], p[150000], len; // prime 记录素数, p 记录素数的幂 len 记录长度
void getprime() // 筛法找素数
{
int i,j,k=0;
prime[k++] = 2;
for(i=3; i<=M; i+=2)
{
if( !sig[i] )
{
prime[k++] = i;
for(j=i; j<=M; j+=i)
sig[j] = 1;
}
}
}
void get(int k, int s) // K! 的素数分解, S为指数的加减(分母,分子)
{
int i, mid;
for(i=0; prime[i]<=k && prime[i]; i++)
{
mid = k;
while(mid)
{
if(s)
p[i] += mid/prime[i];
else
p[i] -= mid/prime[i];
mid /= prime[i];
}
}
if(len < i)
len = i;
}
__int64 cal() // 计算结果 (prime[i...]^p[i...]) % mm
{
__int64 i,ans = 1;
for(i=0; i<=len; i++)
{
if( p[i] )
{
__int64 t = prime[i], b = p[i], ret = 1;
while(b) //计算 (t^b) % mm
{
if(b%2) ret *= t %mm;
t = t*t%mm;
b /= 2;
}
ans = ( ans*ret ) % mm;
}
}
return ans;
}
int main()
{
int t,m,n,i,mid;
__int64 ans;
getprime();
cin>>t;
while(t--)
{
cin>>n>>m;
len = 0;
memset(p, 0, sizeof(p));
mid = n-m+1; //先前要把 n-m+1 的因子加进 P 中去才能使 (m+n)! / ((m)!*(n+1)!) 整除
for(i=0; mid>1; i++)
{
if( mid%prime[i] == 0)
{
while(mid%prime[i]==0)
{
p[i] += 1;
mid /= prime[i];
}
}
}
get(m+n, 1);
get(m, 0);
get(n+1, 0);
ans = cal();
printf("%I64d\n", ans);
}
return 0;
}

可以用素数分解法,
先求出上面和下面的素数表示,然后约分后,再用求幂公式

⑵ 怎样用公开密钥算法实现数字签名要实现具有保密性的数字签名呢

发送方A用自己的秘密密钥签名并用接受者B的公开密钥加密,B收到报文后用自己的秘密密钥解密,再用A的公开密钥核实签名

⑶ 操作系统进程调度算法(数组)c++

1.程序算法
struct PCB
{
int pname;
int pri;
int runtime;
int waitting;
struct PCB*next;
}
pcb[7];
struct PCB*running,ready,wait;
int sin=0;
main()
{ 创建PCB[3]--PCB[9]并插入ready队列;/*pname分别为3--9,
pri=0,runtime=10,waittime=0 */
for(;;)/*系统程序,完成初始化和处理机分派功能*/

{cast{sig=0:swtch;
sig=1:waiter;
sig=3:proc3;
sig=4:proc4;
sig=5:proc5;
sig=6:proc6;
sig=7:proc7;
sig=8:proc8;
sig=9:proc9;}
}
}

2.进程调度程序
swtch()
{
while(ready==NULL)wakeup();
移出就绪队列第一个PCB;
送running指针;
若pri=1,则runntime=4,否则runtime=10;
将running→pname送sig
}

3。 将进程等待函数
wait()
{将运行进程插入wait队列,优先数置1;
sig=0;
}
4。进程唤醒函数
wakeup()
{
将wait队列中所有的PCB中waittime减1;
将wait队列中的所有的waittime=0的PCB揭除;
插入到ready队列中第一个优先级为0的PCB前面

⑷ 想听大家对于一道密码设计的数学建模题

公钥密码又称为双钥密码和非对称密码,是1976年由Daffy和Hellman在其“密码学新方向”一文中提出的,见划时代的文献:
W.Diffie and M.E.Hellman, New Directrions in Cryptography, IEEE Transaction on Information Theory, V.IT-22.No.6, Nov 1976, PP.644-654
单向陷门函数是满足下列条件的函数f:
(1)给定x,计算y=f(x)是容易的;
(2)给定y, 计算x使y=f(x)是困难的。
(所谓计算x=f-1(Y)困难是指计算上相当复杂,已无实际意义。)
(3)存在δ,已知δ 时,对给定的任何y,若相应的x存在,则计算x使y=f(x)是容易的。
注:1*. 仅满足(1)、(2)两条的称为单向函数;第(3)条称为陷门性,δ 称为陷门信息。
2*. 当用陷门函数f作为加密函数时,可将f公开,这相当于公开加密密钥。此时加密密钥便称为公开钥,记为Pk。 f函数的设计者将δ 保密,用作解密密钥,此时δ 称为秘密钥匙,记为Sk。由于加密函数时公开的,任何人都可以将信息x加密成y=f(x),然后送给函数的设计者(当然可以通过不安全信道传送);由于设计者拥有Sk,他自然可以解出x=f-1(y)。
3*.单向陷门函数的第(2)条性质表明窃听者由截获的密文y=f(x)推测x是不可行的。
Diffie和Hellman在其里程碑意义的文章中,虽然给出了密码的思想,但是没有给出真正意义上的公钥密码实例,也既没能找出一个真正带陷门的单向函数。然而,他们给出单向函数的实例,并且基于此提出Diffie-Hellman密钥交换算法。这个算法是基于有限域中计算离散对数的困难性问题之上的:设F为有限域,g∈ F是F的乘法群F*=F\{0}=<g>。并且对任意正整数x,计算gx是容易的;但是已知g和y求x使y= gx,是计算上几乎不可能的。这已问题称为有限域F上的离散对数问题。公钥密码学种使用最广泛的有限域为素域FP.
对Diffie-Hellman密钥交换协议描述:Alice和Bob协商好一个大素数p,和大的整数g,1<g<p,g最好是FP中的本原元,即FP*=<g>。p和g无须保密,可为网络上的所有用户共享。
当Alice和Bob要进行保密通信时,他们可以按如下步骤来做:
(1)Alice送取大的随机数x,并计算
X=gx(mod P)
(2)Bob选取大的随机数x,并计算X  = gx (mod P)
(3)Alice将X传送给Bob;Bob将X 传送给Alice。
(4)Alice计算K=(X )X(mod P);Bob计算K  =(X) X (mod P),易见,K=K  =g xx (mod P)。
由(4)知,Alice和Bob已获得了相同的秘密值K。双方以K作为加解密钥以传统对称密钥算法进行保密通信。
注:Diffie-Hellman密钥交换算法拥有美国和加拿大的专利。
3 RSA公钥算法
RSA公钥算法是由Rivest,Shamir和Adleman在1978年提出来的(见Communitions of the ACM. Vol.21.No.2. Feb. 1978, PP.120-126)该算法的数学基础是初等数论中的Euler(欧拉)定理,并建立在大整数因子的困难性之上。
将Z/(n)表示为 Zn,其中n=pq; p,q为素数且相异。若
Z*n{g∈ Zn|(g,n)=1},易见Z*n为  (n)阶的乘法群,且有 g  (n)1(mod n),而  (n)=(p-1)(q-1).
RSA密码体制描述如下:
首先,明文空间P=密文空间C=Zn.(见P175).
A.密钥的生成
选择p,q,p,q为互异素数,计算n=p*q,  (n)=(p-1)(q-1), 选择整数e使( (n),e)=1,1<e< (n)),计算d,使d=e-1(mod  (n))),公钥Pk={e,n};私钥Sk={d,p,q}。
注意,当0<M<n时,M (n) =1(mod n)自然有:
MK (n)+1M(mod n), 而ed  1 (mod  (n)),易见(Me)d  M(mod n)
B.加密 (用e,n) 明文:M<n 密文:C=Me(mod n).
C.解密 (用d,p,q)
密文:C 明文:M=Cd(mod n)
注:1*, 加密和解密时一对逆运算。
2*, 对于0<M<n时,若(M,n) ≠ 1,则M为p或q的整数倍,假设M=cp,由(cp,q)=1 有 M (q)  1(mod q) M  (q)  (p)  1(mod q)
有M (q) = 1+kq 对其两边同乘M=cp有
有M (q)+1=M+kcpq=M+kcn于是
有M (q)+1  M(mod n)
例子:若Bob选择了p=101和q=113,那么,n=11413,  (n)=100×112=11200;然而11200=26×52×7,一个正整数e能用作加密指数,当且仅当e不能被2,5,7所整除(事实上,Bob不会分解φ(n),而且用辗转相除法(欧式算法)来求得e,使(e, φ(n)=1)。假设Bob选择了e=3533,那么用辗转相除法将求得:
d=e -1  6597(mod 11200), 于是Bob的解密密钥d=6597.
Bob在一个目录中公开n=11413和e=3533, 现假设Alice想发送明文9726给Bob,她计算:
97263533(mod 11413)=5761
且在一个信道上发送密文5761。当Bob接收到密文5761时,他用他的秘密解密指数(私钥)d=6597进行解密:57616597(mod 11413)=9726
注:RSA的安全性是基于加密函数ek(x)=xe(mod n)是一个单向函数,所以对的人来说求逆计算不可行。而Bob能解密的陷门是分解n=pq,知 (n)=(p-1)(q-1)。从而用欧氏算法解出解密私钥d.
4 RSA密码体制的实现
实现的步骤如下:Bob为实现者
(1)Bob寻找出两个大素数p和q
(2)Bob计算出n=pq和 (n)=(p-1)(q-1).
(3)Bob选择一个随机数e(0<e<  (n)),满足(e,  (n))=1
(4)Bob使用辗转相除法计算d=e-1(mod  (n))
(5)Bob在目录中公开n和e作为她的公开钥。
密码分析者攻击RSA体制的关键点在于如何分解n。若分
解成功使n=pq,则可以算出φ(n)=(p-1)(q-1),然后由公
开的e,解出秘密的d。(猜想:攻破RSA与分解n是多项式
等价的。然而,这个猜想至今没有给出可信的证明!!!)
于是要求:若使RSA安全,p与q必为足够大的素数,使
分析者没有办法在多项式时间内将n分解出来。建议选择
p和q大约是100位的十进制素数。 模n的长度要求至少是
512比特。EDI攻击标准使用的RSA算法中规定n的长度为
512至1024比特位之间,但必须是128的倍数。国际数字
签名标准ISO/IEC 9796中规定n的长度位512比特位。
为了抵抗现有的整数分解算法,对RSA模n的素因子
p和q还有如下要求:
(1)|p-q|很大,通常 p和q的长度相同;
(2)p-1 和q-1分别含有大素因子p1和q1
(3)P1-1和q1-1分别含有大素因子p2和q2
(4)p+1和q+1分别含有大素因子p3和q3

为了提高加密速度,通常取e为特定的小整数,如EDI国际标准中规定 e=216+1,ISO/IEC9796中甚至允许取e=3。这时加密速度一般比解密速度快10倍以上。 下面研究加解密算术运算,这个运算主要是模n的求幂运算。着名的“平方-和-乘法”方法将计算xc(mod n)的模乘法的数目缩小到至多为2l,这里的l是指数c的二进制表示比特数。若设n以二进制形式表示有k比特,即k=[log2n]+1。 由l≤ k,这样xc(mod n)能在o(k3)时间内完成。(注意,不难看到,乘法能在o(k2)时间内完成。)

平方-和-乘法算法:
指数c以二进制形式表示为:

c=
Xc=xc0×(x2)c1×…×(x2t-1)ct-1
预计算: x2=xx
x4=x22=x2x2
.
.
.
x2t-1 =x2t-2*x2t-2
Xc计算:把那些ci=1对应的x2i全部乘在一起,便得xc。至
多用了t-1次乘法。请参考书上的177页,给出计算
xc(mod n)算法程序:
A=xc c=c0+c12+..+ct-12t-1= [ct-1,....,c1,c0]2
5 RSA签名方案

签名的基本概念
传统签名(手写签名)的特征:
(1)一个签名是被签文件的物理部分;
(2)验证物理部分进行比较而达到确认的目的。(易伪造)
(3)不容易忠实地“”!!!
定义: (数字签名方案)一个签名方案是有签署算法与验
证算法两部分构成。可由五元关系组(P,A,K,S,V)来刻化:
(1)P是由一切可能消息(messages)所构成的有限集合;
(2)A是一切可能的签名的有限集合;
(3)k为有限密钥空间,是一些可能密钥的有限集合;
(4)任意k ∈K,有签署算法Sigk ∈ S且有对应的验证算法Verk∈V,对每一个
Sigk:p A 和Verk:P×A {真,假} 满足条件:任意x∈ P,y∈ A.有签名方案的一个签名:Ver(x,y)= {
注:1*.任意k∈K, 函数Sigk和Verk都为多项式时间函数。
2*.Verk为公开的函数,而Sigk为秘密函数。
3*.如果坏人(如Oscar)要伪造Bob的对X的签名,在计算上是不可能的。也即,给定x,仅有Bob能计算出签名y使得Verk(x,y)=真。
4*.一个签名方案不能是无条件安全的,有足够的时间,Oscar总能伪造Bob的签名。
RSA签名:n=pq,P=A=Zn,定义密钥集合K={(n,e,p,q,d)}|n=pq,d*e1(mod (n))}
注意:n和e为公钥;p,q,d为保密的(私钥)。对x∈P, Bob要对x签名,取k∈K。Sigk(x) xd(mod n)y(mod n)
于是
Verk(x,y)=真 xye(mod n)
(注意:e,n公开;可公开验证签名(x,y)对错!!也即是否为Bob的签署)
注:1*.任何一个人都可对某一个签署y计算x=ek(y),来伪造Bob对随机消息x的签名。
2*.签名消息的加密传递问题:假设Alice想把签了名的消息加密送给Bob,她按下述方式进行:对明文x,Alice计算对x的签名,y=SigAlice(x),然后用Bob的公开加密函数eBob,算出
Z=eBob(x,y) ,Alice 将Z传给Bob,Bob收到Z后,第一步解密,
dBob(Z)=dBobeBob(x,y)=(x,y)
然后检验
VerAlice(x,y)= 真
问题:若Alice首先对消息x进行加密,然后再签名,结果
如何呢?Y=SigAlice(eBob(x))
Alice 将(z,y)传给Bob,Bob先将z解密,获取x;然后用
VerAlice检验关于x的加密签名y。这个方法的一个潜在问
题是,如果Oscar获得了这对(z,y),他能用自己的签名来
替代Alice的签名
y=SigOscar(eBob(x))
(注意:Oscar能签名密文eBob(x),甚至他不知明文x也能做。Oscar传送(z,y )给Bob,Bob可能推断明文x来自Oscar。所以,至今人么还是推荐先签名后加密。)
6.EIGamal方案

EIGamal公钥密码体制是基于离散对数问题的。设P
至少是150位的十进制素数,p-1有大素因子。Zp为有限域,
若α为Zp中的本原元,有Zp* =<α>。若取β∈Zp*=Zp\{0},
如何算得一个唯一得整数a,(要求,0≤a≤ p-2),满足
αa=β(mod p)
将a记为a=logαβ
一般来说,求解a在计算上是难处理的。
Zp*中的Egamal公钥体制的描述:设明文空间为P=Zp*,密文空
间为C=Zp*×Zp*,定义密钥空间K={(p, α,a, β )|β=αa(mod p)}
公开钥为:p, α ,β
秘密钥(私钥):a
Alice 取一个秘密随机数k∈ Zp-1,对明文x加密
ek(x,k)=(y1,y2)
其中, y1=αk(mod p),y2=xβk(mod p)
Bob解密,
dk(y1,y2)=y2(y1α)-1(mod p)
注:1*.容易验证y2(y1α)-1=x(αa)k(αka)-1=x !!
2*.利用EIGamal加密算法可给出基于此的签名方案:
Alice 要对明文x进行签名,她首先取一个秘密随机数k作
为签名
Sigk(x,k)=( ,  )
其中 =αk(mod p), =(x-a )k-1(mod p-1)
对x, ∈Zp*和 ∈ Zp-1,定义Verk(x, ,)=真等价于
βα=αx(mod p)
要说明的是,如果正确地构造了这个签名,那么验证将
是成功的,因为
βα= αa αk (mod p)= αa+k (mod p)
由上面知道, =(x- a)k-1(mod p-1)可以推出
k=x- a(mod p-1)有a+kx(mod p)
所以 β  = αx (mod p)
该签名方案已经被美国NIST(国家标准技术研究所)确定为签名标准(1985)。

有关RSA方面的内容,请访问网址:
www.RSAsecurity.com

⑸ 渐进sig和精确sig怎么算

很早之前的问题了,我来回答下吧:卡方检验一般是看精确双侧,除非你在理论上有所依据时,可以看精确单侧。在2X2表格中,特别是某格的预期次数要小于等于5的2X2表,需要看修正的卡方,其中以Fisher的较为准确。

⑹ 如何理解贝叶斯估计

根据贝叶斯公式,进行统计推断,
在垃圾邮件分类方面应用很广,方法简单,具有很好的稳定性和健壮性

⑺ 数字签名程序生成的是什么举例说明!

数字签名程序生成的是什么?举例说明!
:需要包含的包
import java.security.*;
import java.io.*;
import java.util.*;
import java.security.*;
import java.security.cert.*;
import sun.security.x509.*
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

二:从文件中读取证书
用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in=new FileInputStream("out.csr");
Certificate c=cf.generateCertificate(in);

String s=c.toString();
三:从密钥库中直接读取证书
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,pass.toCharArray());
java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名

四:JAVA程序中显示证书指定信息
System.out.println("输出证书信息:\n"+c.toString());
System.out.println("版本号:"+t.getVersion());
System.out.println("序列号:"+t.getSerialNumber().toString(16));
System.out.println("主体名:"+t.getSubjectDN());
System.out.println("签发者:"+t.getIssuerDN());
System.out.println("有效期:"+t.getNotBefore());
System.out.println("签名算法:"+t.getSigAlgName());
byte [] sig=t.getSignature();//签名值
PublicKey pk=t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公钥");
for(int i=0;ipkenc.length;i++)System.out.print(pkenc[i]+",");

五:JAVA程序列出密钥库所有条目
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInst......

泸唨尤孚咢懎掺彇塂搑垟枛环抰哒

⑻ matlab如何实现数组中任意个数元素的求和!

给你提供一个暴力算法,思路是:循环开始,把28个数随机打乱,分别取第一个数,前2个、前3个、前4个......数求和,当找到求和满足的为止,循环结束,数组a和那个和自己输入,代码:
clc;
clear;
%一维数组
a=[];
%要满足的目标和
target=50;
sig=1;
while
sig
xuhao=randperm(28);
xuhao_a=a(xuhao);
for
i=1:28
si=sum(xuhao_a(1:i));
if
si==target
index=xuhao(1:i);
index_a=a(index);
sig=0;
break;
end
end
end
index=sort(index);
disp('达到目标求和的数在数组中序号');
disp(index);
disp('满足要求的数');
disp(index_a);
虽然思路是暴力算法,但幸亏你的数据不大,结果出的还是很快的

⑼ 用C++编程实现两个调度算法(如SJF、时间片轮转法、优先权调度、、、)谢谢!

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

/*********************以下是全局数据结构和变量***********************/
/*PCB 结构*/
struct PCB{
int pname;
int pri;
int runtime;
int waittime;
struct PCB *next;
}pcb[7];

/* 运行指针*/
struct PCB *running;

/*高优先级就绪队列头指针*/
struct PCB *Hready;

/*低优先级队列头指针*/
struct PCB *Lready;

/*等待队列头指针*/
struct PCB *wait;

int sig=0;

/**************************以下是函数说明****************************/
/*利用循环实现延迟*/
void delay();

/*模拟进程3-9*/
void proc(struct PCB *running);

/*将node插入到head所指示的队列的尾部*/
void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);

/*进程调度函数*/
int proc_switch();

/*进程等待函数*/
void proc_wait();

/*进程唤醒函数*/
int proc_wakeup();

/************************以下是函数定义及注释************************/
/*主函数*/
main()
{
int i;
/*初始化,创建进程3-9,置低优先级,等待时间为0,
依次插入低优先级队列*/
for(i = 0;i < 7;i++){
pcb[i].pname = i+3;
pcb[i].pri = 0;
pcb[i].waittime = 0;
InsertIntoQueueTail(&Lready,&pcb[i]);
}
/*等待队列和高优先级队列为空*/
wait = NULL;
Hready=NULL;

printf("\nThe process_switch begin:\n");
/*模拟进程调度开始*/
for(;;)
{
switch(sig){
case 0:/*无进程等待调度,打印信息并返回*/
if(!proc_switch())
{
printf("No Process to run,press any key to return:\n");
getchar();
}
break;
case 1:proc_wait();
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:proc(running);
break;
default:printf("\nerror!");
exit(-1);
}
}
}

/*功能:延迟一个时间片*/
/*入口参数:无*/
/*出口参数:无*/
void delay()
{
int i,j;
for(i=0;i<20000;i++)
for(j=0;j<10000;j++)
{
}
}

/*功能:进程3-9*/
/*入口参数:运行指针*/
/*出口参数:无*/
void proc(struct PCB * running)
{
int i;
srand( (unsigned)time( NULL ) );
/*显示当前运行的进程的id*/
printf("\nNow Process %d is running\n",running->pname);
/*当前进程执行running->runtime个时间片*/
for(i=running->runtime;i>0;i--){
/*显示剩余的时间片*/
printf("%d time slice(s) left\n",i);
/*延迟*/
delay();
proc_wakeup();
/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/
if((rand()%1000+1)<100){
printf("Process %d begins to wait.\n",running->pname);
sig=1;
return;
}
}
/*显示时间片耗尽,进程转为低优先级就绪状态*/
printf("Time slices for process %d exhausted.\n",running->pname);
InsertIntoQueueTail(&Hready,running);
sig=0;
return;

}
/*功能:将一个节点插入队列尾部*/
/*入口参数:队列头指针地址head,待插入结点node*/
/*出口参数:无*/
void InsertIntoQueueTail(struct PCB **head,struct PCB *node)
{
struct PCB *p;
node->next=NULL;
/*被插入队列为空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入队列不为空*/
else{
p=*head;
/*找到队列的最后一个结点*/
while(p->next!=NULL) p=p->next;
p->next=node;
}
}

/*功能:进程调度*/
/*入口参数:无*/
/*出口参数:若调度成功,返回1,否则返回0*/

int proc_switch()
{
/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/
while(Hready == NULL && Lready == NULL)
if(!proc_wakeup()) return 0;

/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/
if(Hready != NULL){
running = Hready;
Hready = Hready -> next;
running->runtime = 2;
}
/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,
分配5个时间片*/
else{
running = Lready;
Lready=Lready -> next;
running -> runtime = 5;
}
/*别调度进程的id赋给sig*/
sig = running -> pname;
return 1;
}

/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,
插入等待队列尾部*/
/*入口参数:无*/
/*出口参数:无*/
void proc_wait()
{
struct PCB *p;
running->pri=1;
running->waittime=20;
InsertIntoQueueTail(&wait,running);
sig=0;
return;
}

/*功能:进程唤醒*/
/*入口参数:无*/
/*出口参数:若等待队列为空,则返回0,否则返回1*/
int proc_wakeup()
{
struct PCB *p,*last,*MoveToReady;
p = wait;
/*等待队列为空,返回0*/
if(p == NULL) return 0;

/*延迟*/
delay();
/*等待队列中每个进程的等待时间减1*/
while(p != NULL){
p -> waittime -= 1;
p=p->next;
}
p=wait;
/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/
while(p!=NULL){
if(p -> waittime == 0){
MoveToReady = p;
if (p == wait)
wait = p->next;
else
last -> next = p->next;
p = p -> next;
InsertIntoQueueTail(&Hready,MoveToReady);
}
else{

p = p -> next;
}
}
sig =0;
return 1;
}

⑽ (计算机操作系统)wait操作和signal操作什么意思

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程。 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此 这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿, 所有的哲学家都吃不上饭。 (2) 描述一种没有人饿死(永远拿不到筷子)算法。 考虑了四种实现的方式(A、B、C、D): A.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释 放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会 出现饿死和死锁的现象。 伪码: semaphore chopstick[5]=; semaphore room=4; void philosopher(int i) } B.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法1:利用AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需 要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当 某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足FIFO 的要求, 因此不会出现饥饿的情形。 伪码: semaphore chopstick[5]=; void philosopher(int I) } 方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷 子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。 伪码: semaphore mutex = 1 ; semaphore chopstick[5]=; void philosopher(int I) }

热点内容
缓存数据生产服务 发布:2025-05-16 01:08:58 浏览:583
普通电脑服务器图片 发布:2025-05-16 01:04:02 浏览:970
服务器地址和端口如何区分 发布:2025-05-16 01:03:17 浏览:833
重新编目数据库 发布:2025-05-16 00:54:34 浏览:513
android语音控制 发布:2025-05-16 00:53:50 浏览:265
win8windows无法访问 发布:2025-05-16 00:37:53 浏览:894
八种排序算法 发布:2025-05-16 00:37:17 浏览:55
左旋螺纹数控编程实例 发布:2025-05-16 00:11:49 浏览:10
安卓游戏旧版本从哪个软件下载 发布:2025-05-16 00:00:20 浏览:329
连接聚类算法 发布:2025-05-15 23:55:09 浏览:978