程序、進(jìn)程、線程學(xué)習(xí)筆記
程序是計(jì)算機(jī)指令的集合,它以文件的形式存儲(chǔ)在計(jì)算機(jī)磁盤上;而進(jìn)程是一個(gè)正在運(yùn)行的程序的一個(gè)實(shí)例,是程序在其自身的地址空間中的一次執(zhí)行活動(dòng)。
程序不占用系統(tǒng)的運(yùn)行資源,程才可以申請(qǐng)資源、被系統(tǒng)調(diào)度、獨(dú)立運(yùn)行。
一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程中也可以同時(shí)訪問多個(gè)程序。
進(jìn)程由內(nèi)核對(duì)象和地址空間兩部分組成。內(nèi)核象是操作系統(tǒng)分配出的有特定數(shù)據(jù)結(jié)構(gòu)的一內(nèi)存塊,用于維護(hù)進(jìn)程的各種信息,進(jìn)程不能直接訪問該內(nèi)存塊,只能通過系統(tǒng)給提供的一些函數(shù)來獲取一些信息。地址空間包含了所有可執(zhí)行模塊或DLL模塊的代碼和數(shù)據(jù),還包括動(dòng)態(tài)內(nèi)存分配的空間,比如運(yùn)行中線程需要分配的堆棧和堆空間。
進(jìn)程是線程的容器,是線程的運(yùn)行環(huán)境,真正完成執(zhí)行地址空間中代碼的是線程。
一個(gè)進(jìn)程可以有多個(gè)線程,這些線程都執(zhí)行該進(jìn)程內(nèi)的同一地址空間中的代碼。
一個(gè)進(jìn)程至少得有一個(gè)線程來執(zhí)行其地址空間中的代碼。創(chuàng)建進(jìn)程時(shí),操作系統(tǒng)就會(huì)自動(dòng)創(chuàng)建該進(jìn)程的第一個(gè)線程,也就是主線程,然后再由主線程來調(diào)用其它線程,我們常說的main或WinMain函數(shù)就是主線程的入口函數(shù)。
對(duì)于32位的進(jìn)程來說,地址空間最大為4GB,這由進(jìn)程指針的尋址能力所限,而且對(duì)于每個(gè)進(jìn)程而言,該地址空間都是它私有的,其他的進(jìn)程是不能訪問的,而且我們所說的地址空間是虛擬的地址空間,怎么理解虛擬二字呢?就是說將物理內(nèi)存和頁面文件中的某部分拿出來映射為我們這里的地址空間,它只是內(nèi)存地址的一個(gè)范圍。
線程也是由對(duì)應(yīng)于它的內(nèi)核對(duì)象以及線程堆棧組成,這里的內(nèi)核對(duì)象也是一個(gè)有特定數(shù)據(jù)結(jié)構(gòu)的內(nèi)存塊,由于系統(tǒng)管理線程的統(tǒng)計(jì)信息。
由一個(gè)進(jìn)程創(chuàng)建的多個(gè)線程之間的地位都是平等的,它們都可以隨意的訪問進(jìn)程內(nèi)核對(duì)象中的所有句柄等等屬于該進(jìn)程的信息,而且各個(gè)線程之間是可以互相隨意的訪問彼此的線程堆棧的,因此線程間通信就很容易了,而且線程只有一個(gè)內(nèi)核對(duì)象和堆棧,因此占用的內(nèi)存少,所以提倡多線程編程,而不是創(chuàng)建多個(gè)進(jìn)程。
對(duì)于一個(gè)CPU,在某時(shí)刻只能有一個(gè)線程在運(yùn)行,多個(gè)線程的運(yùn)行是通過時(shí)間片輪轉(zhuǎn)來實(shí)現(xiàn)的,并不是真正意義上的同時(shí)運(yùn)行。
程序不占用系統(tǒng)的運(yùn)行資源,程才可以申請(qǐng)資源、被系統(tǒng)調(diào)度、獨(dú)立運(yùn)行。
一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程中也可以同時(shí)訪問多個(gè)程序。
進(jìn)程由內(nèi)核對(duì)象和地址空間兩部分組成。內(nèi)核象是操作系統(tǒng)分配出的有特定數(shù)據(jù)結(jié)構(gòu)的一內(nèi)存塊,用于維護(hù)進(jìn)程的各種信息,進(jìn)程不能直接訪問該內(nèi)存塊,只能通過系統(tǒng)給提供的一些函數(shù)來獲取一些信息。地址空間包含了所有可執(zhí)行模塊或DLL模塊的代碼和數(shù)據(jù),還包括動(dòng)態(tài)內(nèi)存分配的空間,比如運(yùn)行中線程需要分配的堆棧和堆空間。
進(jìn)程是線程的容器,是線程的運(yùn)行環(huán)境,真正完成執(zhí)行地址空間中代碼的是線程。
一個(gè)進(jìn)程可以有多個(gè)線程,這些線程都執(zhí)行該進(jìn)程內(nèi)的同一地址空間中的代碼。
一個(gè)進(jìn)程至少得有一個(gè)線程來執(zhí)行其地址空間中的代碼。創(chuàng)建進(jìn)程時(shí),操作系統(tǒng)就會(huì)自動(dòng)創(chuàng)建該進(jìn)程的第一個(gè)線程,也就是主線程,然后再由主線程來調(diào)用其它線程,我們常說的main或WinMain函數(shù)就是主線程的入口函數(shù)。
對(duì)于32位的進(jìn)程來說,地址空間最大為4GB,這由進(jìn)程指針的尋址能力所限,而且對(duì)于每個(gè)進(jìn)程而言,該地址空間都是它私有的,其他的進(jìn)程是不能訪問的,而且我們所說的地址空間是虛擬的地址空間,怎么理解虛擬二字呢?就是說將物理內(nèi)存和頁面文件中的某部分拿出來映射為我們這里的地址空間,它只是內(nèi)存地址的一個(gè)范圍。
線程也是由對(duì)應(yīng)于它的內(nèi)核對(duì)象以及線程堆棧組成,這里的內(nèi)核對(duì)象也是一個(gè)有特定數(shù)據(jù)結(jié)構(gòu)的內(nèi)存塊,由于系統(tǒng)管理線程的統(tǒng)計(jì)信息。
由一個(gè)進(jìn)程創(chuàng)建的多個(gè)線程之間的地位都是平等的,它們都可以隨意的訪問進(jìn)程內(nèi)核對(duì)象中的所有句柄等等屬于該進(jìn)程的信息,而且各個(gè)線程之間是可以互相隨意的訪問彼此的線程堆棧的,因此線程間通信就很容易了,而且線程只有一個(gè)內(nèi)核對(duì)象和堆棧,因此占用的內(nèi)存少,所以提倡多線程編程,而不是創(chuàng)建多個(gè)進(jìn)程。
對(duì)于一個(gè)CPU,在某時(shí)刻只能有一個(gè)線程在運(yùn)行,多個(gè)線程的運(yùn)行是通過時(shí)間片輪轉(zhuǎn)來實(shí)現(xiàn)的,并不是真正意義上的同時(shí)運(yùn)行。
posted on 2008-02-23 19:29 so true 閱讀(339) 評(píng)論(0) 編輯 收藏 所屬分類: C&C++