1. 程式人生 > >線程和進程有什麽區別?

線程和進程有什麽區別?

Java


先來打個比方

開個QQ,開了一個進程;開了迅雷,開了一個進程。

在QQ的這個進程裏,傳輸文字開一個線程、傳輸語音開了一個線程、彈出對話框又開了一個線程。

所以運行某個軟件,相當於開了一個進程。在這個軟件運行的過程裏(在這個進程裏),多個工作支撐的完成QQ的運行,那麽這“多個工作”分別有一個線程。

所以一個進程管著多個線程。

通俗的講:“進程是爹媽,管著眾多的線程兒子....

正兒八經的說

1、進程和線程的區別?

解析:(1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元

(2)同一個進程中可以包括多個線程,並且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進行至少包括一個線程。

(3)進程的創建調用fork或者vfork,而線程的創建調用pthread_create,進程結束後它擁有的所有線程都將銷毀,而線程的結束不會影響同個進程中的其他線程的結束

(4)線程是輕兩級的進程,它的創建和銷毀所需要的時間比進程小很多,所有操作系統中的執行功能都是創建線程去完成的

(5)線程中執行時一般都要進行同步和互斥,因為他們共享同一進程的所有資源

(6)線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有自己的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標誌


2、死鎖?死鎖產生的原因?死鎖的必要條件?怎麽處理死鎖?

解析:(--)相互等待資源而產生的一種僵持狀態,如果沒有外力的幹預將一直持續這個狀態

(--)系統資源不足、相互競爭資源、請求資源順序不當

(2)互斥、不可搶占、循環等待、請求與保持

(3)因為互斥是不可改變的,所以只能破壞其他三個條件中的一個來解除死鎖,方法:剝奪資源、殺死其中一個線程


3、Windows內存管理方式:段存儲、頁存儲、段頁存儲

解析:

4、進程的幾種狀態?

解析:(1)run(運行狀態):正在運行的進程或在等待隊列中對待的進程,等待的進程只要以得到cpu就可以運行

(2)Sleep(可中斷休眠狀態):相當於阻塞或在等待的狀態

(3)D(不可中斷休眠狀態):在磁盤上的進程

(4)T(停止狀態):這中狀態無法直觀的看見,因為是進程停止後就釋放了資源,所以不會留在linux中

(5)Z(僵屍狀態):子進程先與父進程結束,但父進程沒有調用wait或waitpid來回收子進程的資源,所以子進程就成了僵屍進程,如果父進程結束後任然沒有回收子進程的資源,那麽1號進程將回收

5、IPC通信方式?

解析:(1)管道(匿名管道(pipe親緣關系的進程通信)、命名管道(mkfifo/mknod))

(2)消息隊列:是基於消息的、用無親緣關系的進程間通信,主要函數:msgget、msgsend、msgrecv、msgctl

(3)信號量:相當於一把互斥鎖,通過p、v操作,主要函數:semget、semop、semctl

(4)共享內存:是進程間通信速度最快的,所以用經常是集合信號量或互斥鎖來實現同步,shmget、shmat、shmdt、shmctl

6、什麽是虛擬內存?

解析:是將進程部分裝入內存中,從而能實現一個很大的程序能在一個比它小的內存中運行,它的主要實現是靠程序的換進換出來實現的,因為內存中0~3G是用戶使用,3~4G才是內存使用,通過映射來實現來進行邏輯地址到物理地址的映射

7、虛擬地址、邏輯地址、線性地址、物理地址的區別?

解析: 分段機制把一個邏輯地址轉換為線性地址;接著,分頁機制把一個線性地址轉換為物理地址。

(1)虛擬地址:虛擬內存映射出來的地址

(2)邏輯地址:程序的段加偏移量形成的,C/C++程序中取地址求出來的地址就是邏輯地址

(3)線性地址:是邏輯地址到物理地址的中間層,只有啟動分頁機制的時候才有線性地址,如果沒有分頁機制,那麽線性地址就是物理地址

(4)物理地址:是內存中實實在在存在的硬件地址,

邏輯地址(啟動分段)--》線性地址(啟動分頁)--》物理地址


線程和進程有什麽區別?