線程創造進程
A. 進程和它創建的線程之間的關系
進程是應用程序的執抄行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其他各種系統資
源組成的。進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時
被釋放或關閉。
線程是進程內部的一個執行單元(如一個函數或一個活躍的類對象等)。系統創建好進程後,實
際上就啟動執行了該進程的主執行線程。主執行線程終止了,進程也就隨之終止。每一個進程至少有
一個線程(即主執行線程,它無需由用戶去主動創建,是由系統在應用程序啟動後創建的),用戶根
據需要在應用程序中創建其他線程,使多個線程並發地運行在同一個進程中。一個進程中的所有線程
都在該進程的虛擬地址空間中,並使用這些虛擬地址空間、全局變數和系統資源,所以線程之間的通
訊要比進程之間的通訊容易得多。多線程設計在實際中的使用較為廣泛。
B. 在一個線程中可以在創建線程或進程嗎
線程可以創建線程,像Java中,main函數就是一個線程來的,可以在main中創建線程。但是,線程應該不能創建進程。因為進程比線程要宏觀得多。
C. 線程和進程的關系
進程和線程的關系是包含關系,即一個進程包含一個或多個線程。但同時線程與進程是相互依存的,也就是說沒有線程的進程不存在,沒有進程的線程也不存在。一但進程被創建,一個線程也就被自動創建。
D. linux怎樣在進程中創建線程
方法一:PS
在ps命令中,「-T」選項可以開啟線程查看。下面的命令列出了由進程號為<pid>的進程創建的版所有線程權。
$ ps -T -p <pid>
「SID」欄表示線程ID,而「CMD」欄則顯示了線程名稱。
方法二: Top
top命令可以實時顯示各個線程情況。要在top輸出中開啟線程查看,請調用top命令的「-H」選項,該選項會列出所有Linux線程。在top運行時,你也可以通過按「H」鍵將線程查看模式切換為開或關。
$ top -H
E. 點擊「一個線程」按鈕,創建一個線程,不斷輸出「啟動一個進程」;
這個需要用到後台線程執行,否則一運行主線程就卡住了:
public partial class Form1 : Form
{
// 列印放在後台執行
BackgroundWorker m_Worker;
// 用一個標記來看是否請求停止執行
bool m_NeedRun = false;
public Form1()
{
InitializeComponent();
m_Worker = new BackgroundWorker();
m_Worker.DoWork += new DoWorkEventHandler(m_Worker_DoWork);
}
void m_Worker_DoWork(object sender, DoWorkEventArgs e)
{
while( m_NeedRun ) // 後台可以循環列印,不影響主線程的運行
Console.Write( "" );
}
private void button1_Click(object sender, EventArgs e)
{
m_NeedRun = true;
m_Worker.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
m_NeedRun = false;
}
}
F. 創建進程到底比線程多多少開銷
查看最大線程數:
cat /proc/sys/kernel/threads-max
ulimit
User limits - limit the use of system-wide resources.
Syntax
ulimit [-acdfHlmnpsStuv] [limit]
Options
-S Change and report the soft limit associated with a resource.
-H Change and report the hard limit associated with a resource.
-a All current limits are reported.
-c The maximum size of core files created.
-d The maximum size of a process's data segment.
-f The maximum size of files created by the shell(default option)
-l The maximum size that may be locked into memory.
-m The maximum resident set size.
-n The maximum number of open file descriptors.
-p The pipe buffer size.
-s The maximum stack size.
-t The maximum amount of cpu time in seconds.
-u The maximum number of processes available to a single user.
-v The maximum amount of virtual memory available to the process.
ulimit provides control over the resources available to the shell and to processes started by it, on systems that allow such control.
If limit is given, it is the new value of the specified resource. Otherwise, the current value of the soft limit for the specified resource is printed, unless the `-H' option is supplied.
When setting new limits, if neither `-H' nor `-S' is supplied, both the hard and soft limits are set.
Values are in 1024-byte increments, except for `-t', which is in seconds, `-p', which is in units of 512-byte blocks, and `-n' and `-u', which are unscaled values.
The return status is zero unless an invalid option is supplied, a non-numeric argument other than unlimited is supplied as a limit, or an error occurs while setting a new limit.
ulimit is a bash built in command.
G. 什麼工具能禁止進程線程創建
這個不需要工具的你直接在網路搜索一下創建一個REG格式的文件寫入注冊表就搞定了
H. linux中的fork是創建進程還是線程
fork是創建進程,pthread是線程。
I. Java並發編程:如何創建線程,進程
在java中如果要創建線程的話,一般有兩種方式:1)繼承Thread類;2)實現Runnable介面。
1.繼承Thread類
繼承Thread類的話,必須重寫run方法,在run方法中定義需要執行的任務。
123456789101112
class MyThread extends Thread{ private static int num = 0; public MyThread(){ num++; } @Override public void run() { System.out.println("主動創建的第"+num+"個線程"); }}
創建好了自己的線程類之後,就可以創建線程對象了,然後通過start()方法去啟動線程。注意,不是調用run()方法啟動線程,run方法中只是定義需要執行的任務,如果調用run方法,即相當於在主線程中執行run方法,跟普通的方法調用沒有任何區別,此時並不會創建一個新的線程來執行定義的任務。public class Test { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); }} class MyThread extends Thread{ private static int num = 0; public MyThread(){ num++; } @Override public void run() { System.out.println("主動創建的第"+num+"個線程"); }}
在上面代碼中,通過調用start()方法,就會創建一個新的線程了。為了分清start()方法調用和run()方法調用的區別,請看下面一個例子:
212223
public class Test { public static void main(String[] args) { System.out.println("主線程ID:"+Thread.currentThread().getId()); MyThread thread1 = new MyThread("thread1"); thread1.start(); MyThread thread2 = new MyThread("thread2"); thread2.run(); }} class MyThread extends Thread{ private String name; public MyThread(String name){ this.name = name; } @Override public void run() { System.out.println("name:"+name+" 子線程ID:"+Thread.currentThread().getId()); }
J. 一個進程可以創建多少個線程
一個進程可以開啟的線程受可用內存限制,如果是32位的機器,那麼默認一個進程有2G的可專用內存,而屬每個線程默認分析1M的棧空間,所以這種情況下理論最線程數在2000多個。一個解決辦法是創建線程時減少線程棧的大小或是使用64位的系統。64位系統應該可以忽略這個問題了。當然受cpu及磁碟速度及物理內存的限制。不用到達上限值,你的機器應該已經是慢如牛車了。