chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何避免僵尸進(jìn)程,多線程的實現(xiàn)原理

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:李倩 ? 2018-05-31 14:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

當(dāng)一個程序開始執(zhí)行后,在開始執(zhí)行到執(zhí)行完畢退出這段時間內(nèi),它在內(nèi)存中的部分就叫稱作一個進(jìn)程。

Linux 是一個多任務(wù)的操作系統(tǒng),也就是說,在同一時間內(nèi),可以有多個進(jìn)程同時執(zhí)行。我們大家常用的單CPU計算機(jī)實際上在一個時間片段內(nèi)只能執(zhí)行一條指令。那么Linux是如何實現(xiàn)多進(jìn)程的同時執(zhí)行的呢?原來Linux使用了一種稱為” 進(jìn)程調(diào)度 “的手段,首先,為每個進(jìn)程指派一定的運行時間,這個時間通常很短,短到以毫秒為單位,然后依照某種規(guī)則,從眾多的進(jìn)程中挑選一個投入運行,其他進(jìn)程暫時等待,當(dāng)正在運行的那個進(jìn)程時間耗盡,或者執(zhí)行完畢退出,或因某種原因暫停,Linux就會重新調(diào)度,挑選一個進(jìn)程投入運行,因為每個進(jìn)程占用的時間片段都很短,從使用者的角度來看,就好像多個進(jìn)程同時運行一樣。

在Linux中,每個進(jìn)程在創(chuàng)建的時都會被分配一個數(shù)據(jù)結(jié)構(gòu),稱為進(jìn)程控制塊(PCB)。PCB中包含了很多重要的信息,供系統(tǒng)調(diào)度和進(jìn)程本事執(zhí)行使用,其中最重要的莫過于進(jìn)程的ID,進(jìn)程的ID也被稱為進(jìn)程標(biāo)示符,是一個非負(fù)的整數(shù),在Linux操作性系統(tǒng)中唯一的標(biāo)志一個進(jìn)程。在最常使用的I386架構(gòu)上,一個非負(fù)的整數(shù)的取值是0~32767,這也是我們所可能取到的進(jìn)程ID,它就是進(jìn)程的身份證號碼。

僵尸進(jìn)程的產(chǎn)生

僵尸進(jìn)程就是已經(jīng)結(jié)束的進(jìn)程,但是還沒有從進(jìn)程表中刪除。僵尸進(jìn)程太多會導(dǎo)致進(jìn)程表里面條目滿了,進(jìn)而導(dǎo)致系統(tǒng)崩潰,倒是不占用系統(tǒng)資源。

在進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有的內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個為位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占用任何內(nèi)存空間,它需要它的父進(jìn)程來給它收尸,如果父進(jìn)程沒安裝SIGCHLD信號處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯示的忽略該信號,那么它就一直處于僵尸狀態(tài)。如果父進(jìn)程結(jié)束了,那么init進(jìn)程會自動接手這個子進(jìn)程,為它收尸,他還是能夠被清除的。但是如果父進(jìn)程是一個循環(huán),不會結(jié)束,那么子進(jìn)程就一直處于僵尸狀態(tài)。

僵尸進(jìn)程產(chǎn)生的原因:

每個Linux進(jìn)程在進(jìn)程表中都有一個進(jìn)入點(Entry),核心程序在執(zhí)行該進(jìn)程時使用到的一切信息都存儲在進(jìn)入點。當(dāng)使用ps命令查看系統(tǒng)中的進(jìn)程信息時,看到的就是進(jìn)程表中的相關(guān)數(shù)據(jù)。當(dāng)fork系統(tǒng)調(diào)用建立一個新的進(jìn)程以后,核心進(jìn)程就會在進(jìn)程表中給這個新進(jìn)程分配一個進(jìn)入點,然后將相關(guān)信息存儲在該進(jìn)入點所對應(yīng)的進(jìn)程表中,這些信息中有一項是父進(jìn)程的識別碼。當(dāng)這個進(jìn)程走完了自己的生命周期后,它會執(zhí)行exit()系統(tǒng)調(diào)用,此時原來進(jìn)程表中的數(shù)據(jù)會被該進(jìn)程的退出碼、執(zhí)行時所用的CPU時間等數(shù)據(jù)所取代,這些數(shù)據(jù)會一直保留到系統(tǒng)將它傳遞給它的父進(jìn)程為止。由此可見,僵尸進(jìn)程的出現(xiàn)時間實在子程序終止后,但是父進(jìn)程尚未讀取這些數(shù)據(jù)之前。

如何避免僵尸進(jìn)程

1、父進(jìn)程通過wait和waitpid等函數(shù)等待子進(jìn)程結(jié)束,這會導(dǎo)致父進(jìn)程掛起2、如果父進(jìn)程很忙,那么可以用signal函數(shù)為SIGCHLD安裝handler,因為子進(jìn)程結(jié)束后,父進(jìn)程會收到該信號,可以在handler中調(diào)用wait回收。3、如果父進(jìn)程不關(guān)心子進(jìn)程什么時候結(jié)束,那么可以用“singal(SIGCHLD),SIG_IGN”通知內(nèi)核,自己對子進(jìn)程的結(jié)束不感興趣,那么子進(jìn)程結(jié)束后,內(nèi)核會回收,并不再給父進(jìn)程發(fā)送信號。4、還有一些技巧,就是fork()兩次,父進(jìn)程fork一個子進(jìn)程,然后繼續(xù)工作,子進(jìn)程fork一個孫進(jìn)程后退出,那么孫進(jìn)程被init接管,孫進(jìn)程結(jié)束后,init會回收,不過子進(jìn)程回收還要自己做。

進(jìn)程 PK 線程

我們先打個比方,多線程是十字路口多線程是平面交通系統(tǒng),造價低,但是紅綠燈多,老堵車,而多進(jìn)程是則是立交橋,雖然造價高,上下坡多耗油,但是不堵車。這是一個抽象的概念。相信大家看完會有這種感覺。

進(jìn)程和線程是兩個相對的概念,通常來說,一個進(jìn)程可以定義程序的一個實例(Instance)。在Win32中,進(jìn)程并不執(zhí)行什么,它只是占據(jù)應(yīng)用程序所使用的地址空間。為了讓進(jìn)程完成一定的工作,進(jìn)程必須至少占有一個線程,正是這個線程負(fù)責(zé)包含進(jìn)程地址空間中的代碼。實際上,一個進(jìn)程可以包含幾個線程,它們可以同時執(zhí)行進(jìn)程地址空間中的代碼。為了做到這一點,每個線程有自己的一組CPU寄存器和堆棧。每個進(jìn)程中至少有一個線程在執(zhí)行其地址空間中的代碼。如果沒有線程執(zhí)行進(jìn)程地址空間中的代碼,進(jìn)程也就沒有繼續(xù)存在的理由,系統(tǒng)將自動清除進(jìn)程及其地址空間。

多線程的實現(xiàn)原理

創(chuàng)建一個進(jìn)程時,它的第一個線程稱為主線程(Primary thread),由系統(tǒng)自動生成。然后可以由這個主線程生成額外的線程,而這些線程,又可以生成更多的線程。在運行一個多線程的程序時,從表面上看,這些線程似乎在同時運行。而實際情況并非如此,為了運行所有的這些線程,操作系統(tǒng)為每個獨立線程安排一些CPU時間。單CPU操作系統(tǒng)以時間片輪轉(zhuǎn)方式向線程提供時間片(Quantum),每個線程在使用完時間片后交出控制,系統(tǒng)再將CPU時間片分配給下一個線程。由于每個時間片足夠的短,這樣就給人一種假象,好像這些線程在同時運行。創(chuàng)建額外線程的唯一目的就是盡可能地利用CPU時間。

多線程的問題

使用多線程編程可以給程序員帶來很大的靈活性,同時也使原來需要復(fù)雜技巧才能解決的問題變得容易起來。但是,不應(yīng)該人為地將編寫的程序分成一些碎片,讓這些碎片按各自的線程執(zhí)行,這不是開發(fā)應(yīng)用程序的正確方法。線程很有用,但當(dāng)使用線程時,可能會在解決老問題的同時產(chǎn)生新問題。例如要開發(fā)一個字處理程序,并想讓打印功能作為單獨的線程自己執(zhí)行。這聽起來是很好的主意,因為在打印時,用戶可立即返回,開始編輯文檔。但這樣一來,在該文檔被打印時文檔中的數(shù)據(jù)就有可能被修改,打印的結(jié)果就不再是所期望的內(nèi)容。也許最好不要把打印功能放在單獨的線程中,不過如果一定要用多線程的話,也可以考慮用下面的方法解決:第一種方法是鎖定正在打印的文檔,讓用戶編輯其他的文檔,這樣在結(jié)束打印之前,該文檔不會作任何修改;另一個方法可能更有效一些,即可以把該文檔拷貝到一個臨時文件中,打印這個臨時文件的內(nèi)容,同時允許用戶對原來的文檔進(jìn)行修改。當(dāng)包含文檔的臨時文件打印完成時,再刪去這個臨時文件。通過上面的分析可以看出,多線程在幫助解決問題的同時也可能帶來新問題。因此有必要弄清楚,什么時候需要創(chuàng)建多線程,什么時候不需要多線程??偟膩碚f,多線程往往用于在前臺操作的同時還需要進(jìn)行后臺的計算或邏輯判斷的情況。

線程的分類

在MFC中,線程被分為兩類,即工作線程和用戶界面線程。如果一個線程只完成后臺計算,不需要和用戶交互,那么可以使用工作線程;如果需要創(chuàng)建一個處理用戶界面的線程,則應(yīng)使用用戶界面線程。這兩者的主要區(qū)別在于,MFC框架會給用戶界面線程增加一個消息循環(huán),這樣用戶界面線程就可以處理自己消息隊列中的消息。這樣看來,如果需要在后臺作一些簡單的計算(如對電子表格的重算),則首先應(yīng)考慮使用工作線程,而當(dāng)后臺線程需要處理比較復(fù)雜的任務(wù),確切地說,當(dāng)后臺線程的執(zhí)行過程會隨著實際情況的不同而改變時,就應(yīng)該使用用戶界面線程,以便能對不同的消息作出響應(yīng)。

線程的優(yōu)先級

當(dāng)系統(tǒng)需要同時執(zhí)行多個進(jìn)程或多個線程時,有時會需要指定線程的優(yōu)先級。線程的優(yōu)先級一般是指這個線程的基優(yōu)先級,即線程相對于本進(jìn)程的相對優(yōu)先級和包含此線程的進(jìn)程的優(yōu)先級的結(jié)合。操作系統(tǒng)以優(yōu)先級為基礎(chǔ)安排所有的活動線程,系統(tǒng)的每一個線程都被分配了一個優(yōu)先級,優(yōu)先級的范圍從0到31。運行時,系統(tǒng)簡單地給第一個優(yōu)先級為31的線程分配CPU時間,在該線程的時間片結(jié)束后,系統(tǒng)給下一個優(yōu)先級為31的線程分配CPU時間。當(dāng)沒有優(yōu)先級為31的線程時,系統(tǒng)將開始給優(yōu)先級為30的線程分配CPU時間,以此類推。除了程序員在程序中改變線程的優(yōu)先級外,有時程序在執(zhí)行過程中系統(tǒng)也會自動地動態(tài)改變線程的優(yōu)先級,這是為了保證系統(tǒng)對終端用戶的高度響應(yīng)性。比如用戶按了鍵盤上的某個鍵時,系統(tǒng)就會臨時將處理WM_KEYDOWN消息的線程的優(yōu)先級提高2到3。CPU按一個完整的時間片執(zhí)行線程,當(dāng)時間片執(zhí)行完畢后,系統(tǒng)將該線程的優(yōu)先級減1。

線程的同步

在使用多線程編程時,還有一個非常重要的問題就是線程同步。所謂線程同步是指線程之間在相互通信時避免破壞各自數(shù)據(jù)的能力。同步問題是由前面說到的Win32系統(tǒng)的CPU時間片分配方式引起的。雖然在某一時刻,只有一個線程占用CPU(單CPU時)時間,但是沒有辦法知道在什么時候,在什么地方線程被打斷,這樣如何保證線程之間不破壞彼此的數(shù)據(jù)就顯得格外重要。在MFC中,可以使用4個同步對象來保證多線程同時運行。它們分別是臨界區(qū)對象(CCriticalSection)、互斥量對象(CMutex)、信號量對象(CS emaphore)和事件對象(CEvent)。在這些對象中,臨界區(qū)對象使用起來最簡單,它的缺點是只能同步同一個進(jìn)程中的線程。另外,還有一種基本的方法,本文稱為線性化方法,即在編程過程中對一定數(shù)據(jù)的寫操作都在一個線程中完成。這樣,由于同一線程中的代碼總是按順序執(zhí)行的,就不可能出現(xiàn)同時改寫數(shù)據(jù)的情況。

總結(jié):

在線程中(相對與進(jìn)程而言),線程是一個更加接近執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨立的執(zhí)行序列。這兩者都可以提高程序的并發(fā)度,提高程序運行的效率和響應(yīng)的時間。線程和進(jìn)程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正好相反。根本的區(qū)別就一點:用多進(jìn)程每個進(jìn)程有自己的地址空間,線程則共享地址空間,在速度方面:線程產(chǎn)生的速度快,線程間的通訊快,切換快等,因為他們在同一地址空間內(nèi)。在資源利用率方面:線程的資源率比較好也是因為他們在同一地址空間內(nèi)。 在同步方面:線程使用公共變量/內(nèi)存時需要使用同步機(jī)制,因為他們在同一地址空間內(nèi)進(jìn)程中:子進(jìn)程是父進(jìn)程的復(fù)制品,子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • pcb
    pcb
    +關(guān)注

    關(guān)注

    4381

    文章

    23637

    瀏覽量

    417454
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11576

    瀏覽量

    216654
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20653

原文標(biāo)題:Linux系統(tǒng)進(jìn)程的一些知識總結(jié),進(jìn)程與線程之間的糾葛...

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Java多線程的用法

    能力。 什么是進(jìn)程 是指正在運行的程序的實例。 每個進(jìn)程都擁有自己的內(nèi)存空間、代碼、數(shù)據(jù)和文件等資源,可以獨立運行、調(diào)度和管理。在操作系統(tǒng)中,進(jìn)程是系統(tǒng)資源分配的最小單位,是實現(xiàn)多任務(wù)
    的頭像 發(fā)表于 09-30 17:07 ?1385次閱讀

    請問如何在Python中實現(xiàn)多線程與多進(jìn)程的協(xié)作?

    大家好!我最近在開發(fā)一個Python項目時,需要同時處理多個任務(wù),且每個任務(wù)需要不同的計算資源。我想通過多線程和多進(jìn)程的組合來實現(xiàn)并發(fā),但遇到了一些問題。 具體來說,我有兩個任務(wù),一個是I/O密集型
    發(fā)表于 03-11 06:57

    孤兒進(jìn)程僵尸進(jìn)程

    前段時間,由于研究經(jīng)典面試題,把孤兒進(jìn)程僵尸進(jìn)程也總結(jié)了一下。我們有這樣一個問題:孤兒進(jìn)程僵尸進(jìn)程
    發(fā)表于 11-29 14:08

    進(jìn)程線程區(qū)別

    )。不管是多進(jìn)程還是多線程,最終目標(biāo)都是實現(xiàn)并行執(zhí)行。 2、多線程的優(yōu)勢前些年多進(jìn)程多一些,近些年多線程
    發(fā)表于 11-30 14:06

    多線程和多進(jìn)程的區(qū)別

    6.你的數(shù)據(jù)庫一會又500個連接數(shù),一會有10個,你分析一下情況7.udp和tcp的區(qū)別8.多線程和多進(jìn)程的區(qū)別9.有一臺web服務(wù)器,你選擇用多線程還是多進(jìn)程,...
    發(fā)表于 07-19 07:21

    淺談多進(jìn)程多線程的選擇

    魚還是熊掌:淺談多進(jìn)程多線程的選擇關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,
    發(fā)表于 08-24 07:38

    進(jìn)程有幾種狀態(tài)?

    文章目錄操作系統(tǒng)進(jìn)程線程什么是進(jìn)程?什么是線程進(jìn)程線程有什么區(qū)別?何時使用多
    發(fā)表于 12-24 07:16

    python多線程和多進(jìn)程對比

    電視邊吃飯邊聊天。這就是我們的 多進(jìn)程 才能做的事了。2. 單線程VS多線程VS多進(jìn)程文字總是蒼白無力的,不如用代碼直接來測試一下。開始對比之前,首先定義四種類型的場景 - CPU計算
    發(fā)表于 03-15 16:42

    LINUX系統(tǒng)下多線程與多進(jìn)程性能分析

    采用多進(jìn)程處理多個任務(wù),會占用很多系統(tǒng)資源(主要是CPU 和內(nèi)存的使用)。在LINUX 中,則對這種弊端進(jìn)行了改進(jìn),在用戶態(tài)實現(xiàn)多線程處理多任務(wù)。本文系統(tǒng)論述了多線程
    發(fā)表于 08-13 08:31 ?20次下載

    進(jìn)程多線程的深度比較

    嵌入式Linux中文站,關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。這句話應(yīng)付考試基本上夠了,但如果在工作中遇
    發(fā)表于 04-02 14:42 ?710次閱讀

    SpringBoot實現(xiàn)多線程

    SpringBoot實現(xiàn)多線程
    的頭像 發(fā)表于 01-12 16:59 ?2402次閱讀
    SpringBoot<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>多線程</b>

    關(guān)于Python多進(jìn)程多線程詳解

    進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程
    的頭像 發(fā)表于 11-06 14:46 ?1384次閱讀
    關(guān)于Python多<b class='flag-5'>進(jìn)程</b>和<b class='flag-5'>多線程</b>詳解

    Linux系統(tǒng)上多線程和多進(jìn)程的運行效率

    關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡單了,選
    的頭像 發(fā)表于 11-10 10:54 ?2056次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和多<b class='flag-5'>進(jìn)程</b>的運行效率

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用
    的頭像 發(fā)表于 10-23 11:48 ?1227次閱讀
    Python中<b class='flag-5'>多線程</b>和多<b class='flag-5'>進(jìn)程</b>的區(qū)別

    socket 多線程編程實現(xiàn)方法

    是指在同一個進(jìn)程中運行多個線程,每個線程可以獨立執(zhí)行任務(wù)。線程共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但每個
    的頭像 發(fā)表于 11-12 14:16 ?1337次閱讀