程式管理

tengrid發表於2009-05-18

一、程式與執行緒


程式和執行緒的相互比較:

(1)排程:程式是資源擁有的基本單位,執行緒是獨立排程的基本單位(CPU執行的基本單位)

(2)併發性:程式跟執行緒都可以併發

(3)地址空間:程式的地址空間是相互獨立的,同一程式的各個執行緒之間共享程式的資源

(4)通訊方面:程式間通訊需要程式同步和互斥手段的輔助,而執行緒之間可以直接讀寫程式資料段(如全域性變數)來進行通訊


二、處理機排程



三、程式同步


PV操作詳解:

typedef struct{
	int value;//代表資源數目
	struct process *L;//連結所有等待該資源的程式
}semaphore;

void wait(semaphore S)//相當於申請資源
{
	S.value--;
	if(S.value<0)
	{	
		把這個程式新增到等待連結串列;
		block(S.L);//進行自我阻礙,放棄處理機,並插到該類資源的等待佇列S.L中
	}
}

void signal(semaphore S){//相當於釋放資源
	S.value++;
	if(S.value<=0)
	{
		從等待連結串列中摘除一個程式;
		wakeup(P);//將S.L中的第一個等待程式喚醒
	}
}

//生產者-消費者問題
問題描述:一組生產者程式和一組消費者程式共享一個初始為空、大小為n的緩衝區,只有緩衝區沒滿時,生產者才能將訊息放入到緩衝區,
          否則必須等待;只有緩衝區不空時,消費者才能從中取出訊息,否則必須等待。由於緩衝區是臨界資源,它只允許一個生產者放入訊息
		  ,或者一個消費者取出訊息
semaphore mutex=1;//臨界區互斥訊號量
semaphore empty=n;//空閒緩衝區
semaphore full=0;//緩衝區初始化為空
producer(){
	while(1)
	{
		生產一個資料;
		P(empty);//P(empty)必須放在P(mutex)之前,若相反,假如empty=0,當生產者執行時,生產者和消費之都會阻塞,陷入無休止的等待
		P(mutex);
		將資料放入緩衝區;
		V(mutex);
		P(full);
	}
}
consumer(){
	while(1)
	{
		p(full);
		p(mutex);
		從緩衝區取資料;
		V(mutex);
		V(empty);
		消費資料;
	}
}

四、死鎖


銀行家演算法核心思想:

保證系統現有的資源大於任何程式執行還需要的資源,從而找到一個安全序列,保證程式之間不會發生死鎖

相關文章