日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程 线程 多进程 多线程 父进程 子进程

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程 线程 多进程 多线程 父进程 子进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 進程定義:
進程就是一個程序在一個數據集上的一次動態執行過程。進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標志。
舉一例說明進程:
想象一位有一手好廚藝的計算機科學家正在為他的女兒烘制生日蛋糕。他有做生日蛋糕的食譜,廚房里有所需的原料:面粉、雞蛋、糖、香草汁等。在這個比喻中,做蛋糕的食譜就是程序(即用適當形式描述的算法)計算機科學家就是處理器(cpu),而做蛋糕的各種原料就是輸入數據。進程就是廚師閱讀食譜、取來各種原料以及烘制蛋糕等一系列動作的總和。現在假設計算機科學家的兒子哭著跑了進來,說他的頭被一只蜜蜂蟄了。計算機科學家就記錄下他照著食譜做到哪兒了(保存進程的當前狀態),然后拿出一本急救手冊,按照其中的指示處理蟄傷。這里,我們看到處理機從一個進程(做蛋糕)切換到另一個高優先級的進程(實施醫療救治),每個進程擁有各自的程序(食譜和急救手冊)。當蜜蜂蟄傷處理完之后,這位計算機科學家又回來做蛋糕,從他離開時的那一步繼續做下去。

2. 線程的出現是為了降低上下文切換的消耗,提高系統的并發性,并突破一個進程只能干一樣事的缺陷,使到進程內并發成為可能。
假設,一個文本程序,需要接受鍵盤輸入,將內容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個進程,勢必造成同一時間只能干一樣事的尷尬(當保存時,就不能通過鍵盤輸入內容)。若有多個進程,每個進程負責一個任務,進程A負責接收鍵盤輸入的任務,進程B負責將內容顯示在屏幕上的任務,進程C負責保存內容到硬盤中的任務。這里進程A,B,C間的協作涉及到了進程通信問題,而且有共同都需要擁有的東西——-文本內容,不停的切換造成性能上的損失。若有一種機制,可以使任務A,B,C共享資源,這樣上下文切換所需要保存和恢復的內容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。是的,這種機制就是線程。
線程也叫輕量級進程,它是一個基本的CPU執行單元,也是程序執行過程中的最小單元,由線程ID、程序計數器、寄存器集合和堆棧共同組成。線程的引入減小了程序并發執行時的開銷,提高了操作系統的并發性能。線程沒有自己的系統資源。

3. 進程和線程
進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎?;蛘哒f進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程則是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
進程和線程的關系:
(1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。
(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。
(3)CPU分給線程,即真正在CPU上運行的是線程。
線程與進程之間的關系?
一個進程的線程之間共享由進程獲得的資源,但線程擁有屬于自己的一小部分資源,就是棧空間,保存其運行狀態和局部自動變量的。堆是堆,棧是棧。棧可以叫做:堆棧,棧,棧和堆棧指的都是stack,只是叫法不一樣。而堆就只能叫做堆。在線程中new出來的空間占的是進程的資源,也就是說是占用的堆資源(heap)。
?? ??●線程共享創建線程的進程的地址空間,而進程有各自獨立的地址空間
? ? ? ??●線程可以直接訪問他進程中的數據段,而進程直接從父進程繼承數據段,有數據段的拷貝
? ? ? ??●線程可以和他進程中的其他線程直接進行通信,進程必須使用進程間通信與同胞進程進行通信
? ? ? ??●線程幾乎沒有開銷,而進程有相當可觀的開銷
? ? ? ??●容易創建新的線程,而進程需要父進程的復制
? ? ? ??●線程可以在同進程中的其他線程實現大量的控制,而進程只能對子進程控制
? ? ? ??●改變主線程可能會影響其他線程的行為,對父進程的修改不會影響子進程
4.并行和并發
并行處理(Parallel Processing)是計算機系統中能同時執行兩個或更多個處理的一種計算方法。并行處理可同時工作于同一程序的不同方面。并行處理的主要目的是節省大型和復雜問題的解決時間。并發處理(concurrency Processing):指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機(CPU)上運行,但任一個時刻點上只有一個程序在處理機(CPU)上運行
并發的關鍵是你有處理多個任務的能力,不一定要同時。并行的關鍵是你有同時處理多個任務的能力。所以說,并行是并發的子集

5.同步和異步

在計算機領域,同步就是指一個進程在執行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進程將會一直等待下去,直到收到返回信息才繼續執行下去;異步是指進程不需要一直等下去,而是繼續執行下面的操作,不管其他進程的狀態。當有消息返回時系統會通知進程進行處理,這樣可以提高執行的效率。舉個例子,打電話時就是同步通信,發短息時就是異步通信。
6.父進程 子進程

https://blog.csdn.net/wytbno/article/details/51044055
為啥引入子進程:
為什么引入進程,因為并發,那么為啥引入子進程呢,這個答案也是因為進一步的并發,比如我想算一下a*100,我還想算b*100,我可以順序算,也可一創建兩個子進程一個算前者,一個算后者,父進程等待算好了,拿過來用,這是進一步的并發。
Unix/Linux操作系統提供了一個fork()系統調用,它非常特殊。普通的函數調用,調用一次,返回一次,但是fork()調用一次,返回兩次,因為操作系統自動把當前進程(稱為父進程)復制了一份(稱為子進程),然后,分別在父進程和子進程內返回。
子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調用getppid()就可以拿到父進程的ID。
父進程創建兩個子進程,子進程是對父進程的克隆,兩個子進程是完全獨立的,不能互相訪問
1、父子進程之間的關系?
關于資源:子進程得到的是除了代碼段是與父進程共享的意外,其他所有的都是得到父進程的一個副本,子進程的所有資源都繼承父進程,得到父進程資源的副本,既然為副本,也就是說,二者并不共享地址空間。,兩個是單獨的進程,繼承了以后二者就沒有什么關聯了,子進程單獨運行。(采用寫時復制技術)?
關于文件描述符:繼承父進程的文件描述符時,相當于調用了dup函數,父子進程共享文件表項,即共同操作同一個文件,一個進程修改了文件,另一個進程也知道此文件被修改了。
父進程創建兩個子進程,子進程是對父進程的克隆,兩個子進程是完全獨立的,不能互相訪問

7.多進程 多線程
https://www.cnblogs.com/yuanchenqi/articles/6755717.html
多進程:
同一個時間里,同一個計算機系統中允許兩個或兩個以上的進程處于并行狀態,這是多進程。多進程帶來的好處是你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔打印出來,而這些任務之間絲毫不會相互干擾。但并行需要解決的問題是通常并行的進程比CPU數量多得多,而原則上一個CPU只能分配給一個進程(引入線程后,CPU調度的基本單位是線程,進程是資源分配的最小單位),以便運行這個進程。而要讓CPU同時運行多個進程,就必須使用并發技術,實現并發技術最常見的就是時間片輪轉調度算法,即在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如1毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣,給用戶的感覺就是并行。但實際上在任何一個時間內有且僅有一個進程占有CPU。
多線程:
首先說下多線程出現的原因:
為了解決負載均衡問題,充分利用CPU資源.為了提高CPU的使用率,采用多線程的方式去同時完成幾件事情而不互相干擾.為了處理大量的IO操作時或處理的情況需要花費大量的時間等等,比如:讀寫文件,視頻圖像的采集,處理,顯示,保存等
多線程的好處:
1.使用線程可以把占據時間長的程序中的任務放到后臺去處理
2.用戶界面更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某件事件的處理,可以彈出一個進度條來顯示處理的進度
3.程序的運行效率可能會提高
4.在一些等待的任務實現上如用戶輸入,文件讀取和網絡收發數據等,線程就比較有用了.
多線程的缺點:
1.如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換.
2.更多的線程需要更多的內存空間
3.線程中止需要考慮對程序運行的影響.
4.通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生
https://blog.csdn.net/CYTDCHE/article/details/79075013
提升性能?

在滿足條件的前提下,多線程確實能提升性能?

打一個比方,多線程就相當于,把要炒的菜放到了不同的鍋里,然后用不同的爐來炒,當然速度會比較快。本來需要先炒西紅柿,10分鐘;再炒白菜10分鐘;加起來就需要20分鐘。用了多線程以后,分別放在2個鍋里炒,10分鐘就都炒好了?

基本上,需要滿足3個條件:?

第1,任務具有并發性,也就是可以拆分成多個子任務。并不是什么任務都能拆分的,條件還比較苛刻?

子任務之間不能有先后順序的依賴,必須是允許并行的?

比如?
Java代碼??
a?=?b?+?c??
d?=?e?+?f??

這個是可以并行的;?
Java代碼??
a?=?b?+?c??
d?=?a?+?e??

這個就無法并行了,第2步計算需要依賴第1步的計算結果,即使分成2個線程,也不會帶來任何性能提升?

另外,還不能有資源競爭。比如2個線程都需要寫一個文件,第1個線程將文件鎖定了,第2個線程只能等著,這樣的2個子任務,也不具備并發性;執行sychronized代碼,也是同樣的情況?

第2,只有在CPU是性能瓶頸的情況下,多線程才能實現提升性能的目的。比如一段程序,瓶頸在于IO操作,那么把這個程序拆分到2個線程中執行,也是無法提升性能的?

第3,有點像廢話,就是需要有多核CPU才行。否則的話,雖然拆分成了多個可并行的子任務,但是沒有足夠的CPU,還是只有一個CPU在多個線程中切換來切換去,不但達不到提升性能的效果,反而由于增加了額外的開銷,而降低了性能。類似于雖然把菜放到了2個鍋里,但是只有1個爐子一樣?

top
top查看進程中的線程
1.$ top -H
要讓top輸出某個特定進程<pid>并檢查該進程內運行的線程狀況:
2.$ top -H -p <pid>
查看java所有線程
ps –eLf | grep java
查看進程下的所有線程cpu利用率
top -H -p 25120
其中25120為Java進程號。
下圖紅色標注的地方為線程狀態。其中總數為28,當前運行的線程為0,28個線程睡眠,沒有終止的線程或僵尸線程。

方法一:PS
在ps命令中,“-T”選項可以開啟線程查看。下面的命令列出了由進程號為<pid>的進程創建的所有線程。
1.$ ps -T -p <pid>
方法二: Top
top命令可以實時顯示各個線程情況。要在top輸出中開啟線程查看,請調用top命令的“-H”選項,該選項會列出所有Linux線程。在top運行時,你也可以通過按“H”鍵將線程查看模式切換為開或關。
1.$ top -H
要讓top輸出某個特定進程<pid>并檢查該進程內運行的線程狀況:
2.$ top -H -p <pid>

子進程和線程的區別
舉例而言,進程和線程的區別在于粒度不同, 進程之間的變量(或者說是內存)是不能直接互相訪問的, 而線程可以, 線程一定會依附在某一個進程上執行.我舉個例子, 你在Windows下開一個IE瀏覽器, 這個IE瀏覽器是一個進程. 你用瀏覽器去打開一個pdf, IE就去調用Acrobat去打開, 這時Acrobat是一個獨立的進程, 就是IE的子進程.而IE自己本身同時用同一個進程開了2個網頁, 并且同時在跑兩個網頁上的腳本, 這兩個網頁的執行就是IE自己通過兩個線程實現的.值得注意的是, 線程仍然是IE的內容, 而子進程Acrobat嚴格來說就不屬于IE了, 是另外一個程序.之所以是IE的子進程, 只是受IE調用而啟動的而已.

?

轉載于:https://www.cnblogs.com/move-on-change/p/9534045.html

總結

以上是生活随笔為你收集整理的进程 线程 多进程 多线程 父进程 子进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。