1. 程式人生 > >Linux執行緒入門學習(一)-認識執行緒

Linux執行緒入門學習(一)-認識執行緒

1. 執行緒的概念

執行緒,又稱輕量級程序,是程序中執行運算的最小單位,是程序中的一個實體,是被系統獨立排程和分派的基本單位,主要有以下特點:

1)執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源;
2)與同屬一個程序的其它執行緒共享程序所擁有的全部資源(則執行緒之間會存在競態);
3)同一程序中的多個執行緒之間可以併發執行;(相對CPU來說不是並行的,相對個人來說執行緒執行時間很快可以看成是並行的。)
4)執行緒間可以進行各種操作,如建立,取消,分離等等。

舉個例子:
計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背後的含義就是,單個CPU 一次只能執行一個任務。程序就好比工廠的車間,它代表CPU 所能處理的單個任務。任一時刻,CPU 總是執行一個程序,其他程序處於非執行狀態。一個車間裡,可以有很多工人。他們協同完成一個任務。執行緒就好比車間裡的工人。一個程序可以包括多個執行緒。
程序執行緒


程序不做具體操作,只是把作業系統的任務承包下來,然後把具體事情交給執行緒處理。

程序和執行緒的關係:
1. 一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒,即主執行緒
2.資源分配給程序,同一程序的所有執行緒共享該程序的所有資源
3.處理機分給執行緒,即真正在處理機上執行的是執行緒
4.同個程序間的執行緒,在執行過程中,需要協作同步
5.不同程序間的執行緒,在執行過程中,則需要利用訊息通訊的辦法實現同步

程序與執行緒的區別:
排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位
併發性:不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可併發執行
擁有資源:程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序
的資源.
系統開銷:在建立或撤消程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯
大於建立或撤消執行緒時的開銷。

2. 執行緒的生命週期

執行緒在其生命週期中有四種狀態,分別是就緒、執行、阻塞和終止,下面這個表格解釋了這四種狀態:這裡寫圖片描述
說明:
執行緒執行過程中,可能由於各種原因進入阻塞狀態:

a.執行緒通過呼叫 (sleep)休眠方法進入睡眠狀態;
b.執行緒呼叫一個在 I/O 上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的呼叫者;
c.執行緒試圖得到一個鎖,而該鎖正被其他執行緒持有;
d.執行緒在等待某個觸發條件;

執行緒可以在一定條件下轉換其狀態,下圖顯示了執行緒是如何轉換其狀態的:
這裡寫圖片描述
如果從資源回收的角度考慮,執行緒還有兩種狀態:joinable 與detached
如果執行緒處於joinable 狀態(非分離狀態),則只能只能被建立他的執行緒等待終止;
如果執行緒是detached 狀態(分離態),則它沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源,系統會回收其資源;
一個執行緒在建立時,預設是可連線態,即非分離態。

3.執行緒的排程策略

POSIX 標準指定了三種排程策略:
1)先入先出策略(SCHED_FIFO)
2)迴圈策略(SCHED_RR)
3)自定義策略(SCHED_OTHER)

備註:一個執行緒的排程演算法符合其所在程序的排程演算法。

相關推薦

Linux執行入門學習-認識執行

1. 執行緒的概念 執行緒,又稱輕量級程序,是程序中執行運算的最小單位,是程序中的一個實體,是被系統獨立排程和分派的基本單位,主要有以下特點: 1)執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源; 2)與同屬一個程序的其它執行緒共享程序所擁有的全

Linux程序入門學習-認識程序

1.程序的概念 一個可執行的程式檔案(ELF格式)被載入到記憶體當中,然後讓CPU逐條執行其程式碼,根據程式碼作出相應的動作,這樣一個動態程序就產生了。因此,程序是一個動態變化的過程。 下面用一張圖來表示一個程式從編寫到最終執行的過程: 一段固化在磁碟

NS3入門學習之指令碼執行例項

 ns3中使用的編譯系統是waf,所有的c++工程都需要經過waf編譯後執行,除錯時也需要waf的。 在3.1.3中還是使用C++寫指令碼,在/ns-3.1.3/examples/tutorial/的second.cc指令碼中可以看出來,在3.2.6以上版本中已經增加了python

執行學習——建立執行的三種方式及比較

最近在學習多執行緒,在這裡總結一下學習到的內容(參考《瘋狂Java講義第3版》):一、建立執行緒有三種方式:      1、繼承Thread類      2、實現Runnable介面      3、使用Callable和Future二、分別介紹用法:繼承Thread類/*下面

c++11 多執行入門教程

  原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/10945309.html              最近是恰好寫了一些c++11多執行緒有關的東西,就寫一下筆記留著以後自己忘記回來看吧,也不是專門寫給讀者看的,我就想到哪就寫到哪吧

Linux文件系統學習之相關概念???

正是 range 不同的 struct pan 根據 inode 存在 opera “一切皆是文件”是 Unix/Linux 的基本哲學之一。不僅普通的文件,目錄、字符設備、塊設備、套接字等在 Unix/Linux 中都是以文件被對待;它們雖然類型不同,但是對其提供的卻是同

VueJS入門學習

try pre 發的 沒有 cnpm lan light install 上一個   剛剛接觸VueJs的時候,還不懂NodeJs是什麽,單頁面應用是什麽?隨著慢慢的深入慢慢的理解了這些東西。簡單介紹一些VueJs,一個頁面一個Vue實例,包含了頁面中控件所需要的方法,事件

linux菜鳥基礎學習

導致 erp redhat ado water 切換用戶 學習 方法 x86 熟悉linux環境 1.虛擬機的控制虛擬機是在真機上建立的,為何要建立虛擬機,主要是防止由於錯誤操作導致不可挽回的結果。[kiosk@foundation0 Desktop]$ rht-vmctl

linux名稱空間(namespace)學習

關於linux名稱空間網路上有很多是關於docker 的,也有關於linux的專門的linux的namespace介紹的,沒有專門介紹Linux名稱空間的應用的。所以我想先介紹一下linux名稱空間的應用,然後再介紹linux核心對於名稱空間的管理方式。好了,廢話不多說先上原理吧。 名稱空間

OpenCV入門學習

OpenCV入門學習(2) IplImage* img = cvLoadImage(argv[1]); 上面的函式程式碼聲明瞭一個IPLImage* 影象指標,然後根據影象名稱的字串argv[1],將影象載入到記憶體中。 影象結構體IplImage IplImage

Java NIO入門學習

本文為NIO入門學習的第一篇,將會介紹NIO中幾個重要的概念。 I/O即輸入輸出,指的是計算機和外界的介面,或者是單個程式同計算機其他部分的介面。 在Java1.4之前的I/O系統中,提供的都是面向流的I/O系統,系統每次處理一個位元組,輸入流(input stream)生

Python入門學習,安裝Eclipse開發環境

  近日,山東省在其最新出版的小學資訊科技六年級教材中,加入了Python的內容。      簡單來說,Python是一種廣泛使用的高階程式語言,屬於通用型程式語言,由荷蘭人Guido van Rossum創造。它的第一版釋出於1991年。由於可擴充套件性,

linux之shell指令碼學習

#!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; do echo ${i} done str="1234" echo ${#str} unset s

Mybatis框架入門學習

什麼是MyBatis?        MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java

【.NET執行--進階】--執行方法詳解

        上篇部落格從執行緒的基本概況開始著重討論了執行緒,程序,程式之間的區別,然後討論了執行緒操作的幾個類,並通過例項來說明了執行緒的建立方法。本篇部落格將會帶大家更深入的瞭解執行緒,介紹執行緒的基本方法,並通過一個Demo使用委託來呼叫執行緒之外的物件。

Hibernate入門學習

都說年底了,大夥應該都在衝回款,忙的不可開交啊啥的。唯獨我這個剛轉正三個月的閒來無事,只得在上班時間來給自己充充電,也不好玩別的,畢竟剛來公司不久,沒有那些老鳥膽子大,凡事低調點,就開始看起了視訊。下面簡單記錄下自己學習到的東西,今天一天看了Hibernate的學習視訊,自

linux之makefile的學習

為什麼要學習makefile 在linux下開發專案,如果想要完成一個大型專案的開發,可能在windows環境下,有許多編譯器就已經替代了makefile功能,但在linux下想要合理管理程式碼,學會編寫makefile就非常重要了。 makefile 關係

安卓入門學習使用者介面設計

第三章 使用者介面設計 寫在前面: 有人問為什麼網路上那麼多教程,直接學習就好了,為啥還要浪費時間跟精力自己重新寫一系統的帖子? 寫部落格不是一種情懷,而是對自己所學所用知識的總結。寫文章是一種態度,是對自己已知能力的輸出的考核。 最重要一點,人生在世,總要留

OpenCV入門學習影象放縮【簡單的按比例放縮,無技術含量】

其中,filename 是待載入影象的名稱,包括影象的副檔名;iscolor是一個輔助引數項,可選正數、零和負數三種值,正數表示作為三通道(CV_LOAD_IMAGE_COLOR)影象載入,零(CV_LOAD_IMAGE_GRAYSCALE)表示該影象作為單通道影象,負數(CV_LOAD_IMAGE_UNCH

salesforce 零基礎開發入門學習Salesforce功能介紹,IDE配置以及資源下載

目前國內已經有很多公司做salesforce,但是國內相關的資料確是少之又少。上個月末跳槽去了新公司,主要做的就是salesforce,不過當時想要看一些相關資料確實比較難。為了避免想要零基礎學習的人少走一點彎路,所以整理一下這幾天學到的簡單的東西,包括登入salesforce後如何操作,如何下載配置IDE