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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于进程和线程以及句柄

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于进程和线程以及句柄 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說法一:進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.

一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行



說法二:進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。進程和線程的區別在于:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

線程的劃分尺度小于進程,使得多線程程序的并發性高。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程在執行過程中與進程還是有區別的。每個獨立的程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。



說法三:多線程共存于應用程序中是現代操作系統中的基本特征和重要標志。用過UNIX操作系統的讀者知道進程,在UNIX操作系統中,每個應用程序的執行都在操作系統內核中登記一個進程標志,操作系統根據分配的標志對應用程序的執行進行調度和系統資源分配,但進程和線程有什么區別呢?

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。進程和線程的區別在于:

線程的劃分尺度小于進程,使得多線程程序的并發性搞。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程(Process)是最初定義在Unix等多用戶、多任務操作系統環境下用于表示應用程序在內存環境中基本執行單元的概念。以Unix操作系統為例,進程是Unix操作系統環境中的基本成分、是系統資源分配的基本單位。Unix操作系統中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統對應用程序進程的控制來實現的。

C、C++、Java等語言編寫的源程序經相應的編譯器編譯成可執行文件后,提交給計算機處理器運行。這時,處在可執行狀態中的應用程序稱為進程。從用戶角度來看,進程是應用程序的一個執行過程。從操作系統核心角度來看,進程代表的是操作系統分配的內存、CPU時間片等資源的基本單位,是為正在運行的程序提供的運行環境。進程與應用程序的區別在于應用程序作為一個靜態文件存儲在計算機系統的硬盤等存儲空間中,而進程則是處于動態條件下由操作系統維護的系統資源管理實體。多任務環境下應用程序進程的主要特點包括:

●進程在執行過程中有內存單元的初始入口點,并且進程存活過程中始終擁有獨立的內存地址空間;

●進程的生存期狀態包括創建、就緒、運行、阻塞和死亡等類型;

●從應用程序進程在執行過程中向CPU發出的運行指令形式不同,可以將進程的狀態分為用戶態和核心態。處于用戶態下的進程執行的是應用程序指令、處于核心態下的應用程序進程執行的是操作系統指令。

在Unix操作系統啟動過程中,系統自動創建swapper、init等系統進程,用于管理內存資源以及對用戶進程進行調度等。在Unix環境下無論是由操作系統創建的進程還要由應用程序執行創建的進程,均擁有唯一的進程標識(PID)。

說法四:應用程序在執行過程中存在一個內存空間的初始入口點地址、一個程序執行過程中的代碼執行序列以及用于標識進程結束的內存出口點地址,在進程執行過程中的每一時間點均有唯一的處理器指令與內存單元地址相對應。

Java語言中定義的線程(Thread)同樣包括一個內存入口點地址、一個出口點地址以及能夠順序執行的代碼序列。但是進程與線程的重要區別在于線程不能夠單獨執行,它必須運行在處于活動狀態的應用程序進程中,因此可以定義線程是程序內部的具有并發性的順序代碼流。

Unix操作系統和Microsoft Windows操作系統支持多用戶、多進程的并發執行,而Java語言支持應用程序進程內部的多個執行線程的并發執行。多線程的意義在于一個應用程序的多個邏輯單元可以并發地執行。但是多線程并不意味著多個用戶進程在執行,操作系統也不把每個線程作為獨立的進程來分配獨立的系統資源。進程可以創建其子進程,子進程與父進程擁有不同的可執行代碼和數據內存空間。而在用于代表應用程序的進程中多個線程共享數據內存空間,但保持每個線程擁有獨立的執行堆棧和程序執行上下文(Context)。

基于上述區別,線程也可以稱為輕型進程 (Light Weight Process,LWP)。不同線程間允許任務協作和數據交換,使得在計算機系統資源消耗等方面非常廉價。

線程需要操作系統的支持,不是所有類型的計算機都支持多線程應用程序。Java程序設計語言將線程支持與語言運行環境結合在一起,提供了多任務并發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌后將大米放在電飯鍋里,然后開始做菜。等菜做好了,飯熟了同時衣服也洗好了。

需要注意的是:在應用程序中使用多線程不會增加 CPU 的數據處理能力。只有在多CPU 的計算機或者在網絡計算體系結構下,將Java程序劃分為多個并發執行線程后,同時啟動多個線程運行,使不同的線程運行在基于不同處理器的Java虛擬機中,才能提高應用程序的執行效率。

所謂句柄實際上是一個數據,是一個Long (整長型)的數據。

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。

從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之后其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。

如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動后,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那么就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪里去找該對象呢?

為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。

句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象

本質:WINDOWS程序中并不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應用程序,然后通過句柄來進行操作。

但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那么系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。


線程是指程序的一個指令執行序列,WIN32 平臺支持多線程程序,允許程序中存在多個線程。 在單 CPU 系統中,系統把 CPU 的時間片按照調度算法分配給各個線程,因此各線程實際上是分時執行的,在多 CPU 的 Windows NT 系統中, 同一個程序的不同線程可以被分配到不同的 CPU 上去執行。由于一個程序的各線程是在相同的地址空間運行的,因此設及到了如何共享內存, 如何通信等問題,這樣便需要處理各線程之間的同步問題,這是多線程編程中的一個難點。

線程,也被稱為輕量進程(lightweight processes)。計算機科學術語,指運行中的程序的調度單位。

線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的并發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。

在多中央處理器的系統里,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬于同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程接口來讓進程可以控制自己的線程與各處理器之間的關聯度(affinity)。

進程是程序在一個數據集合上運行的過程(注:一個程序有可能同時屬于

多個進程),它是操作系統進行資源分配和調度的一個獨立單位,進程可以簡單的分為系統進程(包括一般

Windows程序和服務進程)和用戶進程



Linux下的進程和線程

可執行文件由指令和數據組成。進程就是在計算機上運行的可執行文件針對特定的輸入數據的一個實例,同一個可執行程序文件如果操作不同的輸入數據就是兩個不同的進程。
線程是進程的一條執行路徑,它包含獨立的堆棧和CPU寄存器狀態,每個線程共享其所附屬的進程的所有的資源,包括打開的文件、頁表(因此也就共享整個用戶態地址空間)、信號標識及動態分配的內存等等。線程和進程的關系是:線程是屬于進程的,線程運行在進程空間內,同一進程所產生的線程共享同一物理內存空間,當進程退出時該進程所產生的線程都會被強制退出并清除。
Linux在核外采用1:1線程模型,即用一個核心進程(輕量進程)對應一個線程,將線程調度等同于進程調度,交給核心完成,而其它諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。因此可以把進程看作一組線程,這組線程擁有相同的線程組號(TGID),這個TGID就是這組線程序所附屬的進程的ID號,每個線程的ID號就是我們用ps命令所看到的LWP號。
為了方便,從現在起我們用任務來代替進程和線程,即每提到任務,我們就是指線程和進程,除非要強調線程和進程之間的不同之處。任務的周期從被fork開始一直到給任務從進程表中消失。一個進程包括:正文段(text),數據段(data),棧段(STACK)和共享內存段(SHARED MEMORY)。 轉載聲明: 本文轉自 http://www.cnitblog.com/Patrick/archive/2006/12/23/20997.html

轉載于:https://www.cnblogs.com/springmvc-hibernate/archive/2010/10/26/2484220.html

總結

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

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