㈠ linux和Windows下的線程,進程編程是一樣的嗎
1、windows里的進程/線程是繼承自OS/2的。在里,"進程"是指一個程序,而"線程"是一個"進程"里的一個執行"線索"。從核心上講,windows的多進程與Linux並無多大的區別,在windows里的線程才相當於Linux的進程,是一個實際正在執行的代碼。但是,windows里同一個進程里各個線程之間是共享數據段的。這才是與Linux的進程最大的不同。
2、在windows下,使用CreateThread函數創建線程,與Linux下創建進程同,windows線程不是從創建處開始運行的,而是由CreateThread指定一個函數,線程就從那個函數處開始運行。此程序同前面的UNIX程序一樣,由兩個線程各列印1000條信息。threadID是子線程的線程號,另外,全局變數g是子線程與父線程共享的,這就是與Linux最大的不同之處。大家可以看出,windows的進程/線程要比Linux復雜,在Linux要實現類似
windows的線程並不難,只要fork以後,讓子進程調用ThreadProc函數,並且為全局變數開設共享數據區就行了,但在windows下就無法實現類似fork的功能了。所以現在windows下的C語言編譯器所提供的庫函數雖然已經能兼容大多數Linux/UNIX的庫函數,但卻仍無法實現fork。
3、對於多任務系統,共享數據區是必要的,但也是一個容易引起混亂的問題,windows下,一個程序員很容易忘記線程之間的數據是共享的這一情況,一個線程修改過一個變數後,另一個線程卻又修改了它,結果引起程序出問題。但在Linux下,由於變數本來並不共享,而由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。
㈡ 在linux中用一個進程創建3個線程,在三個線程分別列印各自的線程id
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#define THREAD_NUM 3
void * thread_handler(void *arg);
void main()
{
int i;
pthread_t tid[THREAD_NUM];
for(i = 0; i < THREAD_NUM; i++){
pthread_create(&tid[i], NULL, thread_handler, NULL);
}
for(i = 0; i < THREAD_NUM; i++){
pthread_join(tid[i],NULL);
}
}
void * thread_handler(void *arg)
{
printf("process id: %d thread id: %lu ", getpid(),pthread_self());
}
㈢ linux怎樣在進程中創建線程
方法一:PS
在ps命令中,「-T」選項可以開啟線程查看。下面的命令列出了由進程號為<pid>的進版程創建的所有線程權。
$ ps -T -p <pid>
「SID」欄表示線程ID,而「CMD」欄則顯示了線程名稱。
方法二: Top
top命令可以實時顯示各個線程情況。要在top輸出中開啟線程查看,請調用top命令的「-H」選項,該選項會列出所有Linux線程。在top運行時,你也可以通過按「H」鍵將線程查看模式切換為開或關。
$ top -H
㈣ Linux中進程和線程的對比與區別
線程和進程是另一對有意義的概念,主要區別和聯系如下:
進程是操內作系統進行資源分容配的基本單位,擁有完整的進程空間。進行系統資源分配的時候,除了CPU資源之外,不會給線程分配獨立的資源,線程所需要的資源需要共享。
線程是進程的一部分,如果沒有進行顯示的線程分配,可以認為進程是單線程的;如果進程中建立了線程,則可認為系統是多線程的。
多線程和多進程是兩種不同的概念。多線程與多進程有不同的資源共享方式。
進程有進程式控制制塊PCB,系統通過PCB對進程進行調度。進程有線程式控制制塊TCP,但TCB所表示的狀態比PCB要少的多。
㈤ Linux編程和進程、線程
給你舉個例子:
比方電腦里你安裝的qq,暴風,迅雷他們都可以單獨獨立運行,那麼我們就可以說qq是一個進程,暴風也是一個進程,迅雷更是一個進程
而要說到什麼是線程,線程是運行在進程里里的程序
舉例qq(線程),我們能同時用qq軟體進行聊天,聽音樂,為什麼呢,這就是線程的優點所在,單獨運行但又不互相干擾,創建線程有兩種方法,線程一定要復寫run方法,用start啟動線程
使用Thread創建線程:
public MyThread extends Thread{
public void run(){
for (int i=0; i<20; i++){
System.out.println(
「my Thread i value: 」+i);
}
使用Runnable創建線程:
public MyThread implements Runnable{
public void run(){
for (int i=0; i<20; i++){
System.out.println(
「my Thread i value: 」+i);
}
對於這兩種方法,實現線程,但是一般情況下我們都用第二種
因為第一種是用繼承的關系,而第二種為實現介面
但是相對於第一種,第二種我們還可以另外繼承類,來擴展功能,所以編程序時比較趨向於用實現的方法寫線程
給你一個完整的例子:
class MyThread implements Runnable{
private int ticket = 5 ; // 假設一共有5張票
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){ // 還有票
System.out.println(Thread.currentThread().getName()+"賣票:ticket = " + ticket-- );
}
}
}
};
public class SyncDemo01{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定義線程對象
Thread t1 = new Thread(mt) ; // 定義Thread對象
Thread t2 = new Thread(mt) ; // 定義Thread對象
Thread t3 = new Thread(mt) ; // 定義Thread對象
t1.start() ;
t2.start() ;
t3.start() ;
}
};
這是一個三線程:
三個線程都start,所以他們可以同時運行,但是又由於電腦cpu只有一個,只能運行一個線程,那麼這三個線程就會去搶,誰搶到誰就線運行,start表示開始運行run方法,導致三個線程共享5個車票,你會發現每次運行結果不一樣,這就是搶的結果,如果把車票寫在run方法里就不一樣了
Thread-0賣票:ticket = 5
Thread-0賣票:ticket = 4
Thread-0賣票:ticket = 3
Thread-2賣票:ticket = 2
Thread-2賣票:ticket = 1
結果二:
Thread-0賣票:ticket = 5
Thread-0賣票:ticket = 4
Thread-0賣票:ticket = 3
Thread-1賣票:ticket = 2
Thread-0賣票:ticket = 1
反正很多答案,自己試。
㈥ linux執行java程序時線程和進程的問題
你這個特徵數據採集應該是屬於計算密集型的使用cpu。在cpu上,所謂的並發執行數版量是取決於你的cpu核數的,比權如,你的cpu是8核的,那麼同一時刻最多隻有8個線程在運行,其它的都會處理於等待狀態。至於為什麼會有23個線程在跑,有可能是你使用了第三方的框架,它們初始化了線程,java啟動的時候也會有線程數比如垃圾回收的線程。
㈦ linux 怎麼查看一個進程的所有線程
1、top -H
手冊中說:-H : Threads toggle
加上這個選項啟動top,top一行顯示一個線程。否則,它一行顯示一個進程版。
2、ps xH
手冊中說:H Show threads as if they were processes
這樣可以查權看所有存在的線程。
3、ps -mp <PID>
手冊中說:m Show threads after processes
這樣可以查看一個進程起的線程數。
更多詳盡的解釋還可以man ps,man top。
㈧ LINUX里進程線程編程
你寫兩個程序, 第一個 helloworld.c
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
然後gcc helloworld.c -o helloworld
寫第二個程序 exc_helloworld.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[], char **environ)
{
pid_t pid;
int stat_val;
pid = fork();
switch (pid)
{
case -1:
perror("Process Creation Failed\n");
exit(-1);
case 0: //子進程
execve("helloworld", argv, environ);
exit(0);
default:
break;
}
wait(&stat_val);
exit(0);
}
然後gcc exe_helloworld.c -o exe_hellworld
最後./exe_helloworld
㈨ linux中多進程程序和多線程程序的區別
IBM有個傢伙做了個測試,發現切換線程context的時候,windows比快一倍多。進出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際編程之後,綜合來看我覺得linux更適合做high performance server,不過在多線程這個具體的領域內,linux還是稍遜windows一點。這應該是情有可原的,畢竟unix家族都是從多進程過來的,而 windows從頭就是多線程的。
如果是UNIX/linux環境,採用多線程沒必要。
多線程比多進程性能高?誤導!
應該說,多線程比多進程成本低,但性能更低。
在UNIX環境,多進程調度開銷比多線程調度開銷,沒有顯著區別,就是說,UNIX進程調度效率是很高的。內存消耗方面,二者只差全局數據區,現在內存都很便宜,伺服器內存動輒若干G,根本不是問題。
多進程是立體交通系統,雖然造價高,上坡下坡多耗點油,但是不堵車。
多線程是平面交通系統,造價低,但紅綠燈太多,老堵車。
我們現在都開跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。
高性能交易伺服器中間件,如TUXEDO,都是主張多進程的。實際測試表明,TUXEDO性能和並發效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應該是對UNIX理解最為深刻的,他們的意見應該具有很大的參考意義。
多線程的優點:
無需跨進程邊界;
程序邏輯和控制方式簡單;
所有線程可以直接共享內存和變數等;
線程方式消耗的總資源比進程方式好;
多線程缺點:
每個線程與主程序共用地址空間,受限於2GB地址空間;
線程之間的同步和加鎖控制比較麻煩;
一個線程的崩潰可能影響到整個程序的穩定性;
到達一定的線程數程度後,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個左右的線程數就快到極限了(線程堆棧設定為1M),如果設定線程堆棧為2M,還達不到1500個線程總數;
線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU
多進程優點:
每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;
通過增加CPU,就可以容易擴充性能;
可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運行的模塊演算法效率低也沒關系;
每個子進程都有2GB地址空間和相關資源,總體能夠達到的性能上限非常大
多線程缺點:
邏輯控制復雜,需要和主程序交互;
需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算
多進程調度開銷比較大;
最好是多進程和多線程結合,即根據實際的需要,每個CPU開啟一個子進程,這個子進程開啟多線程可以為若干同類型的數據進行處理。當然你也可以利用多線程+多CPU+輪詢方式來解決問題……
方法和手段是多樣的,關鍵是自己看起來實現方便有能夠滿足要求,代價也合適。
㈩ Linux系統上如何查看進程(線程)所運行的CPU