主頁 >  其他 > 行程與執行緒

行程與執行緒

2021-12-22 07:17:55 其他

行程與執行緒

1 行程

1.1 行程的概念

行程就是正在運行的程式,它會占用對應的記憶體區域,由CPU進行執行與計算,

1.2 行程的特點

  • 獨立性
    行程是系統中獨立存在的物體,它可以擁有自己獨立的資源,每個行程都擁有自己私有的地址空間,在沒有經過行程本身允許的情況下,一個用戶行程不可以直接訪問其他行程的地址空間
  • 動態性
    行程與程式的區別在于,程式只是一個靜態的指令集合,而行程是一個正在系統中活動的指令集合,程式加入了時間的概念以后,稱為行程,具有自己的生命周期和各種不同的狀態,這些概念都是程式所不具備的.
  • 并發性
    多個行程可以在單個處理器CPU上并發執行,多個行程之間不會互相影響.

2 執行緒

2.1 執行緒的概念

執行緒是作業系統OS能夠進行運算調度的最小單位,它被包含在行程之中,是行程中的實際運作單位.
一個行程可以開啟多個執行緒,其中有一個主執行緒來呼叫本行程中的其他執行緒,
我們看到的行程的切換,切換的也是不同行程的主執行緒
多執行緒可以讓同一個行程同時并發處理多個任務,相當于擴展了行程的功能,

2.2 行程與執行緒的關系

一個作業系統中可以有多個行程,一個行程中可以包含一個執行緒(單執行緒程式),也可以包含多個執行緒(多執行緒程式)
行程與執行緒的關系
每個執行緒在共享同一個行程中的記憶體的同時,又有自己獨立的記憶體空間.
所以想使用執行緒技術,得先有行程,行程的創建是OS作業系統來創建的,一般都是C或者C++完成
行程與執行緒的關系

3 多執行緒的特性

3.1 隨機性

我們宏觀上覺得多個行程是同時運行的,但實際的微觀層面上,一個CPU【單核】只能執行一個行程中的一個執行緒,
那為什么看起來像是多個行程同時執行呢?
是因為CPU以納秒級別甚至是更快的速度高效切換著,超過了人的反應速度,這使得各個行程從看起來是同時進行的,也就是說,宏觀層面上,所有的行程看似并行【同時運行】,但是微觀層面上是串行的【同一時刻,一個CPU只能處理一件事】,
執行緒切換

串行與并行

串行是指同一時刻一個CPU只能處理一件事,類似于單車道
并行是指同一時刻多個CPU可以處理多件事,類似于多車道
在這里插入圖片描述
在這里插入圖片描述

3.2 CPU分時調度

時間片,即CPU分配給各個執行緒的一個時間段,稱作它的時間片,即該執行緒被允許運行的時間,如果在時間片用完時執行緒還在執行,那CPU將被剝奪并分配給另一個執行緒,將當前執行緒掛起,如果執行緒在時間片用完之前阻塞或結束,則CPU當即進行切換,從而避免CPU資源浪費,當再次切換到之前掛起的執行緒,恢復現場,繼續執行,
注意:我們無法控制OS選擇執行哪些執行緒,OS底層有自己規則,如:

  1. FCFS(First Come First Service 先來先服務演算法)
  2. SJS(Short Job Service短服務演算法)

CPU分片

3.3 執行緒的狀態

由于執行緒狀態比較復雜,我們由易到難,先學習執行緒的三種基礎狀態及其轉換,簡稱”三態模型” :

  • 就緒(可運行)狀態:執行緒已經準備好運行,只要獲得CPU,就可立即執行
  • 執行(運行)狀態:執行緒已經獲得CPU,其程式正在運行的狀態
  • 阻塞狀態:正在運行的執行緒由于某些事件(I/O請求等)暫時無法執行的狀態,即執行緒執行阻塞
    執行緒的3種狀態

就緒 → 執行:為就緒執行緒分配CPU即可變為執行狀態"
執行 → 就緒:正在執行的執行緒由于時間片用完被剝奪CPU暫停執行,就變為就緒狀態
執行 → 阻塞:由于發生某事件,使正在執行的執行緒受阻,無法執行,則由執行變為阻塞
(例如執行緒正在訪問臨界資源,而資源正在被其他執行緒訪問)
反之,如果獲得了之前需要的資源,則由阻塞變為就緒狀態,等待分配CPU再次執行

我們可以再添加兩種狀態:

  • 創建狀態:執行緒的創建比較復雜,需要先申請PCB,然后為該執行緒運行分配必須的資源,并將該執行緒轉為就緒狀態插入到就緒佇列中
  • 終止狀態:等待OS進行善后處理,最后將PCB清零,并將PCB回傳給系統
    執行緒的5種狀態

PCB(Process Control Block):為了保證參與并發執行的每個執行緒都能獨立運行,OS配置了特有的資料結構PCB來描述執行緒的基本情況和活動程序,進而控制和管理執行緒

3.4 執行緒狀態與代碼對照

執行緒狀態與代碼對照
執行緒生命周期,主要有五種狀態:

  1. 新建狀態(New) : 當執行緒物件創建后就進入了新建狀態.如:Thread t = new MyThread();
  2. 就緒狀態(Runnable):當呼叫執行緒物件的start()方法,執行緒即為進入就緒狀態.
    處于就緒(可運行)狀態的執行緒,只是說明執行緒已經做好準備,隨時等待CPU調度執行,并不是執行了t.start()此執行緒立即就會執行
  3. 運行狀態(Running):當CPU調度了處于就緒狀態的執行緒時,此執行緒才是真正的執行,即進入到運行狀態
    就緒狀態是進入運行狀態的唯一入口,也就是執行緒想要進入運行狀態狀態執行,先得處于就緒狀態
  4. 阻塞狀態(Blocked):處于運狀態中的執行緒由于某種原因,暫時放棄對CPU的使用權,停止執行,此時進入阻塞狀態,直到其進入就緒狀態才有機會被CPU選中再次執行.
    根據阻塞狀態產生的原因不同,阻塞狀態又可以細分成三種:
    等待阻塞:運行狀態中的執行緒執行wait()方法,本執行緒進入到等待阻塞狀態
    同步阻塞:執行緒在獲取synchronized同步鎖失敗(因為鎖被其他執行緒占用),它會進入同步阻塞狀態
    其他阻塞:呼叫執行緒的sleep()或者join()或發出了I/O請求時,執行緒會進入到阻塞狀態.當sleep()狀態超時.join()等待執行緒終止或者超時或者I/O處理完畢時執行緒重新轉入就緒狀態
  5. 死亡狀態(Dead):執行緒執行完了或者因例外退出了run()方法,該執行緒結束生命周期

4 多執行緒代碼創建方式1:繼承Thread

4.1 概述

Thread類本質上是實作了Runnable介面的一個實體,代表一個執行緒的實體
啟動執行緒的唯一方法就是通過Thread類的start()實體方法
start()方法是一native方法,它將通知底層作業系統,.最終由作業系統啟動一個新執行緒,作業系統將執行run()
這種方式實作的多執行緒很簡單,通過自己的類直接extends Thread,并重寫run()方法,就可以自動啟動新執行緒并執行自己定義的run()方法
模擬開啟多個執行緒,每個執行緒呼叫run()方法.

4.2 常用方法

構造方法

Thread() 分配新的Thread物件
Thread(String name) 分配新的Thread物件
Thread(Runnable target) 分配新的Thread物件
Thread(Runnable target,String name) 分配新的Thread物件

普通方法

static Thread currentThread( )
回傳對當前正在執行的執行緒物件的參考
long getId()
回傳該執行緒的標識
String getName()
回傳該執行緒的名稱
void run()
如果該執行緒是使用獨立的 Runnable 運行物件構造的,則呼叫該 Runnable 物件的 run 方法
static void sleep(long millions)
在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行)
void start()
使該執行緒開始執行:Java虛擬機呼叫該執行緒的run()

4.3 測驗多執行緒的創建方式1

創建包: cn.tedu.thread
創建類: TestThread1.java

package cn.tedu.thread;
/*本類用于多執行緒編程實作方案一:繼承Thread類來完成*/
public class TestThread1 {
    public static void main(String[] args) {
        //4.創建執行緒物件進行測驗
        /*4.new對應的是執行緒的新建狀態
        * 5.要想模擬多執行緒,至少得啟動2個執行緒,如果只啟動1個,是單執行緒程式*/
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        MyThread t4 = new MyThread();
        /*6.這個run()如果直接這樣呼叫,是沒有多執行緒搶占執行的效果的
        * 只是把這兩句話看作普通方法的呼叫,誰先寫,就先執行誰*/
        //t1.run();
        //t2.run();
        /*7.start()對應的狀態就是就緒狀態,會把剛剛新建好的執行緒加入到就緒佇列之中
        * 至于什么時候執行,就是多執行緒執行的效果,需要等待OS選中分配CPU
        * 8.執行的時候start()底層會自動呼叫我們重寫的run()種的業務
        * 9.執行緒的執行具有隨機性,也就是說t1-t4具體怎么執行
        * 取決于CPU的調度時間片的分配,我們是決定不了的*/
        t1.start();//以多執行緒的方式啟動執行緒1,將當前執行緒變為就緒狀態
        t2.start();//以多執行緒的方式啟動執行緒2,將當前執行緒變為就緒狀態
        t3.start();//以多執行緒的方式啟動執行緒3,將當前執行緒變為就緒狀態
        t4.start();//以多執行緒的方式啟動執行緒4,將當前執行緒變為就緒狀態
    }
}

//1.自定義一個多執行緒類,然后讓這個類繼承Thread
class MyThread extends Thread{
    /*1.多執行緒編程實作的方案1:通過繼承Thread類并重寫run()來完成的 */
    //2.重寫run(),run()里是我們自己的業務
    @Override
    public void run() {
        /*2.super.run()表示的是呼叫父類的業務,我們現在要用自己的業務,所以注釋掉*/
        //super.run();
        //3.完成業務:列印10次當前正在執行的執行緒的名稱
        for (int i = 0; i < 10; i++) {
            /*3.getName()表示可以獲取當前正在執行的執行緒名稱
            * 由于本類繼承了Thread類,所以可以直接使用這個方法*/
            System.out.println(i+"="+getName());
        }
    }
}

5 多執行緒代碼創建方式2:實作Runnable介面

5.1 概述

如果自己的類已經extends另一個類,就無法多繼承,此時,可以實作一個Runnable介面

5.2 常用方法

void run()使用實作介面Runnable的物件創建執行緒時,啟動該執行緒將導致在獨立執行的執行緒中呼叫物件的run()方法

5.3 練習2:測驗多執行緒的創建方式2

創建包: cn.tedu.thread
創建類: Thread2.java

package cn.tedu.thread;
/*本類用于多執行緒編程實作方案二:實作Runnable介面來完成*/
public class TestThread2 {
    public static void main(String[] args) {
        //5.創建自定義類的物件--目標業務類物件
        MyRunnable target = new MyRunnable();
        //6.如何啟動執行緒?自己沒有,需要與Thread建立關系
        Thread t1 = new Thread(target);
        Thread t2 = new Thread(target);
        Thread t3 = new Thread(target);
        Thread t4 = new Thread(target);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

//1.自定義多執行緒類
class MyRunnable implements Runnable{
    //2.添加父介面中的抽象方法run(),里面是自己的業務
    @Override
    public void run() {
        //3.寫業務,列印10次當前正在執行的執行緒名稱
        for (int i = 0; i < 10; i++) {
            /*問題:自定義類與父介面Runnable中都沒有獲取名字的方法
            * 所以還需要從Thread中找:
            * currentThread():靜態方法,獲取當前正在執行的執行緒物件
            * getName():獲取當前執行緒的名稱*/
            System.out.println(i+"="+Thread.currentThread().getName());
        }
    }
}

5.4 兩種實作方式的比較

  • 繼承Thread類
    優點: 撰寫簡單,如果需要訪問當前執行緒,無需使用Thread.currentThread()方法,直接使用this即可獲得當前執行緒
    缺點: 自定義的執行緒類已繼承了Thread類,所以后續無法再繼承其他的類
  • 實作Runnable介面
    優點: 自定義的執行緒類只是實作了Runnable介面或Callable介面,后續還可以繼承其他類,在這種方式下,多個執行緒可以共享同一個target物件,所以非常適合多個相同執行緒來處理同一份資源的情況,從而可以將CPU、代碼、還有資料分開(解耦),形成清晰的模型,較好地體現了面向物件的思想
    缺點: 編程稍微復雜,如想訪問當前執行緒,則需使用Thread.currentThread()方法

6 售票案例

需求:設計4個售票視窗,總計售票100張,用多執行緒的程式設計并寫出代碼

6.1 方案1:繼承Thread

創建包: cn.tedu.tickets
創建類: TestThread.java

package cn.tedu.tickets;
/*需求:設計多執行緒編程模型,4個視窗共計售票100張
* 本方案使用多執行緒編程方案1,繼承Thread類的方式來完成*/
public class TestThread {
    public static void main(String[] args) {
        //5.創建多個執行緒物件
        TicketThread t1 = new TicketThread();
        TicketThread t2 = new TicketThread();
        TicketThread t3 = new TicketThread();
        TicketThread t4 = new TicketThread();
        //6.以多執行緒的方式啟動
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

//1.自定義多執行緒售票類,繼承Thread
class TicketThread extends Thread{
    //3.定義變數,保存要售賣的票數
    /*問題:4個執行緒物件共計售票400張,原因是創建了4次物件,各自操作各自的成員變數
    * 解決:讓所有物件共享同一個資料,票數需要設定為靜態*/
    static int tickets = 100;
    //2.重寫父類的run(),里面是我們的業務
    @Override
    public void run() {
        //4.1回圈賣票
        while(true){
            try {
                //7.讓每個執行緒經歷休眠,增加執行緒狀態切換的頻率與出錯的概率
                //問題1:產生了重賣的現象:同一張票賣了多個人
                //問題2:產生了超賣的現象:超出了規定的票數100,出現了0 -1 -2這樣的票
                Thread.sleep(10);//讓當前執行緒休眠10ms
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //4.2列印當前正在賣票的執行緒名稱,并且票數-1
            System.out.println(getName()+"="+tickets--);
            //4.3做判斷,如果沒有票了,就退出死回圈
            if(tickets <= 0) break;//注意,死回圈一定要設定出口
        }
    }
}

6.2 方案2:實作Runnable

創建包: cn.tedu.tickets
創建類: TestRunnable.java

package cn.tedu.tickets;
/*需求:設計多執行緒編程模型,4個視窗共計售票100張
 * 本方案使用多執行緒編程方案2,實作Runnable介面的方式來完成*/
public class TestRunnable {
    public static void main(String[] args) {
        //5.創建Runnable介面的實作類物件,作為目標業務物件
        TicketRunnable target = new TicketRunnable();
        //6.創建多個Thread類執行緒物件,并將target業務物件交給多個執行緒物件來處理
        Thread t1 = new Thread(target);
        Thread t2 = new Thread(target);
        Thread t3 = new Thread(target);
        Thread t4 = new Thread(target);
        //7.以多執行緒的方式啟動多個執行緒物件
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

//1.自定義多執行緒類實作Runnable介面
class TicketRunnable implements Runnable{
    //3.定義一個成員變數,用來保存票數100
    /*由于自定義類物件只創建了一次,所以票數被所有執行緒物件Thread類的物件共享*/
    int tickets = 100;
    //2.添加介面中未實作的方法,方法里是我們的業務
    @Override
    public void run() {
        //4.1回圈賣票
        while(true){
            //8.讓執行緒休眠10ms,增加執行緒狀態切換的概率和出錯的概率
            try {
                Thread.sleep(10);//讓當前執行緒休眠10ms
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //4.2列印當前正在售票的執行緒名稱 & 票數-1
            System.out.println(Thread.currentThread().getName()+"="+tickets--);
            //4.3設定死回圈的出口,沒票了就停止賣票
            if(tickets <=0 ) break;
        }
    }
}

6.3 問題

  1. 每次創建執行緒物件,都會生成一個tickets變數值是100,創建4次物件就生成了400張票了,不符合需求,怎么解決呢?能不能把tickets變數在每個物件間共享,就保證多少個物件都是賣這100張票,
    解決方案: 用靜態修飾
  2. 產生超賣,0 張 、-1張、-2張,
  3. 產生重賣,同一張票賣給多人,
  4. 多執行緒安全問題是如何出現的?常見情況是由于執行緒的隨機性+訪問延遲,
  5. 以后如何判斷程式有沒有執行緒安全問題?
    在多執行緒程式中 + 有共享資料 + 多條陳述句操作共享資料
    解決方案:下一節 同步鎖點這里

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389022.html

標籤:其他

上一篇:中國DevOps社區峰會 2021·深圳——我的識訓與作業要點

下一篇:Nginx:Nginx熱部署

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more