最新资讯

  • 【Linux】:多线程(读写锁 && 自旋锁)

【Linux】:多线程(读写锁 && 自旋锁)

2025-04-28 03:01:14 0 阅读

✨                                                 倘若南方知我意,莫将晚霞落黄昏      🌏 

 📃个人主页:island1314

🔥个人专栏:Linux—登神长阶

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏  💞 💞 💞


目录

1. 读写锁 🔏

1.1 基本概念

1.2 读写锁的工作原理及特点

1.3 读写锁的实现

🥝 读写锁相关函数

🥝 案例如下:

1.4 读写锁优缺点及应用场景

🍉 优点:

🍉 缺点:

🍉 读写锁应用场景:

1.5 性能开销:读写锁 VS 互斥锁

2. 自旋锁 🔐

2.1 基本概念

2.2 自旋锁的原理

2.3 自旋锁实现

2.4 自旋锁优缺点及应用场景

🥑 优点:

🥑 缺点:

🥑使用场景:

2.5 自旋锁 VS 互斥锁


1. 读写锁 🔏

1.1 基本概念

🔥 读写锁(Read-Write Lock)是一种用于多线程环境下同步访问共享资源的锁。它与传统的互斥锁(Mutex)有所不同,提供了更细粒度的控制,以便提高并发性能。它允许多个线程同时 读取 数据,但在写入数据时,必须确保只有一个线程可以进行写操作,并且在写操作期间,所有的读操作都必须等待。

💧 读写锁的核心思想是:读操作之间是可以并发执行的,而写操作是独占的,即不能与其他读操作或者写操作同时执行

1.2 读写锁的工作原理及特点

  • 即读锁允许多个线程同时获得,因为读操作本身是线程安全的;而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的

🐇 读写锁的特点:

  • 读读不互斥:多个读线程可以同时访问共享资源
  • 读写互斥:读操作和写操作互斥,即在写操作进行时,其他线程不能进行读或写操作
  • 写写互斥:多个写线程不能同时进行写操作

🐇 具体来说,读写锁的行为如下:

  • 读操作(共享锁)

    • 如果没有线程正在持有写锁,那么多个线程可以同时获得读锁并执行读取操作。
    • 读操作不会阻塞其他读操作,但会阻塞写操作。
  • 写操作(独占锁)

    • 写操作会阻塞所有其他的读操作和写操作。换句话说,在某个线程持有写锁期间,其他线程既无法获得读锁也无法获得写锁。
    • 写操作是独占的,确保在操作过程中共享数据的一致性

1.3 读写锁的实现

🥝 读写锁相关函数

在书写具体代码之前,我们先来了解一下其相关函数

① 初始化锁

原型:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);

参数:
 rwlock: 指向 pthread_rwlock_t 类型的读写锁对象的指针。
 attr: 一个指向 pthread_rwlockattr_t 类型的指针,可以设置锁的属性。
     如果不需要特定的属性,通常可以将其设置为 NULL。

返回值:
返回 0 表示成功,返回错误码(如 EINVAL)表示初始化失败。

范例:
#include 
#include 

pthread_rwlock_t rwlock;

int main() {
    // 初始化读写锁
    if (pthread_rwlock_init(&rwlock, NULL) != 0) {
        perror("pthread_rwlock_init");
        return 1;
    }

    // 后续可以使用 rwlock 执行读写操作

    // 销毁读写锁
    pthread_rwlock_destroy(&rwlock);

    return 0;
}

🎈 pthread_rwlock_init 用于初始化一个读写锁。该函数会创建一个 pthread_rwlock_t 类型的读写锁变量,使其处于初始化状态,供后续的线程操作使用

② 获取锁

a. 读锁

原型:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

参数:
rwlock: 指向要获取读锁的 pthread_rwlock_t 类型的读写锁对象。
返回值:

返回 0 表示成功,返回错误码表示失败(例如 EBUSY 表示写锁被持有,当前线程无法获得读锁)

范例:
#include 
#include 

pthread_rwlock_t rwlock;

void* read_data(void* arg) {
    pthread_rwlock_rdlock(&rwlock);  // 获取读锁
    printf("Reading data...
");
    pthread_rwlock_unlock(&rwlock);  // 释放读锁
    return NULL;
}

int main() {
    // 初始化读写锁
    pthread_rwlock_init(&rwlock, NULL);

    pthread_t threads[3];
    for (int i = 0; i < 3; i++) {
        pthread_create(&threads[i], NULL, read_data, NULL);
    }

    for (int i = 0; i < 3; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);  // 销毁读写锁
    return 0;
}
// 在上述代码中,多个线程可以同时获得读锁并执行读取操作,而无需相互阻塞。

🎈 pthread_rwlock_rdlock 用于获取读锁,即共享锁。多个线程可以同时持有读锁进行读取操作,但在任何时刻,写锁无法被获得,直到所有的读锁都被释放。

b. 写锁

原型:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

参数:
rwlock: 指向要获取写锁的 pthread_rwlock_t 类型的读写锁对象。

返回值:
返回 0 表示成功,返回错误码表示失败如: EBUSY 表示有其他线程持有读锁或写锁,当前线程无法获得写锁

范例:
#include 
#include 

pthread_rwlock_t rwlock;

void* write_data(void* arg) {
    pthread_rwlock_wrlock(&rwlock);  // 获取写锁
    printf("Writing data...
");
    pthread_rwlock_unlock(&rwlock);  // 释放写锁
    return NULL;
}

int main() {
    // 初始化读写锁
    pthread_rwlock_init(&rwlock, NULL);

    pthread_t threads[2];
    for (int i = 0; i < 2; i++) {
        pthread_create(&threads[i], NULL, write_data, NULL);
    }

    for (int i = 0; i < 2; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);  // 销毁读写锁
    return 0;
}

// 在上面的示例中,write_data 函数每次都获取写锁,并在完成写操作后释放写锁。
// 在写操作期间,不允许其他线程获取读锁或写锁

🎈 pthread_rwlock_wrlock 用于获取写锁。写锁是独占的,即任何一个线程持有写锁时,其他线程不能获得读锁或写锁。只有当所有线程都释放了读锁,写锁才能被获取。

③ 释放锁

原型:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

参数:
rwlock: 指向需要释放锁的 pthread_rwlock_t 类型的读写锁对象。

返回值:
返回 0 表示成功,返回错误码表示失败(例如 EINVAL 表示锁没有被当前线程持有)

🎈 每当一个线程完成对共享资源的读或写操作时,它需要释放相应的锁。pthread_rwlock_unlock 用于释放由 pthread_rwlock_rdlock 或 pthread_rwlock_wrlock 获得的锁。

🥝 案例如下:
#include 
#include 
#include 
#include 
#include 
#include 

// 共享资源
int shared_data = 0;

// 读者锁
pthread_rwlock_t rwlock;

// 读者线程函数
void *Reader(void *arg)
{
    // slee(1); // 读者优先, 一旦读者进入 && 读者很多,写者就进不去了
    int number = *(int*)arg;
    while(true)
    {
        pthread_rwlock_rdlock(&rwlock);     // 读者加锁
        std::cout << "读者- " << number << " 正在读取数据, 数据是: " << shared_data << std::endl;
        sleep(1);                           // 模拟读取操作
        pthread_rwlock_unlock(&rwlock);     // 解锁
    }
    delete (int*)arg;
    return NULL;
}

// 写者线程函数
void *Writer(void *arg)
{
    int number = *(int*)arg;
    while(true)
    {
        pthread_rwlock_wrlock(&rwlock); // 写者加锁
        shared_data = rand() % 100;     // 修改共享数据
        std::cout << "写者- " << number << " 正在写入, 新的数据是: " << shared_data << std::endl;
        sleep(2);                       // 模拟写入操作
        pthread_rwlock_unlock(&rwlock); // 解锁
    }
    delete (int*)arg;
    return NULL;
}


int main()
{
    srand(time(nullptr)^getpid());
    pthread_rwlock_init(&rwlock, NULL); // 初始化读写锁

    // 可以提高读写数量配比,观察现象
    const int reader_num = 2;
    const int writer_num = 2;
    const int total = reader_num + writer_num;
    pthread_t threads[total]; // 假设读者和写者数量相等

    // 创建读者线程
    for(int i = 0; i < reader_num; ++i)
    {
        int *id = new int(i);
        pthread_create(&threads[i], NULL, Reader, id);
    }

    // 创建写者线程
    for(int i = reader_num; i < total; ++i)
    {
        int *id = new int(i - reader_num);
        pthread_create(&threads[i], NULL, Writer, id);
    }

    // 等待所有线程完成
    for(int i = 0; i < total; ++i)
    {
        pthread_join(threads[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);    // 销毁读写锁

    return 0;
}

输出结果如下:

分析:

  • 上面我们创建了 两个读者、两个写者,读者线程每次获取读锁并且读取数据后休眠一秒,而写者线程每次获取写锁后休眠 2 s,这种不对称休眠可能会使写者长时间处于等待
  • 写锁,它是独占的,意味着任何时候只能有 一个线程 获得写锁。即使你创建了两个写者线程,只有一个线程能在某一时刻获得写锁,另一个线程必须等待,直到当前持有写锁的线程释放它。
  • 因此大部分情况,我们都只看到读锁读取数据,少部分情况出现写锁写入

那么我们做出一些修改,比如让读锁在加锁前就休眠 1 s

则出现大部分情况都是写者正在写入,读者很难读取到

同样地,我们也可以修改读者、写者数量来改变输出情况,大家也可以自己试试,我就不多尝试了

1.4 读写锁优缺点及应用场景

🍉 优点:
  • 并发性:读操作的并发执行大大提高了系统的吞吐量,尤其是当读操作远多于写操作时,读写锁能够显著提高性能。
  • 资源共享:多个线程可以在不干扰彼此的情况下同时读取共享资源,提高了资源利用率。
🍉 缺点:

虽然读写锁提高了并发性能,但它也有一些潜在的缺点:

  1. 写操作的饥饿问题:如果系统中有大量的读操作而写操作很少发生,可能会导致写线程长期得不到执行。这种现象被称为写操作的 饥饿(starvation)。一些实现会通过公平策略来解决这个问题。

  2. 实现复杂性:相比普通的互斥锁,读写锁的实现更复杂,需要管理多个线程的访问请求,可能会导致死锁或者性能下降,尤其是在高并发环境下。

  3. 性能瓶颈:在某些场景下,读写锁的性能提升可能并不显著,特别是在写操作占主导地位时,锁的争用可能导致性能瓶颈

🍉 读写锁应用场景:
  • 读操作频繁,写操作较少:如果你的应用中读操作远多于写操作,使用读写锁可以显著提高性能,因为多个线程可以同时执行读操作,而写操作则需要独占锁,避免了不必要的阻塞。示例:数据库缓存、Web 服务器的请求处理等。
  • 不需要严格顺序的读操作:读操作之间不需要顺序或依赖关系时,多个线程可以并发执行读操作,提高并发性。

1.5 性能开销:读写锁 VS 互斥锁

  • 读写锁的性能开销与普通互斥锁相比,通常情况下读写锁的单次加锁开销大于互斥锁。
    • 这是因为读写锁需要进行额外的引用计数和加锁读写性质判别,这些操作增加了其复杂性和性能开销。
  • 在设计上,读写锁比互斥锁更复杂,其内部加锁和解锁的逻辑也更为复杂,需要更新读者和写者的数量,而互斥锁则无需这样的操作。
  • 然而,读写锁的性能优势在于其在读多写少的场景下表现更佳。
    • 当读操作远多于写操作时,读写锁可以允许多个读线程同时访问共享资源,从而提高并发性能。
    • 相反,在写操作频繁的情况下,读写锁的性能会比互斥锁差,因为写操作必须互斥进行,读写锁需要处理额外的逻辑来避免写锁“饥饿”

1.6 优先策略

🦋 读者优先(Reader-Preference)

  • 在这种策略中, 系统会尽可能多地允许多个读者同时访问资源(比如共享文件或数据) , 而不会优先考虑写者。 这意味着当有读者正在读取时, 新到达的读者会立即被允许进入读取区, 而写者则会被阻塞, 直到所有读者都离开读取区。 读者优先策略可能会导致写者饥饿(即写者长时间无法获得写入权限) , 特别是当读者频繁到达时。

🦋 写者优先(Writer-Preference)

  • 在这种策略中, 系统会优先考虑写者。 当写者请求写入权限时, 系统会尽快地让写者进入写入区, 即使此时有读者正在读取。 这通常意味着一旦有写者到达, 所有后续的读者都会被阻塞, 直到写者完成写入并离开写入区。 写者优先策略可以减少写者等待的时间, 但可能会导致读者饥饿(即读者长时间无法获得读取权限) , 特别是当写者频繁到达时。

2. 自旋锁 🔐

2.1 基本概念

🔥 自旋锁(Spinlock)是一种简单的同步机制,用于在多线程或多核系统中防止并发访问共享资源。在获取锁时,如果锁被其他线程占用,线程并不会进入休眠状态,而是不断地重复检查锁是否可用,这个过程就被称为“自旋”

2.2 自旋锁的原理

🐳 自旋锁通常使用一个共享的标志位(如一个布尔值)来表示锁的状态。当标志位为true 时,表示锁已被某个线程占用;当标志位为false 时,表示锁可用。当一个线程尝试获取自旋锁时,它会不断检查标志位:
如果标志位为 false,表示锁可用,线程将设置标志位为true,表示自己占用了锁,并进入临界区。
如果标志位为 true(即锁已被其他线程占用),线程会在一个循环中不断自旋等待,直到锁被释放。

2.3 自旋锁实现

自旋锁的实现通常使用原子操作来保证操作的原子性,常用的软件实现方式是通过 CAS(Compare-And-Swap)指令实现。以下是一个简单的自旋锁实现示例(伪代码):

#include 
#include 
#include 
#include 
// 使用原子标志来模拟自旋锁
atomic_flag spinlock = ATOMIC_FLAG_INIT; // ATOMIC_FLAG_INIT 是 0
// 尝试获取锁
void spinlock_lock() {
	while (atomic_flag_test_and_set(&spinlock)) {
		// 如果锁被占用,则忙等待
	}
}
// 释放锁
void spinlock_unlock() {
	atomic_flag_clear(&spinlock);
}


typedef _Atomic struct
{
#if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1
	_Bool __val;
#else
	unsigned char __val;
#endif
}atomic_flag;

功能描述

  • atomic_flag_test_and_set 函数检查 atomic_flag 的当前状态。
  • 如果atomic_flag 之前没有被设置过(即其值为 false 或“未设置”状态),则函数会将其设置为 true(或“设置”状态),并返回先前的值(在这种情况下为 false)。
  • 如果atomic_flag 之前已经被设置过(即其值为 true),则函数不会改变其状态,但会返回 true。

原子性

  • 这个操作是原子的,意味着在多线程环境中,它保证了对 atomic_flag 的读取和修改是不可分割的。当一个线程调用此函数时,其他线程无法看到这个操作的任何中间状态,这确保了操作的线程安全性。

Linux 提供的自旋锁系统调用

#include 

int pthread_spin_lock(pthread_spinlock_t *lock);
int pthread_spin_trylock(pthread_spinlock_t *lock);
int pthread_spin_unlock(pthread_spinlock_t *lock);
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t *lock);

注意事项

  • 使用自旋锁时,需要确保锁被释放的时间尽可能短,以避免 CPU 资源的浪费。
  • 在多 CPU 环境下,自旋锁可能不如其他锁机制高效,因为它可能导致线程在不同的 CPU 上自旋等待。

结论

  • 自旋锁是一种适用于短时间内锁竞争情况的同步机制,它通过减少线程切换的开销来提高锁操作的效率。然而,它也存在 CPU 资源浪费和可能引起活锁等缺点。
  • 在使用自旋锁时,需要根据具体的应用场景进行选择,并确保锁被释放的时间尽可能短。

案例: 抢票卖票

#include 
#include 
#include 
#include 

int ticket = 1000;
pthread_spinlock_t lock;

void *routine(void *arg)
{
    char *id = (char*)arg;
    while(1){
        if (ticket > 0){
            usleep(1000);
            printf("%s sells ticket:%d
", id, ticket);
            ticket--;
        }
        else{
            break;
        }
    }
    return nullptr;
}

int main(){
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, NULL, routine, (void *) "thread-1");
    pthread_create(&t2, NULL, routine, (void *) "thread-2");
    pthread_create(&t3, NULL, routine, (void *) "thread-3");
    pthread_create(&t4, NULL, routine, (void *) "thread-4");

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);

    return 0;
}

还记得我们之前写的买票问题嘛,这个最后由于竞争问题,导致最后会出现负值,如下:

加上自旋锁,修改如下:

#include 
#include 
#include 
#include 

int ticket = 1000;
pthread_spinlock_t lock;

void *routine(void *arg)
{
    char *id = (char*)arg;
    while(1)
    {
        pthread_spin_lock(&lock);
        if (ticket > 0)
        {
            usleep(1000);
            printf("%s sells ticket:%d
", id, ticket);
            ticket--;
            pthread_spin_unlock(&lock);
        }
        else{
            pthread_spin_unlock(&lock);
            break;
        }
    }
    return nullptr;
}


int main()
{
    pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
    pthread_t t1, t2, t3, t4;

    pthread_create(&t1, NULL, routine, (void *) "thread-1");
    pthread_create(&t2, NULL, routine, (void *) "thread-2");
    pthread_create(&t3, NULL, routine, (void *) "thread-3");
    pthread_create(&t4, NULL, routine, (void *) "thread-4");

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);

    return 0;
}

相比于之前的互斥锁,这里我们把 加锁放到了 while 循环内部,因为需要一直自检锁,此时结果如下:

2.4 自旋锁优缺点及应用场景

🥑 优点:
  1. 高效的短期锁竞争:如果锁持有时间很短,自旋锁可以非常高效,因为它避免了线程上下文切换的开销。
  2. 实现简单:自旋锁的实现通常非常简单,基本上只需要一个标志位(flag)和原子操作
  3. 低延迟:自旋锁适用于短时间内的锁竞争情况,因为它不会让线程进入休眠状
    态,从而避免了线程切换的开销,提高了锁操作的效率。
  4. 减少系统调度开销:等待锁的线程不会被阻塞,不需要上下文切换,从而减少了
    系统调度的开销
🥑 缺点:
  1. 高 CPU 使用率:如果线程需要等待很长时间才能获取锁,自旋锁会造成 CPU 时间片的浪费,因为线程会在忙等期间占用 CPU 资源。
  2. 可能导致优先级反转:如果一个低优先级的线程持有锁,而高优先级线程自旋等待,会造成优先级反转的问题(此问题可以通过其他技术如优先级继承来解决)。
  3. 不适用于长时间锁持有:如果锁的持有时间较长,自旋锁并不适合,因为自旋等待会导致极大的性能问题
  4. 可能引起活锁:当多个线程同时自旋等待同一个锁时,如果没有适当的退避策略,可能会导致所有线程都在不断检查锁状态而无法进入临界区,形成活锁
🥑使用场景:
  1. 短暂等待的情况:适用于锁被占用时间很短的场景,如多线程对共享数据进行简单的读写操作。
  2. 多线程锁使用:通常用于系统底层,同步多个 CPU 对共享资源的访问
  3. 锁的持有时间非常短:例如,对于某些非常简单的操作(如计数器的增减),自旋锁可以有效减少线程上下文切换的开销。
  4. 锁争用较少:如果多个线程竞争同一个锁的概率较小,则使用自旋锁可以减少等待时间,避免上下文切换的开销。

2.5 自旋锁 VS 互斥锁

🔥 与传统的互斥锁(Mutex)不同,互斥锁通常会让线程在无法获得锁时进入休眠状态,减少 CPU 的浪费,而自旋锁则在锁被占用时不断轮询,直到获取到锁。这种方式通常用于锁持有时间较短的场景,因为自旋锁避免了线程切换的开销,但是不合理的使用,可能也会浪费 CPU 资源


3. 共勉 🔥

 

【*★,°*:.☆( ̄▽ ̄)/$:*.°★* 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Linux】的内容,请持续关注我 !!

本文地址:https://www.vps345.com/4214.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge llama 算法 opencv 自然语言处理 神经网络 语言模型 ssh 进程 操作系统 进程控制 Ubuntu 阿里云 网络 网络安全 网络协议 ubuntu deepseek Ollama 模型联网 API CherryStudio RTSP xop RTP RTSPServer 推流 视频 科技 ai java 人工智能 个人开发 python MCP ssl tcp/ip 分布式 面试 性能优化 jdk intellij-idea 架构 运维开发 云原生 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn harmonyos 华为 开发语言 typescript 计算机网络 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 rust http 数据库 centos oracle 关系型 安全 fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 nginx dubbo vscode rust腐蚀 websocket .net 笔记 C 环境变量 进程地址空间 sqlserver github AI Agent 前端框架 深度学习 YOLO 目标检测 计算机视觉 物联网 ESP32 c++ 单片机 aws googlecloud macos 向日葵 vSphere vCenter 软件定义数据中心 sddc cuda cudnn anaconda golang 后端 机器学习 僵尸进程 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 jmeter 软件测试 HCIE 数通 rpc .netcore gateway Clion Nova ResharperC++引擎 Centos7 远程开发 智能路由器 外网访问 内网穿透 端口映射 live555 rtsp rtp node.js json html5 firefox ESXi mysql 自动化 android 鸿蒙 kubernetes 容器 学习方法 经验分享 程序人生 docker windows 微服务 springcloud ollama 大模型 mac vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 numpy gpu算力 pycharm ide asm Dify 嵌入式 linux驱动开发 arm开发 嵌入式硬件 DeepSeek-R1 API接口 flutter Hyper-V WinRM TrustedHosts 爬虫 数据集 MacOS录屏软件 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 efficientVIT YOLOv8替换主干网络 TOLOv8 camera Arduino 电子信息 WSL2 c# debian PVE 创意 社区 cpu 内存 实时 使用 iot dell服务器 go 代理模式 Windsurf 开源 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 react.js 前端面试题 持续部署 编辑器 鸿蒙系统 统信UOS 麒麟 bonding 链路聚合 计算机外设 电脑 软件需求 adb protobuf 序列化和反序列化 安装 ddos chatgpt llama3 Chatglm 开源大模型 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 ffmpeg 音视频 Dell R750XS mcu 信息与通信 华为云 温湿度数据上传到服务器 Arduino HTTP udp unity ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 学习 sql KingBase VMware安装mocOS VMware macOS系统安装 uni-app 大数据 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 oceanbase rc.local 开机自启 systemd vim 银河麒麟 kylin v10 麒麟 v10 HarmonyOS Next php spring boot tomcat 命名管道 客户端与服务端通信 postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 LDAP flask AI编程 AIGC pytorch word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 多进程 Trae AI代码编辑器 git ansible tcpdump 智能手机 矩阵 YOLOv8 NPU Atlas800 A300I pro 服务器管理 宝塔面板 配置教程 服务器安装 网站管理 unix 低代码 ArcTS 登录 ArcUI GridItem 其他 arkUI apache excel r语言 数据可视化 数据分析 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 客户端 java-ee 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 spring cloud kafka hibernate 机器人 visual studio code agi 工业4.0 ecmascript KVM redis 缓存 spring 漏洞 bash kind 微信开放平台 微信公众平台 微信公众号配置 wireshark 测试工具 同步 备份 建站 安全威胁分析 企业微信 Linux24.04 deepin 金融 AI大模型 大模型入门 Deepseek 大模型教程 DeepSeek Cookie IPMI bug 负载均衡 豆瓣 追剧助手 迅雷 nas 微信 远程工作 弹性计算 云服务器 裸金属服务器 弹性裸金属服务器 虚拟化 微信小程序 小程序 rag ragflow ragflow 源码启动 openEuler unity3d 网络穿透 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer SSH Linux Xterminal ue4 着色器 ue5 虚幻 pygame 小游戏 五子棋 pip 报错 恒源云 jenkins 软件工程 致远OA OA服务器 服务器磁盘扩容 gitlab express okhttp CORS 跨域 Reactor 设计模式 C++ nvidia dns 程序员 半虚拟化 硬件虚拟化 Hypervisor 传统数据库升级 银行 大语言模型 LLMs matplotlib dify VMware安装Ubuntu Ubuntu安装k8s k8s kylin arm mysql离线安装 ubuntu22.04 mysql8.0 oneapi 大模型微调 系统架构 实时音视频 混合开发 环境安装 JDK centos-root /dev/mapper yum clean all df -h / du -sh 进程信号 京东云 django sqlite 华为认证 网络工程师 交换机 safari Mac 系统 监控 自动化运维 conda MQTT mosquitto 消息队列 ollama下载加速 echarts 信息可视化 网页设计 n8n 工作流 workflow 媒体 firewalld pillow 硬件架构 c语言 https AISphereButler 课程设计 shell outlook chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 kamailio sip VoIP vue 中间件 web安全 可信计算技术 安全架构 网络攻击模型 大数据平台 框架搭建 jar WSL win11 无法解析服务器的名称或地址 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 linux 命令 sed 命令 国产操作系统 ukui 麒麟kylinos openeuler 飞牛NAS 飞牛OS MacBook Pro EasyConnect RustDesk自建服务器 rustdesk服务器 docker rustdesk Ubuntu Server Ubuntu 22.04.5 web3.py virtualenv 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 mongodb 华为od OD机试真题 华为OD机试真题 服务器能耗统计 threejs 3D 蓝耘科技 元生代平台工作流 ComfyUI zabbix SenseVoice yum源切换 更换国内yum源 RTMP 应用层 jupyter hadoop Qwen2.5-coder 离线部署 服务器主板 AI芯片 孤岛惊魂4 openwrt 游戏服务器 TrinityCore 魔兽世界 开发环境 SSL证书 代码调试 ipdb adobe Python 网络编程 聊天服务器 套接字 TCP Socket IPMITOOL BMC 硬件管理 opcua opcda KEPServer安装 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap NFS redhat dba pdf 群晖 文件分享 WebDAV iis 多线程服务器 Linux网络编程 NPS 雨云服务器 雨云 密码学 springsecurity6 oauth2 授权服务器 token sas FTP 服务器 源码剖析 rtsp实现步骤 流媒体开发 服务器繁忙 rsyslog list 数据结构 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 远程控制 远程看看 远程协助 visualstudio prometheus 安卓 腾讯云 C语言 驱动开发 硬件工程 嵌入式实习 devops springboot ipython 三级等保 服务器审计日志备份 Docker Hub docker pull 镜像源 daemon.json elasticsearch 串口服务器 IDE AI 原生集成开发环境 Trae AI matlab stm32 qt bootstrap html Kali Linux 黑客 渗透测试 信息收集 nextjs react reactjs mamba Vmamba llm 本地部署 api DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 Google pay Apple pay android studio 交互 QQ bot Docker 压测 ECS ssrf 失效的访问控制 医疗APP开发 app开发 openvpn server openvpn配置教程 centos安装openvpn 并查集 leetcode xrdp 远程桌面 远程连接 thingsboard postgresql 视觉检测 无人机 VMware创建虚拟机 能力提升 面试宝典 技术 IT信息化 kali 共享文件夹 虚拟机 rabbitmq 直播推流 Cline 自动化编程 gitee RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 ros2 moveit 机器人运动 状态管理的 UDP 服务器 Arduino RTOS yum eureka fpga开发 gradle 灵办AI kvm selenium DNS asi_bench C# MQTTS 双向认证 emqx Invalid Host allowedHosts rdp 实验 云电竞 云电脑 todesk 命令 UOS 统信操作系统 maven svn ci/cd KylinV10 麒麟操作系统 Vmware mybatis 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 iBMC UltraISO stm32项目 webrtc wsl2 wsl transformer ping++ 深度优先 图论 并集查找 换根法 树上倍增 自动驾驶 部署 microsoft TRAE zotero 同步失败 gpt 微信分享 Image wxopensdk 压力测试 测试用例 功能测试 服务器配置 next.js 部署next.js Ark-TS语言 ocr playbook 剧本 政务 分布式系统 监控运维 Prometheus Grafana 生物信息学 银河麒麟服务器操作系统 系统激活 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 gpt-3 文心一言 LLM 大模型面经 职场和发展 大模型学习 博客 telnet 远程登录 实战案例 硬件 设备 GPU PCI-Express grafana 腾讯云大模型知识引擎 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm Java p2p 产品经理 NAS Termux Samba 拓扑图 JAVA DeepSeek行业应用 Heroku 网站部署 系统安全 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 SWAT 配置文件 服务管理 网络共享 gaussdb ruoyi IIS服务器 IIS性能 日志监控 YOLOv12 intellij idea asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 micropython esp32 mqtt 远程 执行 sshpass 操作 RAID RAID技术 磁盘 存储 算力 计算机 Radius chrome devtools chromedriver npm wps 搜索引擎 模拟退火算法 docker compose 蓝桥杯 高级IO epoll 社交电子 数据库系统 linux安装配置 rocketmq Cursor rnn 银河麒麟高级服务器 外接硬盘 Kylin 国产化 W5500 OLED u8g2 TCP服务器 SEO 网站搭建 serv00 chfs ubuntu 16.04 etcd 数据安全 RBAC Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 vscode 1.86 seatunnel 直流充电桩 充电桩 hive DBeaver 数据仓库 kerberos sdkman 开机自启动 Redis Desktop 图形渲染 火绒安全 Nuxt.js DevEco Studio 黑苹果 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 目标跟踪 OpenVINO 推理应用 css 备选 网站 调用 示例 链表 CPU 主板 电源 网卡 rclone AList webdav fnOS alias unalias 别名 飞书 uniapp lio-sam SLAM glibc 边缘计算 OpenManus 宝塔 源码 毕业设计 pgpool 软负载 miniapp 真机调试 调试 debug 断点 网络API请求调试方法 HiCar CarLife+ CarPlay QT RK3588 yolov8 端口测试 CLion 实时互动 Node-Red 编程工具 流编程 田俊楠 MS Materials 命令行 基础入门 编程 openssl 业界资讯 鲲鹏 Hive环境搭建 hive3环境 Hive远程模式 prompt code-server 大模型应用 nfs 华为机试 skynet flash-attention 自定义客户端 SAS 私有化 curl wget ip命令 新增网卡 新增IP 启动网卡 统信 虚拟机安装 Jellyfin 云桌面 微软 AD域控 证书服务器 大大通 第三代半导体 碳化硅 回显服务器 UDP的API使用 SSH 密钥生成 SSH 公钥 私钥 生成 armbian u-boot MySql LORA NLP remote-ssh 权限 cnn 邮件APP 免费软件 自动化任务管理 URL ftp web 模拟实现 rustdesk VPS pyqt fd 文件描述符 毕设 tcp ux 多线程 vscode1.86 1.86版本 ssh远程连接 open Euler dde big data 线程 opensearch helm MI300x 代理 WebRTC web3 北亚数据恢复 oracle数据恢复 单一职责原则 版本 gcc deepseek r1 open webui 智能音箱 智能家居 vr x64 SIGSEGV SSE xmm0 Ubuntu 24.04.1 轻量级服务器 MQTT协议 消息服务器 代码 asp.net大文件上传下载 VSCode ios iphone 移动云 minio 云服务 iftop 网络流量监控 游戏程序 XCC Lenovo 指令 崖山数据库 YashanDB mq 繁忙 解决办法 替代网站 汇总推荐 AI推理 make命令 makefile文件 服务器部署ai模型 sqlite3 embedding SSL 域名 Anolis nginx安装 linux插件下载 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 Linux的权限 IM即时通讯 剪切板对通 HTML FORMAT 银河麒麟操作系统 3d GIS 遥感 WebGIS 阿里云ECS 文件系统 路径解析 设置代理 实用教程 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 v10 软件 集成学习 集成测试 ui 无桌面 pyautogui 黑客技术 流式接口 WebUI DeepSeek V3 运维监控 联想开天P90Z装win10 SSH 服务 SSH Server OpenSSH Server Kylin-Server 多个客户端访问 IO多路复用 TCP相关API DenseNet 宕机切换 服务器宕机 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? CrewAI log4j CH340 串口驱动 CH341 uart 485 qemu libvirt AI写作 网工 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 minicom 串口调试工具 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 Deepseek-R1 私有化部署 推理模型 GoogLeNet elk bcompare Beyond Compare Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 SRS 流媒体 直播 dash 正则表达式 远程服务 自动化测试 性能测试 odoo 服务器动作 Server action tidb GLIBC 环境迁移 DocFlow 图像处理 常用命令 文本命令 目录命令 python3.11 信号处理 输入法 IIS .net core Hosting Bundle .NET Framework vs2022 XFS xfs文件系统损坏 I_O error es jvm k8s集群资源管理 云原生开发 EMUI 回退 降级 升级 相差8小时 UTC 时间 centos 7 docker run 数据卷挂载 交互模式 netty 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 远程过程调用 Windows环境 risc-v 监控k8s 监控kubernetes wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 技能大赛 FTP服务器 langchain deep learning Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 gitea Wi-Fi c dity make 交叉编译 软考 显示过滤器 ICMP Wireshark安装 王者荣耀 单元测试 linux环境变量 图形化界面 rime 执法记录仪 智能安全帽 smarteye SysBench 基准测试 ecm bpm edge浏览器 DOIT 四博智联 webstorm 音乐服务器 Navidrome 音流 MCP server C/S GCC aarch64 编译安装 HPC tensorflow windows日志 trae idm crosstool-ng Docker Compose docker-compose Minecraft 多层架构 解耦 nac 802.1 portal H3C Dell HPE 联想 浪潮 iDRAC R720xd 监控k8s集群 集群内prometheus 强制清理 强制删除 mac废纸篓 freebsd docker命令大全 5G 3GPP 卫星通信 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 xml 磁盘监控 ROS 聊天室 分析解读 虚拟局域网 cmos ceph selete FunASR ASR file server http server web server muduo 个人博客 X11 Xming uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 深度求索 私域 知识库 ros Claude eNSP 网络规划 VLAN 企业网络 mariadb 重启 排查 系统重启 日志 原因 MacMini 迷你主机 mini Apple 显卡驱动 宠物 免费学习 宠物领养 宠物平台 计算虚拟化 弹性裸金属 小艺 Pura X 序列化反序列化 匿名管道 阻塞队列 生产者消费者模型 服务器崩坏原因 jetty undertow Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 frp xcode 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 Erlang OTP gen_server 热代码交换 事务语义 MNN Qwen ip 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 openstack Xen ruby 英语 VR手套 数据手套 动捕手套 动捕数据手套 系统开发 binder 车载系统 framework 源码环境 网络结构图 Linux PID 银河麒麟桌面操作系统 Kylin OS linux上传下载 昇腾 npu QT 5.12.12 QT开发环境 Ubuntu18.04 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 迁移指南 LInux docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos USB网络共享 游戏机 av1 电视盒子 机顶盒ROM 魔百盒刷机 hugo Playwright Netty 即时通信 NIO 数学建模 P2P HDLC 思科 HTTP 服务器控制 ESP32 DeepSeek xshell termius iterm2 nuxt3 uv neo4j 数据库开发 database vasp安装 AI作画 程序 性能分析 keepalived vmware 卡死 sonoma 自动更新 思科模拟器 Cisco IO模型 etl qt项目 qt项目实战 qt教程 yaml Ultralytics 可视化 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP c/c++ 串口 服务网格 istio DIFY 物联网开发 根服务器 clickhouse UOS1070e EMQX 通信协议 VS Code 代码托管服务 OpenSSH AD 域管理 游戏引擎 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 jina 语法 perf laravel nlp HarmonyOS 小智AI服务端 xiaozhi TTS OpenHarmony junit TCP协议 需求分析 规格说明书 sequoiaDB IMX317 MIPI H265 VCU composer 捆绑 链接 谷歌浏览器 youtube google gmail 产测工具框架 IMX6ULL 管理框架 Ubuntu共享文件夹 共享目录 Linux共享文件夹 k8s二次开发 集群管理 Linux的基础指令 seleium 内网服务器 内网代理 内网通信 相机 autodl 开发 AD域 反向代理 互信 毕昇JDK Logstash 日志采集 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 prometheus数据采集 prometheus数据模型 prometheus特点 regedit 开机启动 语音识别 Headless Linux 安防软件 考研 wpf CDN ubuntu24.04.1 网络建设与运维 历史版本 下载 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 NLP模型 webgl 自学笔记 小米 澎湃OS Android 本地化部署 端口 查看 ss flink 玩机技巧 软件分享 软件图标 读写锁 AI Agent 字节智能运维 fast bat WSL2 上安装 Ubuntu 存储维护 NetApp存储 EMC存储 TrueLicense vpn IPv4 子网掩码 公网IP 私有IP java-rocketmq 做raid 装系统 harmonyOS面试题 ShenTong 超融合 h.264 企业网络规划 华为eNSP easyui 项目部署到linux服务器 项目部署过程 用户缓冲区 CVE-2024-7347 移动魔百盒 支付 微信支付 开放平台 USB转串口 ArkTs ArkUI PX4 进程优先级 调度队列 进程切换 LLM Web APP Streamlit cpp-httplib Mac内存不够用怎么办 cocoapods 飞牛nas fnos DeepSeek r1 Open WebUI sysctl.conf vm.nr_hugepages IMM Kali 渗透 AI-native Docker Desktop 免费域名 域名解析 eclipse 策略模式 单例模式 视频编解码 spark HistoryServer Spark YARN jobhistory zookeeper saltstack 镜像 李心怡 Ubuntu22.04 开发人员主页 trea idea 办公自动化 自动化生成 pdf教程 僵尸世界大战 游戏服务器搭建 su sudo g++ g++13 影刀 #影刀RPA# docker部署Python arcgis Windows ai工具 ldap less 内网环境 架构与原理 banner 键盘 IDEA 嵌入式系统开发 onlyoffice 网卡的名称修改 eth0 ens33 代理服务器 figma triton 模型分析 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 推荐算法 Unity Dedicated Server Host Client 无头主机 模拟器 教程 cd 目录切换 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR Xinference RAGFlow ubuntu24 vivado24 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 db apt 国内源 虚幻引擎 virtualbox 知识图谱 大模型部署 区块链 信创 信创终端 中科方德 嵌入式Linux IPC midjourney 稳定性 看门狗 css3 Typore sentinel lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 多端开发 智慧分发 应用生态 鸿蒙OS 佛山戴尔服务器维修 佛山三水服务器维修 WLAN swoole rancher 中兴光猫 换光猫 网络桥接 自己换光猫 实习 干货分享 黑客工具 密码爆破 技术共享 我的世界 我的世界联机 数码 我的世界服务器搭建 加解密 Yakit yaklang searxng 元服务 应用上架 PPI String Cytoscape CytoHubba 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 换源 Debian Linux环境 tailscale derp derper 中转 CentOS WebVM 线性代数 电商平台 流水线 脚本式流水线 服务器时间 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 lua firewall cursor 金仓数据库 2025 征文 数据库平替用金仓 抗锯齿 音乐库 飞牛 树莓派 VNC deekseek 域名服务 DHCP 符号链接 配置 聚类 前后端分离 iventoy VmWare OpenEuler 本地知识库部署 DeepSeek R1 模型 信号 强化学习 Python基础 Python教程 Python技巧 软件构建 虚拟显示器 powerpoint 环境配置 Spring Security AnythingLLM AnythingLLM安装 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 显示管理器 lightdm gdm 主从复制 人工智能生成内容 grub 版本升级 扩容 ISO镜像作为本地源 基础环境 游戏开发 can 线程池 大模型推理 程序员创富 cfssl dns是什么 如何设置电脑dns dns应该如何设置 xss 本地部署AI大模型 双系统 GRUB引导 Linux技巧 7z llama.cpp minecraft pppoe radius 虚拟现实 ssh远程登录 浏览器开发 AI浏览器 查询数据库服务IP地址 SQL Server ssh漏洞 ssh9.9p2 CVE-2025-23419 分布式训练 AutoDL react native AI agent 状态模式 CentOS Stream SVN Server tortoise svn deployment daemonset statefulset cronjob React Next.js 开源框架 HAProxy 合成模型 扩散模型 图像生成 鸿蒙开发 移动开发 hexo yolov5 iperf3 带宽测试 国产数据库 瀚高数据库 数据迁移 下载安装 visual studio 端口聚合 windows11 milvus ranger MySQL8.0 System V共享内存 进程通信 磁盘清理 软件卸载 系统清理 在线office docker desktop image Linux权限 权限命令 特殊权限 wsgiref Web 服务器网关接口 ABAP MAC SecureCRT UEFI Legacy MBR GPT U盘安装操作系统 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 ardunio BLE 离线部署dify word MacOS rpa 软链接 硬链接 Linux find grep 钉钉 抓包工具 粘包问题 kernel 热榜 perl MAVROS 四旋翼无人机 nftables 防火墙 navicat MDK 嵌入式开发工具 论文笔记 sublime text vnc Attention zip unzip 云耀服务器 网络爬虫 Web服务器 多线程下载工具 PYTHON NAT转发 NAT Server 通信工程 毕业 电视剧收视率分析与可视化平台 极限编程 安装MySQL 问题解决 Reactor反应堆 kotlin xpath定位元素 Sealos 论文阅读 gnu 健康医疗 查看显卡进程 fuser 智能电视 ArtTS 烟花代码 烟花 元旦 nvm whistle UDP 网络搭建 神州数码 神州数码云平台 云平台 copilot 带外管理 流量运营 ip协议 欧标 OCPP mcp服务器 client close AI员工 ubuntu20.04 开机黑屏 MVS 海康威视相机 IO ubuntu 18.04 Unity插件 hosts 性能调优 安全代理 风扇控制软件 dock 加速 proxy模式 浏览器自动化 Qwen2.5-VL vllm 沙盒 nosql 计算生物学 生物信息 基因组 HarmonyOS NEXT 原生鸿蒙 容器技术 多路转接 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 fstab vu大文件秒传跨域报错cors win服务器架设 windows server 互联网医院 ros1 Noetic 20.04 apt 安装 top Linux top top命令详解 top命令重点 top常用参数 对比 工具 meld DiffMerge 项目部署 js 隐藏文件 隐藏目录 管理器 通配符 powerbi 达梦 DM8 话题通信 服务通信 Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 接口优化 WebServer 西门子PLC 通讯 解决方案 视频平台 录像 视频转发 视频流 CosyVoice yum换源 Linux 维护模式 conda配置 conda镜像源 java-rabbitmq 数字证书 签署证书 搭建个人相关服务器 本地环回 bind macOS 服务器正确解析请求体 大模型技术 本地部署大模型 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 宝塔面板无法访问 lb 协议 搜狗输入法 中文输入法 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 MobaXterm 机柜 1U 2U