進程線程及其狀態

来源:https://www.cnblogs.com/yanlei2018/archive/2018/01/01/8168034.html
-Advertisement-
Play Games

進程線程及其狀態 進程 進程的概念 進程就是執行中的程式。 進程的狀態 進程有五種狀態,分別是: 新建:進程正在被創建 運行:進程正在被執行 阻塞:進程等待某個事件(如I/O操作) 就緒:進程等待分配處理器 終止:進程完成執行 進程調度流程圖 線程 線程的概念 線程是程式執行流的最小單元,線程早期也 ...


進程線程及其狀態

進程

進程的概念

  • 進程就是執行中的程式。

進程的狀態

進程有五種狀態,分別是:

  • 新建:進程正在被創建
  • 運行:進程正在被執行
  • 阻塞:進程等待某個事件(如I/O操作)
  • 就緒:進程等待分配處理器
  • 終止:進程完成執行

進程調度流程圖

線程

線程的概念

  • 線程是程式執行流的最小單元,線程早期也有輕量級進程之稱。一個進程中可能包含多個線程。在系統內核層面,進程與線程並無本質的不同。進程與線程最大的不同點是資源分配。

線程與進程的比較

  • 線程與進程都可以實現多任務。
  • 線程是CPU調度的基本單元,進程是系統資源分配的基本單元。
  • windows下進程線程是涇渭分明,區別明顯的。在Linux中它們有很多共同特性。
  • 在早期Linux的內核結構中:進程和線程的區別隻是創建子進程和子線程時,是否設置為共用記憶體,二者在內核中的存儲結構並無區別,系統調度的單位也是輕量級進程。2.6以後的Linux內核版本才將線程和進程完全獨立開來。
  • 線程的狀態改變只代表了CPU執行過程的改變,線程操作的資源仍然是進程的。除了 CPU外,電腦內的軟硬體資源的分配都是以進程為單位的。進程擁有一個完整的虛擬地址空間,不依賴於線程而獨立存在,而線程只是進程的一部分,與進程內的其他線程一起共用分配給該進程的所有資源。

線程的狀態

  • 同進程的實現原理類似,線程也可主要概括為五種狀態(實際上Linux將線程狀態細分為十幾種):
    • 新建,由於不需要進行必要的記憶體複製等工作,新建線程要比新建進程更快。
    • 就緒
    • 運行
    • 阻塞
    • 死亡,線程死亡後,也需要回收處理。
  • 調度的過程參考進程。

線程的內核調度

  • 多線程編程具有響應度高、資源共用、經濟和多處理器體繫結構的利用四個優點。用戶線程是映射到內核線程池進行CPU調度的,映射關係模型包含有:

    • (1)多對一
    • (2)一對一
    • (3)多對多

內核調度圖

  • 這裡為什麼沒有一對多?因為線程是CPU資源調度的最小單位,即:單線程在一個時間點上只能利用到一個核心(進行一個原子操作),一個原子操作不能再分開由不同核心執行。而多核CPU在執行單線程任務時,可能會切換多個核心輪流來執行這個任務(每個原子操作的CPU核心可能並不相同),例如在執行迴圈時,這次迴圈和下次迴圈可能並不是同一個核心來執行的(這跟你的系統有關,但可以看到單線程最多只能占用到 (1/CPU核心數) 的CPU資源(超線程CPU占用1/(CPU線程數))。
  • 而資源上,多核CPU調用同一資源時,X86架構會使用匯流排鎖,對該資源進行鎖定,保證原子操作執行完整不被打斷。當操作完成時,會解鎖並通知其他線程,我操作完了,你們可以來操作了(實際上,此方法效率很低,僅作為最後一道保險)。
  • 因此確定一個操作是原子操作時,沒有必要浪費外圍昂貴的開銷再來給他加鎖,原子操作本身就是一道互斥鎖。互斥鎖的目的,也正是將一系列操作變為原子操作。

進程的誕生與消亡

  • 進程的誕生
    • (1)fork函數:子進程拷貝父進程的數據(具體實現是讀時共用,寫時複製)
    • (2)vfork函數:子進程與父進程共用數據
    • vfork是一個過時的函數,雖然與fork相比有那麼一點性能優勢,但其帶來一連串的坑並不那麼好填,不建議使用,除非你對性能追求到極致。
  • 進程的消亡
    • (1)正常結束和異常終止;
    • (2)linux系統設計時規定:每個進程結束時,系統會自動回收open但沒有close的文件資源,malloc但沒有free的資源等,但並不會回收進程本身占用的資源(即進程的屍體,主要包括進程本身的文件描述符對應的資源(task_struct結構體)和進程的棧空間),這需要由進程的父進程來完成回收(收屍)。
  • 僵屍進程
    • 在上述(2)中,如果父進程沒有結束,而且也不回收已結束的子進程(收屍),已經結束的子進程,就變成了僵屍進程。
    • 父進程可以使用wait或waitpid,顯式地回收子進程(剩餘待回收)的記憶體資源並且獲取子進程退出狀態。
    • 父進程結束時也會自動回收僵屍進程,但應避免這種不嚴謹的方式。
  • 孤兒進程
    • 子進程還在執行,而父進程先結束了,子進程就成為了孤兒進程,托管到系統了。
    • 此時子進程的父進程變為了系統的init進程,init進程會在孤兒進程結束後自動回收孤兒進程的資源。

線程的誕生與消亡

  • 線程標識(線程ID)
    • 進程ID在整個系統中是唯一的。
    • 線程ID(pthread_t類型)只在它所屬的進程中有效。
    • pthread_t(Linux中為unsigned int類型,OS中為結構體指針,Windows中為handle句柄)用於聲明線程ID。
    • 函數:pthread_self取得自身線程ID。
  • 創建線程
    • 使用函數pthread_create,線程創建後,就開始運行相關的線程函數。
  • 退出線程。
    • 線程執行完畢。可以return,不能exit(exit是退出進程)。
    • 使用函數pthread_exit,主動退出線程。主線程使用該函數時,進程並不會結束,而是等待其他線程結束。
    • 進程結束時,線程也結束(線程依賴於其所在的進程)。
  • 線程回收
    • 由於線程使用的資源是屬於進程的,退出線程而進程仍然運行時資源並未完全釋放,形成僵屍線程。
    • pthread_join(tid)函數類似wait/waitpid函數,用於阻塞等待線程tid結束,調用它的線程一直等待到tid線程結束時,tid線程資源就被回收。
    • pthread_detach(tid)函數線程分離,讓系統自動回收tid線程。
    • 按以下步驟回收:
      • pthread_attr_t attr;//線程創建前,定義線程屬性
      • pthread_attr_init(&attr);//進行初始化線程屬性
      • pthread_attr_getdetachsate(&attr,&status);//獲取分離狀態
      • pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//設置線程分離狀態.
      • pthread_create(&tid, &attr,func,NULL);//創建線程
      • pthread_attr_destroy(&attr);//線程結束時,調用回收函數
    • 線程回收代碼示例:
    void * func(void *p)
    {
        printf("我是子線程\n");
    }
    int main(int argc, char *argv[])
    {
        pthread_attr_t attr; //定義一個變數
        pthread_t tid;
        pthread_attr_init(&attr);//初始化
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//設置分離
        pthread_create(&tid, &attr, func, NULL);//創建線程
        sleep(1);//等1秒讓子線程執行完
        pthread_attr_destroy(&attr);//釋放
        return 0;
    }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第四部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本高級系列課程適合人群如下: 1、有一定的NET開發基礎並對WebApi、Task、WebSo ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第三部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本次高級系列課程適合人群如下: 1、有一定的NET開發基礎並對Socket技術有一定瞭解和認識 ...
  • 併發(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界裡面,處理高併發大致有以下幾種方法: 1,非同步編程 非同步編程就是使用future模式(又稱promise)或者回調機制來實現(Non-blocking on waiting)... ...
  • Linux多進程CS伺服器簡單實現 server端 多進程實現多用戶連接,即每個用戶一個連接,這裡仍然用server將收到的字元串轉大寫後返回給客戶端。 代碼實現 測試結果 可以實現多個客戶端同時連接伺服器,伺服器每接受一個客戶就創建一個子進程,用戶端斷開後,進程由父進程自動回收子進程。 存在問題 ...
  • linux驅動 alsa模型: Linux ALSA音效卡驅動之一:ALSA架構簡介 Linux ALSA音效卡驅動之二:音效卡的創建 Linux ALSA音效卡驅動之三:PCM設備的創建 Linux ALSA音效卡驅動之四:Control設備的創建 Linux ALSA音效卡驅動之五:移動設備中的ALSA(A ...
  • Linux單用戶CS模型TCP通訊完全註釋手冊 server 描述 實現一個簡單的Linux單用戶CS通訊,客戶端發送一串字元串,伺服器將其轉換為大寫後返回。 server 代碼 運行效果 客戶端輸入:hello,world 服務端轉換為大寫後返回,客戶端收到伺服器發回的數據後進行列印:HELLO, ...
  • http://www.cnblogs.com/targethero/p/5080499.html https://www.cnblogs.com/xiaojiang1025/p/6131381.html interrupts 一個電腦系統中大量設備都是通過中斷請求CPU服務的,所以設備節點就需要在 ...
  • 實驗材料準備 1,下載實驗材料hit-oslab-linux-20110823.tar.gz(包含linux-0.11源碼,bochs模擬器等) 網址:http://www.ritchiehuang.cn/ 2,下載安裝gcc-3.4(編譯linux-0.11需要用到低版本gcc) 網址:old-r ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...