1. c語言讀寫文件如何判斷某文件被佔用
FILE*fp;
if((fp=fopen("文件名","r"))==NULL)
{
printf("無法打開文件....");
}
2. unix c中文件讀寫鎖的問題。
其實讀寫鎖和讀寫操作本身沒有聯系。他們是相互獨立的。
鎖的作用就是讓一個線程判斷當前文件有沒有另一個線程正在操作。
a線程給文件加上寫鎖,對於其他線程並不代表它不可寫。它只是告訴其他線程,有線程正在操作這個文件等我解鎖了你們再操作。如果有人不檢查鎖的狀態,直接open 和 write操作依舊可以成功,只不過兩個線程同時寫入數據,文件數據就被破壞了。
所以在open 和 write之前要對文件加寫鎖,如果有其他線程正在操作文件,加鎖過程會被阻塞,直到文件解鎖。
在所有線程中必須在執行文件操作給文件加鎖以等待鎖的狀態。
3. linux下,我試驗了下,串口可以被同時打開多次。我想問串口怎麼以獨占方式打開
沒有辦法。現在的minicom 軟體還不夠完善。
如果你在C語言中訪問串口,可以加讀寫鎖。至於具體操作,不是幾句話能說明白的。這需要你自己查找資料。
4. 嵌入式和Linux操作系統(僅限於專業人士解答,謝謝!)
1,linux 是一個操作系統,和我們常用的Windows操作系統一樣,只不過一般人pc上不習慣用linux操作系統。
2,Linux具有開放免費的優點, 其實安卓的內核就是linux,linux還普遍用在伺服器。可以直接在網上下載。
3,學習嵌入式,1,linux系統的基本操作 ,2linux 系統編程,3,inux 設備驅動開發(包括各種介面驅動開發, iic pci lcd Flash)。 4,arm開發板的使用,內核移植驅動移植,。
4,二級c的基礎就夠了,
5,入門的話只要花時間兩個月就行,學好不好說看個人。
6,不用c++和java,若你會當然更好。
5. 分析怎樣實現的對共享存儲區的互斥和同步
你說的這個是遠程監控和備份,需要在PC1上登錄客戶端軟體通過花生殼或其他域名伺服器域名解析出去,然後你在PC2上面通過解析出來的域名登錄上去進行監控和存儲即可。不過遠程監控效果很一般,圖像也不連續,除非你是光線上網這樣才會好一點。
6. 東秦的操作系統答案第二章
第二章
1. 什麼是前趨圖?為什麼要引入前趨圖?
答:前趨圖(Precedence Graph)是一個有向無循環圖,記為DAG(Directed Acyclic
Graph),用於描述進程之間執行的前後關系。
2. 畫出下面四條語句的前趨圖:
S1=a:=x+y; S2=b:=z+1; S3=c:=a – b; S4=w:=c+1;
答:其前趨圖為:
3. 什麼程序並發執行會產生間斷性特徵?
答:程序在並發執行時,由於它們共享系統資源,為完成同一項任務需要相互合作,致使這
些並發執行的進程之間,形成了相互制約關系,從而使得進程在執行期間出現間斷性。
4.程序並發執行時為什麼會失去封閉性和可再現性?
答:程序並發執行時,多個程序共享系統中的各種資源,因而這些資源的狀態由多個程序改變,致使程序運行失去了封閉性,也會導致其失去可再現性。
5.在操作系統中為什麼要引入進程概念?它會產生什麼樣的影響?
答:為了使程序在多道程序環境下能並發執行,並對並發執行的程序加以控制和描述,在操作系統中引入了進程概念。
影響: 使程序的並發執行得以實行。
6.試從動態性,並發性和獨立性上比較進程和程序?
答:(1)動態性是進程最基本的特性,表現為由創建而產生,由調度而執行,因得不到資源
而暫停執行,由撤銷而消亡。進程有一定的生命期,而程序只是一組有序的指令集合,是靜
態實體。
(2)並發性是進程的重要特徵,同時也是OS 的重要特徵。引入進程的目的正是為了使
其程序能和其它進程的程序並發執行,而程序是不能並發執行的。
(3)獨立性是指進程實體是一個能獨立運行的基本單位,也是系統中獨立獲得資源和獨
立調度的基本單位。對於未建立任何進程的程序,不能作為獨立單位參加運行。
7.試說明PCB 的作用,為什麼說PCB 是進程存在的惟一標志?
答:PCB 是進程實體的一部分,是操作系統中最重要的記錄型數據結構。作用是使一個在
多道程序環境下不能獨立運行的程序,成為一個能獨立運行的基本單位,成為能與其它進程
並發執行的進程。OS是根據PCB對並發執行的進程進行控制和管理的。
8.試說明進程在三個基本狀態之間轉換的典型原因。
答: (1)就緒狀態→執行狀態:進程分配到CPU資源
(2)執行狀態→就緒狀態:時間片用完
(3)執行狀態→阻塞狀態:I/O請求
(4)阻塞狀態→就緒狀態:I/O完成
9.為什麼要引入掛起狀態?該狀態有哪些性質?
答:引入掛起狀態處於五種不同的需要: 終端用戶需要,父進程需要,操作系統需要,對換
北京石油化工學院信息工程學院計算機系5/48
《計算機操作系統》習題參考答案余有明與計07和計G09的同學們編著 5/48
需要和負荷調節需要。處於掛起狀態的進程不能接收處理機調度。
10.在進行進程切換時,所要保存的處理機狀態信息有哪些?
答:進行進程切換時,所要保存的處理機狀態信息有:
(1)進程當前暫存信息
(2)下一指令地址信息
(3)進程狀態信息
(4)過程和系統調用參數及調用地址信息。
11.試說明引起進程創建的主要事件。
答:引起進程創建的主要事件有:用戶登錄、作業調度、提供服務、應用請求。
12.試說明引起進程被撤銷的主要事件。
答:引起進程被撤銷的主要事件有:正常結束、異常結束(越界錯誤、保護錯、非法指令、
特權指令錯、運行超時、等待超時、算術運算錯、I/O 故障)、外界干預(操作員或操作系
統干預、父進程請求、父進程終止)。
13.在創建一個進程時所要完成的主要工作是什麼?
答:
(1)OS 發現請求創建新進程事件後,調用進程創建原語Creat();
(2)申請空白PCB;
(3)為新進程分配資源;
(4)初始化進程式控制制塊;
(5)將新進程插入就緒隊列.
14.在撤銷一個進程時所要完成的主要工作是什麼?
答:
(1)根據被終止進程標識符,從PCB 集中檢索出進程PCB,讀出該進程狀態。
(2)若被終止進程處於執行狀態,立即終止該進程的執行,置調度標志真,指示該進程被
終止後重新調度。
(3)若該進程還有子進程,應將所有子孫進程終止,以防它們成為不可控進程。
(4)將被終止進程擁有的全部資源,歸還給父進程,或歸還給系統。
(5)將被終止進程PCB 從所在隊列或列表中移出,等待其它程序搜集信息。
15.試說明引起進程阻塞或被喚醒的主要事件是什麼?
答:a. 請求系統服務;b. 啟動某種操作;c. 新數據尚未到達;d. 無新工作可做.
16.進程在運行時存在哪兩種形式的制約?並舉例說明之。
答:
(1)間接相互制約關系。舉例:有兩進程A 和B,如果A 提出列印請求,系統已把唯一的
一台列印機分配給了進程B,則進程A 只能阻塞;一旦B 釋放列印機,A 才由阻塞改為就
緒。
(2)直接相互制約關系。舉例:有輸入進程A 通過單緩沖向進程B 提供數據。當緩沖空時,
計算進程因不能獲得所需數據而阻塞,當進程A 把數據輸入緩沖區後,便喚醒進程B;反
之,當緩沖區已滿時,進程A 因沒有緩沖區放數據而阻塞,進程B 將緩沖區數據取走後便
喚醒A。
17.為什麼進程在進入臨界區之前應先執行「進入區」代碼?而在退出前又要執行「退出
區」代碼?
答:為了實現多個進程對臨界資源的互斥訪問,必須在臨界區前面增加一段用於檢查欲訪問
的臨界資源是否正被訪問的代碼,如果未被訪問,該進程便可進入臨界區對資源進行訪問,
並設置正被訪問標志,如果正被訪問,則本進程不能進入臨界區,實現這一功能的代碼為"
北京石油化工學院信息工程學院計算機系6/48
《計算機操作系統》習題參考答案余有明與計07和計G09的同學們編著 6/48
進入區"代碼;
在退出臨界區後,必須執行"退出區"代碼,用於恢復未被訪問標志,使其它進程能再訪問此
臨界資源。
18. 同步機構應遵循哪些基本准則?為什麼?
答:同步機構應遵循的基本准則是:空閑讓進、忙則等待、有限等待、讓權等待
原因:為實現進程互斥進入自己的臨界區。
19. 試從物理概念上說明記錄型信號量wait 和signal。
答:wait(S):當S.value>0 時,表示目前系統中這類資源還有可用的。執行一次wait 操
作,意味著進程請求一個單位的該類資源,使系統中可供分配的該類資源減少一個,因此描
述為S.value:=S.value-1;當S.value<0時,表示該類資源已分配完畢,進程應調用block
原語自我阻塞,放棄處理機,並插入到信號量鏈表S.L中。
signal(S):執行一次signal操作,意味著釋放一個單位的可用資源,使系統中可供分配
的該類資源數增加一個,故執行S.value:=S.value+1 操作。若加1 後S.value≤0,則表
示在該信號量鏈表中,仍有等待該資源的進程被阻塞,因此應調用wakeup 原語,將S.L
鏈表中的第一個等待進程喚醒。
20.你認為整型信號量機制是否完全遵循了同步機構的四條准則?
答:整型信號量機制不完全遵循同步機制的四條准則,它不滿足「讓權等待」准則。
21.如何利用信號量機制來實現多個進程對臨界資源的互斥訪問?並舉例說明之。
答:為使多個進程互斥訪問某臨界資源,只需為該資源設置一互斥信號量mutex,並設其
初值為1,然後將各進程訪問該資源的臨界區CS置於wait(mutex)和signal(mutex)操作
之間即可。這樣,每個欲訪問該臨界資源的進程在進入臨界區之前,都要先對mutex 執行
wait 操作,若該資源此刻未被訪問,本次wait 操作必然成功,進程便可進入自己的臨界區,
這時若再有其他進程也欲進入自己的臨界區,此時由於對mutex 執行wait操作定會失敗,
因而該進程阻塞,從而保證了該臨界資源能被互斥訪問。當訪問臨界資源的進程退出臨界區
後,應對mutex執行signal 操作,釋放該臨界資源。利用信號量實現進程互斥的進程描述
如下:
Var mutex: semaphore:=1;
begin
parbegin
process 1: begin
repeat
wait(mutex);
critical section
signal(mutex);
remainder seetion
until false;
end
process 2: begin
repeat
wait(mutex);
critical section
signal(mutex);
remainder section
until false;
end
parend
22.試寫出相應的程序來描述圖2-17所示的前驅圖。
答:(a)Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); end;
begin wait(c); S4; signal(f); end;
begin wait(d); S5; signal(g); end;
begin wait(e); S6; signal(h); end;
begin wait(f); wait(g); wait(h); S7; end;
parend
end
(b)Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0, 0, 0, 0, 0, 0, 0,0,0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); signal(f); end;
begin wait(c); S4; signal(g); end;
begin wait(d); S5; signal(h); end;
begin wait(e); S6; signal(i); end;
begin wait(f); S7; signal(j); end;
begin wait(g);wait(h); wait(i); wait(j); S8; end;
parend
end
23.在生產者消費者問題中,如果缺少了signal(full)或signal(empty),對執行結果有何影響?
答:
如果缺少signal(full),那麼表明從第一個生產者進程開始就沒有改變信號量full 值,
即使緩沖池產品已滿,但full 值還是0,這樣消費者進程執行wait(full)時認為緩沖池是空
而取不到產品,消費者進程一直處於等待狀態。
如果缺少signal(empty),在生產者進程向n個緩沖區投滿產品後消費者進程才開始從
中取產品,這時empty=0,full=n,那麼每當消費者進程取走一個產品empty 值並不改變,
直到緩沖池取空了,empty 值也是0,即使目前緩沖池有n 個空緩沖區,生產者進程要想
再往緩沖池中投放產品也會因為申請不到空緩沖區被阻塞。
24.在生產消費者問題中,如果將兩個wait 操作即wait(full)和wait(mutex)互換位置,
或者將signal(mutex)與signal(full)互換位置,結果如何?
答:將wait(full)和wait(mutex)互換位置後,可能引起死鎖。考慮系統中緩沖區全滿時,
若一生產者進程先執行了wait(mutex)操作並獲得成功,則當再執行wait(empty)操作時,
它將因失敗而進入阻塞狀態,它期待消費者進程執行signal(empty)來喚醒自己,在此之前,
它不可能執行signal(mutex)操作,從而使試圖通過執行wait(mutex)操作而進入自己的臨
界區的其他生產者和所有消費者進程全部進入阻塞狀態,這樣容易引起系統死鎖。
若signal(mutex)和signal(full)互換位置後只是影響進程對臨界資源的釋放次序,而
不會引起系統死鎖,因此可以互換位置。
25.我們在為某一臨界資源設置一把鎖W,當W=1時表示關鎖,當W=0時表示鎖已打開。
試寫出開鎖和關鎖的原語,並利用他們實現互斥。
答:整型信號量:lock(W): while W=1 do no-op
W:=1;
unlock(W): W:=0;
記錄型信號量:lock(W): W:=W+1;
if(W>1) then block(W, L)
unlock(W): W:=W-1;
if(W>0) then wakeup(W, L)
例子:
Var W:semaphore:=0;
begin
repeat
lock(W);
critical section
unlock(W);
remainder section
until false;
end
26.試修改下面生產者-消費者問題解法中的錯誤:
答: procer:
begin
repeat
…
procer an item in nextp;
wait(mutex);
wait(full); /* 應為wait(empty),而且還應該在wait(mutex)的前面 */
buffer(in):=nextp;
/* 緩沖池數組游標應前移: in:=(in+1) mod n; */
signal(mutex);
/* signal(full); */
until false;
end
consumer:
begin
repeat
wait(mutex);
wait(empty); /* 應為wait(full),而且還應該在wait(mutex)的前面 */
nextc:=buffer(out);
out:=out+1; /* 考慮循環,應改為: out:=(out+1) mod n; */
signal(mutex);/* signal(empty); */
consumer item in nextc;
until false;
end
27.試利用記錄型信號量寫出一個不會出現死鎖的哲學家進餐問題的演算法.
答:Var chopstick:array[0,…,4] of semaphore;
所有信號量均被初始化為1,第i 位哲學家的活動可描述為:
Repeat
Wait(chopstick[i]);
Wait(. chopstick[(i+1) mod 5]);
…
Ea.t ;
…
Signal(chopstick[i]);
Signal(chopstick[(i+1) mod 5])
Ea.t ;
…
Think;
Until false;
28.在測量控制系統中的數據採集任務,把所採集的數據送一單緩沖區;計算任務從該單
緩沖中取出數據進行計算.試寫出利用信號量機制實現兩者共享單緩沖的同步演算法。
答:
a. Var mutex, empty, full: semaphore:=1, 1, 0;
gather:
begin
repeat
……
gather data in nextp;
wait(empty);
wait(mutex);
buffer:=nextp;
signal(mutex);
signal(full);
until false;
end
compute:
begin
repeat
……
wait(full);
wait(mutex);
nextc:=buffer;
signal(mutex);
signal(empty);
compute data in nextc;
until false;
end
b. Var empty, full: semaphore:=1, 0;
gather:
begin
repeat
……
gather data in nextp;
wait(empty);
buffer:=nextp;
signal(full);
until false;
end
compute:
begin
repeat
……
wait(full);
nextc:=buffer;
signal(empty);
compute data in nextc;
until false;
end
29.畫圖說明管程由哪幾部分組成,為什麼要引入條件變數?
答:管程由四部分組成:①管程的名稱;②局部於管程內部的共享數據結構說明;③對該數
據結構進行操作的一組過程;④對局部於管程內部的共享數據設置初始值的語句;
當一個進程調用了管程,在管程中時被阻塞或掛起,直到阻塞或掛起的原因解除,而在此期
間,如果該進程不釋放管程,則其它進程無法進入管程,被迫長時間地等待。為了解決這個
問題,引入了條件變數condition。
30.如何利用管程來解決生產者與消費者問題?
答:首先建立一個管程,命名為ProclucerConsumer,包括兩個過程:
(1)Put(item)過程。生產者利用該過程將自己生產的產品放到緩沖池,用整型變
量count 表示在緩沖池中已有的產品數目,當count≥n 時,表示緩沖池已滿,生產者須
等待。
(2)get(item)過程。消費者利用該過程從緩沖池中取出一個產品,當count≤0
時,表示緩沖池中已無可取的產品,消費者應等待。
PC 管程可描述如下:
type procer-consumer =monitor
Var in,out,count:integer;
buffer:array[0,…,n-1]of item;
notfull,notempty:condition;
procere entry dot(item)
begin
if count>=n then not full.wait;
buffer(in):=nextp;
in:=(in+1)mod n;
count:=count+1;
if notempty.queue then notempty.signal;
end
procere entry get(item)
begin
if count<=0 then not full.wait;
nextc:=buffer(out);
out:=(out+1)mod n;
count:=count-1;
if notfull.quene then notfull.signal;
end
begin in:=out:=0;
count:=0
end
在利用管程解決生產者一消費者問題時,其中的生產者和消費者可描述為:
procer: begin
pepeat
proce an inem in nestp
PC.put(item);
until false;
end
consumer: begin
repeat
PC.get(item);
consume the item in enxtc;
until false;
end
31.什麼是AND信號量?試利用AND信號量寫出生產者一消費者問題的解法。
答:為解決並行帶來的死鎖問題,在wait 操作中引入AND 條件,其基本思想是將進
程在整個運行過程中所需要的所有臨界資源,一次性地全部分配給進程,用完後一次性釋放。
解決生產者-消費者問題可描述如下:
var mutex,empty,full: semaphore:=1,n,0;
buffer: array[0,...,n-1] of item;
in,out: integer:=0,0;
begin
parbegin
procer: begin
repeat
…
proce an item in nextp;
…
wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn為執行生產者進程除empty 外其餘的條件
wait(mutex);
buffer(in):=nextp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
signal(s1,s2,s3,...,sn);
until false;
end
consumer: begin
repeat
wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn 為執行消費者進程除full 外其餘的條件
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
signal(k1,k2,k3,...,kn);
consume the item in nextc;
until false;
end
parend
end
32.什麼是信號量集?試利用信號量集寫出讀者一寫者問題的解法。
答:對AND信號量加以擴充,形成的信號量集合的讀寫機制。
解法:Var RN integer;
L,mx: semaphore:=RN,1;
begin
parbegin
reader:begin
repeat
Swait(L,1,1);
Swait(mx,1,1);
…
perform read operation;
…
Ssignal(L,1);
until false
end
writer:begin
repeat
Swait(mx,1,1;L,RN,0);
perform write operation;
Ssignal(mx,1);
until false
end
parend
end
33.試比較進程間的低級與高級通信工具。
答:用戶用低級通信工具實現進程通信很不方便,效率低,通信對用戶不透明,所有操作都
必須由程序員來實現,而高級通信工具彌補了這些缺陷,用戶直接利用操作系統提供的一組
通信命令,高效地傳送大量的數據。
34.當前有哪幾種高級通信機制?
答:共享存儲器系統、消息傳遞系統以及管道通信系統。
35.消息隊列通信機制有哪幾方面的功能?
答:(1)構成消息(2)發送消息(3)接收梢息(4)互斥與同步。
36.為什麼要在OS 中引入線程?
答:在操作系統中引入線程,則是為了減少程序在並發執行時所付出的時空開銷,使OS具
有更好的並發性,提高CPU的利用率。進程是分配資源的基本單位,而線程則是系統調度的
基本單位。
37.試說明線程具有哪些屬性?
答:(1)輕型實體(2)獨立調度和分派的基本單位(3)可並發執行(4)共享進程資源。
38. 試從調度性,並發性,擁有資源及系統開銷方面對進程和線程進行比較。
答:
(1)調度性。線程在OS 中作為調度和分派的基本單位,進程只作為資源擁有的基本單位。
(2)並發性。進程可以並發執行,一個進程的多個線程也可並發執行。
(3)擁有資源。進程始終是擁有資源的基本單位,線程只擁有運行時必不可少的資源,本
身基本不擁有系統資源,但可以訪問隸屬進程的資源。
(4)系統開銷。操作系統在創建、撤消和切換進程時付出的開銷顯著大於線程。
39. 為了在多線程OS 中實現進程之間的同步與通信,通常提供了哪幾種同步機制?
答:同步功能可以控製程序流並訪問共享數據,從而並發執行多個線程。共有四種同步模型:
互斥鎖、讀寫鎖、條件變數和信號。
40.用於實現線程同步的私用信號量和公用信號量之間有何差別?
答:
(1)私用信號量。當某線程需利用信號量實現同一進程中各線程之間的同步時,可調用創
建信號量的命令來創建一個私用信號量,其數據結構存放在應用程序的地址空間中。
(2)公用信號量。公用信號量是為實現不同進程間或不同進程中各線程之間的同步而設置
的。其數據結構是存放在受保護的系統存儲區中,由OS為它分配空間並進行管理。
41.何謂用戶級線程和內核支持線程?
答:
(1)用戶級線程:僅存在於用戶空間中的線程,無須內核支持。這種線程的創建、撤銷、
線程間的同步與通信等功能,都無需利用系統調用實現。用戶級線程的切換通常發生在一個
應用進程的諸多線程之間,同樣無需內核支持。
(2)內核支持線程:在內核支持下運行的線程。無論是用戶進程中的線程,還是系統線程
中的線 程,其創建、撤銷和切換等都是依靠內核,在內核空間中實現的。在內核空間里還
為每個內核支持線程設置了線程式控制制塊,內核根據該控制塊感知某線程的存在並實施控制。
42.試說明用戶級線程的實現方法。
答:用戶級線程是在用戶空間中的實現的,運行在「運行時系統」與「內核控制線程」的中
間系統上。運行時系統用於管理和控制線程的函數的集合。內核控制線程或輕型進程LWP
可通過系統調用獲得內核提供服務,利用LWP進程作為中間系統。
43.試說明內核支持線程的實現方法。
答:系統在創建新進程時,分配一個任務數據區PTDA,其中包括若干個線程式控制制塊TCB
空間。創建一個線程分配一個TCB,有關信息寫入TCB,為之分配必要的資源。當PTDA
中的TCB 用完,而進程又有新線程時,只要所創建的線程數目未超過系統允許值,系統可
在為之分配新的TCB;在撤銷一個線程時,也應回收線程的所有資源和TCB。
7. 計算機專業學的是什麼
裝機,不需要理性思維的小兒科玩藝,有經驗的非文盲就可以勝任。計算機專業畢業不知道音效卡需要驅動,那是計算機的體系結構沒有學好,不知道如何裝雙系統,如果看了說明書還不會,那是弱智,如果不看說明書就要人家會,那提這種要求的人是弱智。因為雖然操作系統的原理大同小異,但是每個系統的用戶操作介面卻自成體系。 條x翥�艈
國內由於作風浮躁,技術騙子橫行(我曾有幸親炙我國IT界巨象級專家教誨,結果是讓我惶恐不堪,好不容易才憋住了笑),人人都想做管理技術雙專家,而那些大學計算機的專家教授,大多是以前的學生會幹部出身,鑽營本領不小,實干能力(認真的理論研究和實際開發)卻差得很。說到理論知識,其實大多也是一知半解,坑蒙拐騙,故作玄虛之論,其實也許關於狀態機的數學原理和應用策略都沒有搞清楚。 O澟湯嶗h瑍
所以這個「理論知識」很強,要看是真的「很強」還是假的「很強」。如果真的搞復雜系統或者大型系統的軟體開發,良好的理論涵養是必不可少的。例如,如果搞通訊協議軟體的設計和開發,在國外,如果要確保項目成功,首先要對通訊協議的原語系統進行數學論證,以確保該系統的自洽性和非冗餘性,以免對一套邏輯混亂的通訊協議投入大量的人力物力進行開發,最後在試運行時卻才發現由於系統矛盾而導致失敗(國外花的是資本家和有選舉權的納稅人的錢,如果把錢砸進水裡聽不見響,那可是非同小可的事情。不象我們這里,花的是國家這個概念的錢)。比如,對於目前流行的TCP/IP協議,就有人進行數學論證,證明是一種比較完美的協議原語系統,只不過我國那些電信技術大師們不知道或者不願意知道罷了,因為他們正以他們文學家、詩人和自稱的民族主義和愛國主義分子的決心,在大幹快上地開發擁有「自主知識產權」的通訊協議系統。據說最近華為被思科質稱鈔襲人家IOS操作系統。抄襲只是可鄙,不算恥辱,可是抄襲的時候連人家的Bug一起偷,就好比到人家家裡偷夜壺的時候把尿一起端回了家,那就是民族的恥辱!這樣急功近利做事方法還有一個更大的害處,那就是剝奪了真正苦幹能乾的理性的技術專家的發展機會,使我們的事業長期徘徊在謊言和剽竊的僵局中無法出頭,長此以往,何談創新? | .?e ?
比如,計算機理論課中的編譯原理,在實際的應用開發中還是非常有用的。舉例說:如果你要開發一套字處理軟體系統,你就要為這套字處理軟體系統的格式系統定義一套描述和標記符號,而讀取和處理這套標記符號的演算法,就是典型的編譯演算法,如果理論知識不強,那隻能傻編。不過國內能理解應用LEX(FLEX)、BISON(YACC)的理論很強的朋友又有幾位?另外,編譯演算法也是開發可配置的框架軟體系統的必須技術。 ?閡清 �?
再比如,國內開發資料庫系統相關軟體,不論C-S模式還是多層模式,基本上不考慮同步和並行問題,把一切都丟給資料庫或者中間件系統,但是這樣的系統是非常低效率的,也是易錯的。對於以面向對象編程方式開發的系統,並行和同步處理尤其是一項復雜的理論問題。這就是SUN公司的Java開發包SDK1.4至今除了synchronized(臨界區機制)之外未能引入其他的類似於POSIX系統的同步和並發機制(例如讀寫鎖、生產者-消費者等)的原因,因為針對面向對象系統的並發和同步機制的構造,還是一項認真的理論課題!(當然,你完全可以以過程編程方式來利用面向對象語言,從而將最初以c語言寫的POSIX的同步和並行機制用JAVA語言翻譯,但那樣就不是一個純的面向對象系統了,就會有種種潛在的副作用,破壞面向對象系統的Robust和可擴展型,降解系統的性能)。不過,Sun公司已經選擇紐約的一位著名的大學教授在研究和開發JDK的同步和並發工具包,估計不久就要包含在JDK中。其中的一部分也已經引入。比如在JDK1.4中新引入的nio包中就包含了FileLock,基本上就是一種讀寫鎖的機制。 E瞉o篂扡�
還有,關於面向對象編程,其實遠不是繼承,重用和《java與模式》這么簡單(後面那本書的作者關於Java的涵養其實有待提高)。關於微軟開發C#來替代C++,其實大有理論背景,那是因為目前的C++有著一種從面向對象系統的觀點來看的一項重大的安全缺陷,只不過我國的主要技術精英終日沉湎於COM+或ADO,忙於拼湊交差系統而沒有悟到而已。 邫x?黖E
所以,千萬不要輕視理論知識,只不過要學會識別真的「理論知識」和偽的「理論知識」,這樣才能使你不至於貽笑大方,妄自尊大。 頁 2oI3exn
另外,信息技術其實內容廣泛,分工細密,安裝機器,實在是一種不需要多少思考的工作,也許根本不能算是一種技術,不會安裝機器,就好比時裝設計大師不會用縫紉機,不算什麼。舉個例子,計算機科學和工程界的泰斗級人物,荷蘭的Dijkstra教授,至死只用鋼筆作文,可是如果沒有他發明的演算法,就不會有現代的操作系統,也不會有現代主要的動態路由協議。所以你不能以你殺魚殺得好為理由去鄙視燒魚燒得好的同志。
8. 網路爬蟲原理 c/c++用到線程池沒
使用Synchronized關鍵字使當前線程取得對象TaskQueue的鎖,並用wait和notifyAll函數進行線程間通信。
/* 任務隊列類 */
public class TaskQueue
{
private Queue<url> taskbuffer;
private int taskcount;
private int maxN;
public TaskQueue(int max)
{
maxN = max;
taskbuffer = new Queue<url>(maxN);
taskcount = 0;
}
// 生產者調用的任務入隊操作
public synchronized void addTask(List<url> urlList)
{
while(maxN <= taskcount)// 如果隊列夠大,while語句塊可以略
{
wait(); // 進入TaskQueue對象等待池,釋放鎖
}
while(!urlList.isEmpty())
{
taskbuffer.add(str);
taskcount++;
}
notifyAll(); // 喚醒等待池線程
}
// 消費者調動的任務出隊操作
public synchronized url getTask()
{
while(taskcount <= 0)
{
wait();
}
url str = taskbuffer.pop();
taskcount--;
return str;
}
}
/* 扮演生產者和消費者的網頁抓取線程 */
public class WorkThread extends Thread
{
private TaskQueue taskQueue;
private List<url> urlList;
public WorkThread(TaskQueue tq)
{
taskQueue = tq;
urlList = new List<url>();
}
public List<url> crawl(url str)
{
/* crawl and parse the page str
* return the parse link list of page str
*/
}
public void run()
{
try {
while (true) {
Thread.sleep(1000);
url str = taskQueue.getTask(); // 扮演消費者
urlList = crawl(str); // 略去url去重,詳見讀寫鎖模式
tastQueue.addTask(urlList); // 扮演生成者
}
} catch (InterruptedException e) {
}
}
}
9. C語言中兩個數值的判斷是否會引起資源競爭(多線程)
是否競爭其實是取決於類型的
如果cpu可以一次性處理,那麼不會,也就是int或者以下的沒問題
如果是double的話就會有
10. c或者c++普通互斥鎖怎麼實現讀寫鎖
如果是單線程 不需要上鎖。
如果是多線程,那麼在訪問共享區域的時候(共享內存,或者全局變數),在每次讀或者寫之前,上鎖。
在讀寫結束後,再解鎖就可以了。