關於程序和執行緒的思考

2022-09-09 11:15:18 字數 2350 閱讀 1854

程式:是為了完成特定任務,用某種語言編寫的一組指令組合。一段靜態**。

程序:是程式的一次執行過程,或是正在執行的乙個程式,是乙個動態的過程,有它自身的產生、存在和消亡的過程---生命週期

- 如:執行的qq

- 程式是靜態的,程序是動態的

- 程序作為資源分配的單位,系統在執行時為每乙個程序分配不同的記憶體區域

**程式並不能單獨執行,只有將程式裝載到記憶體中,系統為它分配資源才能執行,而這種執行的程式就稱之為程序**

**為什麼引入程序的概念?**

在很久之前,計算機是使用者敲乙個命令在執行的,如果使用者不敲命令,那麼計算機就會等待,這樣顯的很呆。所以有人想出了批處理系統,把寫好的程式寫在磁帶上,讓cpu批處理。但是這會導致乙個問題就是,任務a在請求io的時候,cpu要等任務a請求io完之後才能執行任務a,在等待的過程中,cpu是空閒的,所以導致效率不高。

這時候又出現了幾個問題,記憶體中始終都只有乙個程式在執行,如果想要解決上面的問題,就必然要在記憶體中裝入多個程式,那麼計算機是如何辨別不同程式的標記呢?程式所需要的資源又是如何辨別的呢?暫停之後又如何恢復到之前的程式呢?

**所以程序就出現了,**用程序來對應程式,每個程序來對應一定的記憶體位址空間,並且每個程序只能使用自己的記憶體空間,各個程序互不干擾,程序裡面包含pcb(程序管理塊),它裡面包含程序的各種資訊。

執行緒:程序可以進一步細化為執行緒,是乙個程式內部的一條執行路徑

- 若乙個程序同一時間**並行**執行多個執行緒,就是支援多執行緒的

- 執行緒作為排程和執行的單位,每個執行緒都擁有獨立的執行棧和程式計數器,執行緒的切換開銷小。

- 乙個程序中的多個執行緒共享相同的記憶體單元/記憶體位址空間->它們從同一堆中分配物件,可以訪問相同的變數和物件(方法區,堆),這就會導致執行緒間的通訊便捷,但多個執行緒操作共享的資源可能會導致安全的隱患,例如死鎖。

**為什麼有了程序還要出現執行緒這個概念?**

人們對實時性有了要求,因為乙個程序在乙個時段內只能做乙個事情,如果乙個程序有多個子任務的時候,只能逐個執行,很影響效率。所以人們在想能不能在同一時間內程序的裡面任務分多個路徑去執行。讓乙個執行緒去執行乙個子任務,乙個程序包含乙個以上的執行緒,讓使用者感覺系統在同時做很多事,滿足使用者的實時性。例如360軟體,一邊防毒,一邊清理垃圾,就是多執行緒。

**執行緒和程序的區別?**

乙個程序是乙個獨立的執行環境,它可以被看作乙個程式,或者乙個應用,而執行緒是程序中執行的乙個子任務。

**從排程**:程序是資源分配的最小單位,執行緒是cpu排程的最小單位。

**從** **資源開銷** :程式之間切換會有較大的開銷,每個執行緒都有自己的獨立的執行棧和pc,執行緒之間切換的開銷小

執行緒的生命週期

執行緒同步方式

方式一同步**塊

```j**a

synchronized(同步監視器)

```說明:

- 操作共享資料的**,即為需要被同步的**

- 共享資料,多個執行緒共同操作的變數,例如:ticket就是共享資料,使用implements runable的方式建立執行緒,子類只建立一次,那麼子類裡面的成員變數ticket就只存在乙份,又因為多個執行緒的構造器傳入了這個子類的物件,所以實現了共享資料

- 同步監視器,俗稱:鎖。任何乙個類的物件,都可以充當鎖。要求:多個執行緒必須要共用同一把鎖

同步的方式,解決了執行緒的安全問題。

但是操作同步**時,只能有乙個執行緒參與,其他執行緒等待,相當於乙個單執行緒的過程,效率低。

關於同步方法的總結:

1. 同步方法仍然涉及到同步監視器,只是不需要我們顯示的宣告。

2. 非靜態的同步方法,同步監視器是:this

靜態的同步方法,同步監視器是:當前類的本身

**lock的方式**

實現2個執行緒交叉買票

```j**a

package com.example.demo;

import j**a.util.concurrent.locks.lock;

import j**a.util.concurrent.locks.reentrantlock;

class test_thread4 implements runnable finally }}

}public static void main(string args) throws interruptedexception

}

關於程序和執行緒

什麼是程序。最直觀的就是乙個個 pid,官方的說法就 程序是程式在計算機上的一次執行活動。執行緒是可執行 的可分派單元。這個名稱 於 執行的線索 的概念。在基於執行緒的多工的環境中,所有程序有至少乙個執行緒,但是它們可以具有多個任務。這意味著單個程式可以併發執行兩個或者多個任務。1.概念 程序 正在...

關於執行緒和程序的使用

最近在研究android自動化測試,為了減小log日誌,每次迴圈執行之後清空日誌,在迴圈體中使用執行緒,如下 new thread new runnable catch ioexception e catch interruptedexception e start thread.interrupt...

關於執行緒池思考

coding utf 8 import random import string import time import threading from threading import lock class mythread threading.thread def init self,func,ar...