當前位置:首頁 » 文件傳輸 » 順序代碼可以多進程訪問嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

順序代碼可以多進程訪問嗎

發布時間: 2022-05-23 05:02:29

『壹』 一個處理器上可以有多個進程嗎

. 進程管理

(1) 進程與程序的區別

程序
進程

是一組有序的指令集,是一個靜態的概念;同一個程序可以被幾個進程同時執行;程序可以作為一種軟體資源長期保存;程序是進程運行的靜態文本,沒有程序就沒有進程。
是程序的一次執行過程,是一個動態的概念;一個進程可以執行一個或幾個程序;進程只是一次執行活動,是暫時的。操作系統可以為一個作業創建一個或多個進程。 進程可以並行運行。

(2) 處理機狀態:CPU在交替執行操作系統和用戶程序時,根據所運行程序對機器指令的使用許可權(操作系統可使用特權指令,用戶程序只能使用非特權指令),將處理機設置為兩種狀態:

管理態(又稱核心態、管態、特權態):此時程序不受硬體限制,可執行操作系統的全集,可訪問全部存儲器和寄存器。操作系統一般在此態運行。

用戶態(又稱目標態、目態、普通態、問題態):由於受硬體的限制,程序只能執行非特權指令,訪問有限的存儲空間和指定的寄存器。用戶程序通常都在此態下運行。

(3)進程的狀態

就緒態:指進入內存的進程准備就緒,等待獲得CPU的狀態(即已具備運行條件,但因CPU被別的進程佔用,暫時不能運行)。

系統中處於就緒態的進程可以有多個。

運行態:當一個進程已分配到處理機,它的程序正由處理機執行著的狀態。

阻塞態:進程因等待某一件事情(如等待I/O設備)而暫時不能運行的狀態,此時即使處理機空閑,進程也無法使用。系統中處於阻塞態(又稱封鎖態、等待態、睡眠態)的進程也可以有多個。

(4)進程的組成

程序: 描述了進程所要完成的功能。 是進程存在的物質基礎。

數據: 是程序加工的對象。

進程式控制制塊PCB:用來描述進程的一切靜態和動態的特徵,操作系統只能通過它來感知和管理進程。每個進程都有且僅有一個進程式控制制塊。

進程式控制制塊的內容:PCB的具體內容隨不同系統而異,一般包括以下信息:

· 進程標識: 唯一地標識進程的名稱或代碼

· 進程狀態: 標識進程是運行態、就緒態或阻塞態

· 進程實體: 指示進程的程序部分和數據部分在存儲器中的位置和大小

· 調度信息(優先數): 確定就緒進程轉為運行進程的優先順序

· 資源信息: 描述內存佔用、外設佔用等信息

· 現場信息: 包括程序計數器、程序狀態字、累加器、變址寄存器的當前值

· 進程通信信息:用於進程間的通信

(5) 進程的特徵

動態性:指每個進程都有一個「 創建→執行→撤消」的生存期,在執行期間會經歷一個 「等待→就緒→運行」 的狀態變化,是動態地產生和消亡的。

並發性:指系統中可以同時存在多個進程,這些進程可以並地運行,在時間上可以部分地重疊。

非同步性:指各個進程在邏輯上是獨立的,它們在運行過程中按照各自的、不可預知的速度向前推進。

制約性:指各進程之間可以直接或間接地相互制約。

(6) 進程式控制制: 指操作系統對全部進程實施有效的管理,進行進程的創建、撤消及更換實體等工作。進程式控制制是通過原語(primitive)實現的。

(7) 原語: 是由若干條機器指令構成的、完成某一特定功能的程序段,該程序段的執行是不可中斷的。常用的進程式控制制原語主要有以下幾種:

創建原語:即根據進程調用者提供的有關程序和數據建立該進程的PCB。

撤消原語:當一個進程完成其任務後,撤消該進程的PCB,同時釋放它所佔用的所有資源。

阻塞原語:當某進程在運行過程中需要等待某個事件發生時,則由該進程調用阻塞原語把進程從運行狀態轉為阻塞狀態,以便釋放它所佔用的處理機。

喚醒原語:一個因等待某個事件而處於阻塞態的進程,一旦等待的事件已經發生,就要用喚醒原語將其轉為就緒態,以等待分配處理機。

常用的進程式控制制原語還有:調度進程運行原語、掛起進程原語、解除進程掛起原語、改變進程優先數原語等。

(8) 進程調度演算法:是處理器的分配策略,常用的有: 先進先出法(First In First Out)、優先數法(Priority)、輪轉調度(Round Robin)、分級調度。

(9) 進程通信: 即在進程之間交換信息,使整個系統有秩序地運行。

1) 低級進程通信:即信號量的P-V操作。信號量是用來表示系統資源物理實體的一種特殊變數,通常用S(整型數)表示;操作系統利用信號量的狀態來對進程和資源進行管理。

P操作 P(S)
V操作 V(S)

一般代表當前進程申請某種資源
一般代表當前進程釋放所佔用的資源

S:=S-1,即每執行一次P操作,S被減1
S:=S+1,即每執行一次V操作,S被加1

若 S≥0該進程繼續執行,否則置該進程為「阻塞」狀態,並使其在S信號量的隊列中等待,直到其它進程在S上執行V操作釋放它為止。
若 S> 0該進程繼續執行,否則釋放S信號量隊列中第一個等待者,改變其「阻塞」狀態。

2) 高級進程通信:包括消息緩沖通信、管道通信和信箱通信。

2. 作業管理

(1) 基本概念

作 業: 指用戶要求計算機進行計算或處理的一個相對獨立的任務。

作業步: 指對一個作業進行順序處理的工作步驟。

作業的狀態:

提交狀態 用戶准備好作業程序、相關數據和作業說明書並提交給系統

後備狀態 等待運行的作業在等待進入內存和分配處理機的狀態

運行狀態 系統挑選若干作業送入內存並按一定策略使其在處理機上運行

完成狀態 作業運行結束,系統收回被占資源,並使其退出系統

『貳』 vc++一個進程負責寫入共享區,然後多個進程讀取,會有什麼異常嗎

WinSock(Windows Sockets)是處理網路通信的Windows API。許多函數與在BSD中使用的Berkely套接字函數是相同的。套接字,簡單的說就是通信雙方的一種約定,用套接字中的相關函數來完成通信過程。

應用層通過傳輸層進行數據通信時,TCP和UDP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個TCP協議埠傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了稱為套接字(Socket)的介面。

Socket可以看成在兩個程序進行通訊連接中的一個端點(endpoint),一個程序將一段信息寫入Socket中,該Socket將這段信息發送給另外一個Socket中,使這段信息能傳送到其他程序中。一般一個server伺服器對應很多客戶端client連接,伺服器必須維護一張客戶連接列表,每增加一個客戶端連接伺服器端都要新建一個套接字負責與新增客戶端進行對話通信。

傳輸套接字主要有兩類:流式套接字(SOCK_STREAM)和數據報套接字(SOCK_DGRAM)。流類型的套接字是為需要可靠連接的應用程序設計的。這些程序通常使用連續的數據流。用於這種類型套接字的協議是TCP,適合FTP這類實現。流套接字是最常用的,一些眾所周知的協議如HTTP、TCP、SMTP、POP3等都是基於面向流的協議。

數據報套接字使用UDP做為下層協議,是無連接的,有一個最大緩沖區大小(數據包大小的最大值)。它是為那些需要發送小數據包,並且對可靠性要求不高的應用程序設計的。與流式套接字不同,數據報套接字並不保證數據會到達終端,也不保證它是以正確的順序到來的。數據報套接字的傳輸效率相當高,它經常用於音頻或視頻應用程序。對這些程序來說,速度比可靠性更加重要。

一個連接由(server_ip, server_port)和(client_ip, client_port)唯一確定。你可以調用getsockname()函數獲取與某個套接字關聯的本地地址,調用getpeername()函數獲取與某個套接字關聯的目的地址。

套接字有阻塞(鎖定)和非阻塞(非鎖定)兩種模式。非阻塞和阻塞描述的是WinSock API調用行為特性。

在一個阻塞套接字上調用任何WinSock API函數(accept()/recv()/send()),都會耗費或長或短的時間「等待」返回,這會阻塞調用線程。直到有點數據可讀或可寫時,這種調用才返回。

阻塞模式的優點是符合時序,容易入手。缺點也是顯而易見的,假設這樣一種情景,一個線程中要處理多個客戶(套接字A、B),我們在套接字A、B上順序調用recv企圖依次接收數據。若客戶A始終不發數據,則recv(A)函數將可能永遠無法返回,在這期間我們錯失了客戶B發送來的數據。

大多數WinSock應用都遵循「生產者-消費者」模型,應用程序需要讀取(或寫入)指定數量的位元組,然後再對讀取的數據執行一些計算。在應用程序中,可以為每個套接字都創建一個負責讀取網路數據的讀線程(ReadThread),以及一個負責對數據執行計算的數據處理線程(ProcessThread)。盡管這會增大一些開銷,但的確是一種可行的方案。缺點便是擴展性極差,而且無法應對大規模的通信情況。

將一個套接字置為非阻塞模式之後,WinSock API調用會立即返回。大多數情況下,這些調用都會「失敗」(SOCKET_ERROR),並返回一個WSAEWOULDBLOCK錯誤。它意味著請求的操作在調用期間沒有時間完成。舉個例子來說,假如在系統的輸入緩沖區中,尚不存在「待決」的數據,那麼recv()調用就會返回WSAEWOULDBLOCK錯誤。通常,我們需要重復調用同一個函數(輪詢),直至獲得一個成功返回代碼。

假如需要編寫更多的代碼,以便在每個 Winsock調用中,對收到一個WSAEWOULDBLOCK錯誤的可能性加以應付,那麼非阻塞套接字便顯得有些難於操作。在這些情況下,可考慮使用「套接字I/O模型」,它管理I/O完成通知,幫助應用程序判斷套接字何時可供讀寫。

套接字模式討論的是套接字函數的調用特性,而I/O模型討論的是調用背後的行為特性。

當CPU執行代碼(當前活動線程)時遇上一個I/O請求(例如調用ReadFile()/WriteFile()或recv()/send())時,系統產生一個中斷,當前活動線程阻塞在此,讓CPU去完成這個I/O請求,等到完成後,系統再次產生一個中斷讓原先的程序繼續運行。也就說通過中斷保持這兩者間的同步,可以將中斷理解為硬體化的信號量。

這就是所謂的同步I/O,一個線程中只可能同時處理一個I/O請求。因為一個I/O操作是非常耗時的,所以代碼掛起後等待I/O完成的這段時間內,這個線程浪費了很多個指令周期。如果要同時反復讀寫大文件,則同步I/O的效率是很低的。

當然,可以考慮使用多線程來處理。例如在設計伺服器時可以使用多線程來處理客戶請求,每有一個客戶連接請求,就創建一個新線程,專門處理它的通信請求。對於小型伺服器來說,這不是問題。對於同時處理成千上萬個請求的大型伺服器而言,使用多線程是無效的,因為系統能夠支持的線程數量畢竟是有限制的。另外一種解決方案就是使用共享負載的線程池,這涉及到非同步I/O。

『叄』 java 多線程按指定順序輪流執行!!

個人分析:
難點1:如何保證線程按ABCD這樣的順序啟動
難點2:如何保證線程一直按ABCD這樣的順序執行
做了一個簡單的程序,執行結果是可以的,但是這樣的缺點是完全沒有發揮多線程的優勢,程序代碼如下,也請高手指點指點。
//用於產生從1到100的數
package org.ghand.thread.tfive;
public class Sequence {
private int num=1;
public int getNext(){
return num++;
}
}
//線程定義
package org.ghand.thread.tfive;
public class SequenceThread extends Thread {
private Sequence sequence;
private int order;
private SequenceThread next;
public boolean started=false;
public SequenceThread(String name,int or,Sequence se){
this.setName(name);
this.sequence=se;
this.order=or;
}
public void setNext(SequenceThread next){
this.next=next;
}
public void run(){
int num=sequence.getNext();
this.started=true;
while(num<101){
if(num%4==order){
System.out.println(getName()+":"+num);
if(this.next.started){
synchronized (this.next) {
this.next.notify();
}}else{
this.next.start();
}
try {
synchronized (this) {
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
num=sequence.getNext();
}
//
}
System.exit(0);
}
}
//測試主函數
package org.ghand.thread.tfive;
public class TestSequence {
/**
* @param args
*/
public static void main(String[] args) {
Sequence sequ=new Sequence();
SequenceThread a=new SequenceThread("A",1,sequ);
SequenceThread b=new SequenceThread("B",2,sequ);
SequenceThread c=new SequenceThread("C",3,sequ);
SequenceThread d=new SequenceThread("D",0,sequ);
a.setNext(b);
b.setNext(c);
c.setNext(d);
d.setNext(a);
a.start();
}
}
QQ:20196550 多交流

『肆』 在分時/多任務系統里,如果兩個進程同時訪問同一個文件

線程和進程都是現在電腦概念里比較時髦的用語,什麼是多線程,什麼是多進程?本文詳細的給您介紹一下,希望能增進您對當代電腦技術的了解,有不到之處,還往高手予以更正。進程(英語:Process,中國大陸譯作進程,台灣譯作行程)是計算機中已運行程序的實體。進程本身不會運行,是線程的容器。程序本身只是指令的集合,進程才是程序(那些指令)的真正運行。若干進程有可能與同一個程序相關系,且每個進程皆可以同步(循序)或不同步(平行)的方式獨立運行。進程為現今分時系統的基本運作單位 線程(英語:thread,台灣譯為運行緒),操作系統技術中的術語,是操作系統能夠進行運算調度的最小單位。它被包涵在進程之中,一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內核線程(kernel thread),而把用戶線程(user thread)稱為線程。 線程是獨立調度和分派的基本單位。線程可以操作系統內核調度的內核線程,如Win32 線程;由用戶進程自行調度的用戶線程,如Linux Portable Thread; 或者由內核與用戶進程,如Windows 7的線程,進行混合調度。 同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。 一個進程可以有很多線程,每條線程並行執行不同的任務。 在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設計的好處是顯而易見,即提高了程序的執行吞吐率。在單CPU單核的計算機上,使用多線程技術,也可以把進程中負責IO處理、人機交互而常備阻塞的部分與密集計算的部分分開來執行,編寫專門的workhorse線程執行密集計算,從而提高了程序的執行效率 進程是資源分配的最小單位,線程是CPU調度的最小單位。線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和CPU。 多進程: 進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分為系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;所有由用戶啟動的進程都是用戶進程。進程是操作系統進行資源分配的單位。 進程又被細化為線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間里,同一個計算機系統中如果允許兩個或兩個以上的進程處於運行狀態,這便是多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。 多任務帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔列印出來,而這些任務之間絲毫不會相互干擾。那麼這里就涉及到並行的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個進程,以便運行這個進程。我們通常使用的計算機中只有一個CPU,也就是說只有一顆心,要讓它一心多用,同時運行多個進程,就必須使用並發技術。實現並發技術相當復雜,最容易理解的是「時間片輪轉進程調度演算法」,它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許佔用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程佔有CPU。 如果一台計算機有多個CPU,情況就不同了,如果進程數小於CPU數,則不同的進程可以分配給不同的CPU來運行,這樣,多個進程就是真正同時運行的,這便是並行。但如果進程數大於CPU數,則仍然需要使用並發技術。 進行CPU分配是以線程為單位的,一個進程可能由多個線程組成,這時情況更加復雜,但簡單地說,有如下關系: 匯流排程數<= CPU數量:並行運行 匯流排程數> CPU數量:並發運行 並行運行的效率顯然高於並發運行,所以在多CPU的計算機中,多任務的效率比較高。但是,如果在多CPU計算機中只運行一個進程(線程),就不能發揮多CPU的優勢。 這里涉及到多任務操作系統的問題,多任務操作系統(如Windows)的基本原理是:操作系統將CPU的時間片分配給多個線程,每個線程在操作系統指定的時間片內完成(注意,這里的多個線程是分屬於不同進程的).操作系統不斷的從一個線程的執行切換到另一個線程的執行,如此往復,宏觀上看來,就好像是多個線程在一起執行.由於這多個線程分屬於不同的進程,因此在我們看來,就好像是多個進程在同時執行,這樣就實現了多任務 多線程:在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進程。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些「中斷服務常式」,主進程的暫停是通過硬體級的中斷實現的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求。 最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那麼每個線程都可分配給一個不同的處理器,真正進入「並行運算」狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那麼程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一台列印機。為解決這個問題,對那些可共享的資源來說(比如列印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。 多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。 一個採用了多線程技術的應用程序可以更好地利用系統資源。其主要優勢在於充分利用了CPU的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。更為重要的是,由於同一進程的所有線程是共享同一內存,所以不需要特殊的數據傳送機制,不需要建立共享存儲區或共享文件,從而使得不同任務之間的協調操作與運行、數據的交互、資源的分配等問題更加易於解決。進程間通信(IPC,Inter-Process Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源並進行協調工作,才有了進程間通信。這些進程可以運行在同一計算機上或網路連接的不同計算機上。 進程間通信技術包括消息傳遞、同步、共享內存和遠程過程調用。

『伍』 java多線程問題:多個線程訪問同一資源時如何保證線程之間訪問的順序性。

這個需要鎖,當a敲完時,加一把鎖,然後只能b解開,然後b敲完,加一把鎖,只能a解開,這樣他們就會這樣執行下去,其實這個原理在socket中有用到,你可以看看

『陸』 access資料庫支持多進程訪問嗎

  1. Access資料庫不支持多進程訪問。ACCESS是典型的單線程軟體用ACCESS本身不能修改自身線程,除非使用API,但是那肯定不穩定,得不償失。另外,所謂的ACCESS線程不過是調用MDB。不過,只要不使用獨占方式打開,可以實現多個程序同時訪問MDB。

  2. Access資料庫支持VB、ASP、Unity3D、Java等的訪問。Access 最多支持 255 個並且用戶 Access 支持的最大資料庫大小為 2 GB。

『柒』 線程、進程在跨線程(進程)訪問內存,許可權有什麼不同


說法一:進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.

一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行

說法二:進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

線程的劃分尺度小於進程,使得多線程程序的並發性高。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

說法三:多線程共存於應用程序中是現代操作系統中的基本特徵和重要標志。用過UNIX操作系統的讀者知道進程,在UNIX操作系統中,每個應用程序的執行都在操作系統內核中登記一個進程標志,操作系統根據分配的標志對應用程序的執行進行調度和系統資源分配,但進程和線程有什麼區別呢?

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:

線程的劃分尺度小於進程,使得多線程程序的並發性搞。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程(Process)是最初定義在Unix等多用戶、多任務操作系統環境下用於表示應用程序在內存環境中基本執行單元的概念。以Unix操作系統為例,進程是Unix操作系統環境中的基本成分、是系統資源分配的基本單位。Unix操作系統中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統對應用程序進程的控制來實現的。

C、C++、Java等語言編寫的源程序經相應的編譯器編譯成可執行文件後,提交給計算機處理器運行。這時,處在可執行狀態中的應用程序稱為進程。從用戶角度來看,進程是應用程序的一個執行過程。從操作系統核心角度來看,進程代表的是操作系統分配的內存、CPU時間片等資源的基本單位,是為正在運行的程序提供的運行環境。進程與應用程序的區別在於應用程序作為一個靜態文件存儲在計算機系統的硬碟等存儲空間中,而進程則是處於動態條件下由操作系統維護的系統資源管理實體。多任務環境下應用程序進程的主要特點包括:

●進程在執行過程中有內存單元的初始入口點,並且進程存活過程中始終擁有獨立的內存地址空間;

●進程的生存期狀態包括創建、就緒、運行、阻塞和死亡等類型;

●從應用程序進程在執行過程中向CPU發出的運行指令形式不同,可以將進程的狀態分為用戶態和核心態。處於用戶態下的進程執行的是應用程序指令、處於核心態下的應用程序進程執行的是操作系統指令。

在Unix操作系統啟動過程中,系統自動創建swapper、init等系統進程,用於管理內存資源以及對用戶進程進行調度等。在Unix環境下無論是由操作系統創建的進程還要由應用程序執行創建的進程,均擁有唯一的進程標識(PID)。

說法四:應用程序在執行過程中存在一個內存空間的初始入口點地址、一個程序執行過程中的代碼執行序列以及用於標識進程結束的內存出口點地址,在進程執行過程中的每一時間點均有唯一的處理器指令與內存單元地址相對應。

Java語言中定義的線程(Thread)同樣包括一個內存入口點地址、一個出口點地址以及能夠順序執行的代碼序列。但是進程與線程的重要區別在於線程不能夠單獨執行,它必須運行在處於活動狀態的應用程序進程中,因此可以定義線程是程序內部的具有並發性的順序代碼流。

Unix操作系統和Microsoft Windows操作系統支持多用戶、多進程的並發執行,而Java語言支持應用程序進程內部的多個執行線程的並發執行。多線程的意義在於一個應用程序的多個邏輯單元可以並發地執行。但是多線程並不意味著多個用戶進程在執行,操作系統也不把每個線程作為獨立的進程來分配獨立的系統資源。進程可以創建其子進程,子進程與父進程擁有不同的可執行代碼和數據內存空間。而在用於代表應用程序的進程中多個線程共享數據內存空間,但保持每個線程擁有獨立的執行堆棧和程序執行上下文(Context)。

基於上述區別,線程也可以稱為輕型進程 (Light Weight Process,LWP)。不同線程間允許任務協作和數據交換,使得在計算機系統資源消耗等方面非常廉價。

線程需要操作系統的支持,不是所有類型的計算機都支持多線程應用程序。Java程序設計語言將線程支持與語言運行環境結合在一起,提供了多任務並發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋里,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。

需要注意的是:在應用程序中使用多線程不會增加 CPU 的數據處理能力。只有在多CPU 的計算機或者在網路計算體系結構下,將Java程序劃分為多個並發執行線程後,同時啟動多個線程運行,使不同的線程運行在基於不同處理器的Java虛擬機中,才能提高應用程序的執行效率。

『捌』 shell中多進程實現問題

您好,在bash中,使用後台任務來實現任務的「多進程化」。在不加控制的模式下,不管有多少任務,全部都後台執行。也就是說,在這種情況下,有多少任務就有多少「進程」在同時執行。我們就先實現第一種情況:

實例一:正常情況腳本

#!/bin/bash

for ((i=0;i<5;i++));do

{

sleep 3;echo 1>>aa && echo "done!"

}

done

這種情況下,程序順序執行,每個循環3s,共需15s左右。

實例二:「多進程」實現

#!/bin/bash

for ((i=0;i<5;i++));do

{

sleep 3;echo 1>>aa && echo "done!"

} &

done

這個實例實際上就在上面基礎上多加了一個後台執行&符號,此時應該是5個循環任務並發執行,最後需要3s左右時間。

實例三:多進程」實現,和實例二一樣

#!/bin/sh

for i in 3 4 5 6 7 8 9 10 h1 h2 h3 h4 h5
do
{
sleep 3;echo 1>>aa && echo $i

i=$((i+1))
}&
done

『玖』 Java 如何同步順序執行多個線程

這個要分段來實現, 第一步是讓線程同步,第二部是讓線程有順序。
同步:我們可以用synchronized來解決。
Java線程同步原理: java會為每個object對象分配一個monitor,當某個對象的同步方法(synchronized methods )被多個線程調用時,該對象的monitor將負責處理這些訪問的並發獨占要求。
當一個線程調用一個對象的同步方法時,JVM會檢查該對象的monitor。如果monitor沒有被佔用,那麼這個線程就得到了monitor的佔有權,可以繼續執行該對象的同步方法;如果monitor被其他線程所佔用,那麼該線程將被掛起,直到monitor被釋放。
當線程退出同步方法調用時,該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調用執行下去。就像下面這樣:
public void test() {
synchronized (this) {
//做一些事
//這里只會有一個線程來調用該方法,因為只有一個this對象作為資源分配給該線程
}

}

順序:我們可以用List來解決,因為它是有序的。我們只需要將要執行的線程放入到List中

上代碼:
/**
* 讓多個線程同步順序執行的線程管理器
* @author bianrx
* @date 2012.1.18
* SynchronizedRunMultiThread
*/
public class SyncManager {
/**
* 待執行的線程集合,注意這里必須是Runnable介面類型,下面會解釋
*/
private List<Runnable> runnableList;

public SyncManager(){}

public SyncManager(List<Runnable> runnableList) {
this.runnableList = runnableList;
}

public void setRunnable(List<Runnable> runnableList) {
this.runnableList = runnableList;
}
public void run() {
//遍歷代執行的線程集合
for(Runnable runnable: runnableList) {
runThread(runnable);
}
}

/**
* 按順序同步執行多個線程
* @author bianrx
* @date 2012.1.18
* @param runnable
*/
private void runThread(Runnable runnable) {
synchronized (this) {
runnable.run();//這里需要注意的是:必須調用run方法,因為如果你調用了start方法,線程只會向JVM請求資源,但是未必就執行其中的run。
//這個方法是同步的,所以當前只有一個線程佔用了this對象。
}
}
}

『拾』 python 多進程的順序問題

因為進程池一次只能運行4個進程,0,1,2,3是四個進程同時執行,那麼4隻能等待。當進程池中任意一個進程結束後,4立即執行,所以在0結束後4開始執行,接著1,2,3陸續結束,4最後結束。