当前位置: 首页 > news >正文

学习记录——day23 多进程编程

目录

一、多进程引入

1.1、引入目的

1.2、进程的概念

1.3、进程的种类

1.4、进程号的概念        

1.5、特殊进程 0号 1号 2号 孤儿 僵尸

1.6、进程的相关命令

        1)查看进程信息的命令:ps             跟不同的选项,执行不同的状态

        2)top/htop       

         3)ptree:展示进程树,可以显示进程的父子关系

        4)查看给定进程的进程号:pidof 进程名

        5)kill:向进程发送信号

1.7、进程的状态

二、 多进程编程

2.1fork进程的创建函数

2.2 进程号的获取   getpid  getppid

2.3进程的退出    exit   _exit

2.4 进程资源的回收        wait  waitpid

作业


一、多进程引入

1.1、引入目的

        程序员写程序时,一个程序可能由多个认为组成,如果使用的时单线程,或单任务,那么当该任务执行阻塞时,其他任务就无法执行,必须等到该任务接触阻塞后,才能执行其他任务。

        多线程或多进程。可以解决同一个程序中多个任务并发执行的情况。

1.2、进程的概念

        1)进程时程序的一次执行过程;

        2)进程是程序资源分配的基本单位,系统会给每个进程分配4G的虚拟内存,分为0--3G的用                户空间和3-4G的内核空间,多个进程共享内核空间,用户空间相互独立

        3)进程是一个动态的过程,有生命周期的概念,分为创建态、就绪态、运行态、阻塞态、死                亡态

        4)进程在内核空间中存储在一个名为task struct的结构体中(PCB)

进程描述符:task_struct包含了描述一个进程所需的所有信息。
进程状态:包括运行、就绪、阻塞等状态。
进程标识符:如进程ID(PID)。
进程调度信息:如优先级、调度策略等。
内存管理信息:如虚拟地址空间、页表等。
文件系统信息:如打开的文件、文件系统根目录等。
信号处理:包括待处理信号和信号处理函数。
进程间通信:如消息队列、共享内存等IPC机制相关信息。
时间和定时器:如进程创建时间、CPU使用时间等。
线程信息:在Linux中,线程被视为轻量级进程,也用task_struct表示。

         5)单核cpu处理多任务是,一般使用的是时间片轮询机制

         6)进程宇程序的区别:

                程序时静态的,是存储在磁盘上的二进制代码

                进程是动态的,有生命周期的

        7)进程的组成:进程控制块(PCB)、数据段、程序段

1.3、进程的种类

        进程分为三大类:交互进程、批处理进程、守护进程

        1)交互进程:他是由shell控制,用于直接跟用户进行交互的进程。例如:vim编辑器、文本编辑器

        2)批处理进程:本质上维护了一个队列,被放入队列中的进程会统一被调度。例如gcc编译器的一步到位的编译

        3)守护进程:脱了了终端而存在的进程,随着系统的启动而开始,随着系统的结束而终止。例如:服务进程

1.4、进程号的概念        

        每个进程在系统中都有一个唯一的标识位,用一个整数表示这就是该进程的进程号(PID)

        1、PID(processID):当前进程的进程号

        2、PPID(parent processID):当前进程的父进程的进程号

        3、每个进程都是由其父进程进行拷贝赋值出来的

        4、/proc目录中的每个数字都是现在正在执行的一个进程

1.5、特殊进程 0号 1号 2号 孤儿 僵尸

        1、0号进程:也称其为 idel进程,他是操作系统启动后执行的第一个进程,这个进程也叫空闲进程,当没有其他进程执行时会默认执行该进程。1号进程和2号进程都是由0号进程创建出来的

        2、1号进程:也称init进程,该进程由0号进程产生,主要完成系统创建时一些软件硬件的初始化工作。当其他进程的父进程死亡后,会托管其子进程

        3、2号进程:也称kthreadd,该进程由0号进程产生,也称为调度进程,当某个就绪进程时间片轮到时,该进程负责进程的调度工

        4、孤儿进程:当前进程的父进程死亡后,但是当前进程还没有结束,那么当前进程称为孤儿进程,孤儿进程会由1号进程收养

        5、僵尸进程:当前进程已经死亡,但是其父进程没有为其收尸(回收其进程的资源),那么该进程为僵尸进程

1.6、进程的相关命令

        1)查看进程信息的命令:ps             跟不同的选项,执行不同的状态

                        ps -ef :显示进程之间的关系

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 七月25 ?     00:00:20 /sbin/init splash
root          2      0  0 七月25 ?     00:00:00 [kthreadd]
root          3      2  0 七月25 ?     00:00:00 [rcu_gp]
root          4      2  0 七月25 ?     00:00:00 [rcu_par_gp]
root          6      2  0 七月25 ?     00:00:00 [kworker/0:0H-kb]
root          9      2  0 七月25 ?     00:00:00 [mm_percpu_wq]
root         10      2  0 七月25 ?     00:00:06 [ksoftirqd/0]
root         11      2  0 七月25 ?     00:01:11 [rcu_sched]
UID:用户ID
PID:当前进程的id号
PPID:当前进程的父进程PID号
C:不用管
STIME、TIME:创建时间
TTY:如果该值为问号,说明不依赖于终端而存在的进程
CMD:进程名称

                 ps -ajx:可显示进程的状态

  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     0      1            1        1      ?            -1 Ss      0   0:20 /sbin/init splash
     0      2            0        0      ?            -1 S        0   0:00 [kthreadd]
     2      3            0        0      ?            -1 I<       0   0:00 [rcu_gp]
     2      4            0        0      ?            -1 I<       0   0:00 [rcu_par_gp]
     2      6            0        0      ?            -1 I<       0   0:00 [kworker/0:0H-kb]

PPID:当前进程的父进程PID号

PID:当前进程的id号

PGID:组id号
SID:会话组id
STAT:当前进程的状态

         ps -aux:可以查看资源使用情况

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 160076  4676 ?        Ss   七月25   0:20 /sbin/init splash
root          2  0.0  0.0      0     0 ?        S    七月25   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        I<   七月25   0:00 [rcu_gp]
root          4  0.0  0.0      0     0 ?        I<   七月25   0:00 [rcu_par_gp]
root          6  0.0  0.0      0     0 ?        I<   七月25   0:00 [kworker/0:0H-kb]
%CPU:cpu的占用率
%MEM :内存的占用率

        2)top/htop       

        top:动态显示资源使用情况

top - 11:51:17 up 5 days, 13:55,  1 user,  load average: 0.01, 0.02, 0.00
任务: 327 total,   3 running, 260 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.5 us,  1.8 sy,  0.0 ni, 94.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2005964 total,    67820 free,  1168168 used,   769976 buff/cache
KiB Swap:   969960 total,    88160 free,   881800 used.   654624 avail Mem 

进程 USER      PR  NI    VIRT    RES    SHR � %CPU %MEM     TIME+ COMMAND                                                          
  1872 ubuntu    20   0  640144  59872   5056 S  4.0  3.0  12:54.43 Xorg                                                             
  2057 ubuntu    20   0 3057424 149072  31884 S  3.0  7.4  27:58.69 gnome-shell                                                      
 89961 ubuntu    20   0  949248  69268  23020 S  2.7  3.5   3:17.13 terminator                                                       
  2193 ubuntu    20   0  809364   5568   2120 S  0.3  0.3   2:22.89 gsd-color                                                        
111256 ubuntu    20   0   51380   4456   3616 R  0.3  0.2   0:00.21 top                                                              
     1 root      20   0  160076   4676   2652 S  0.0  0.2   0:20.90 systemd                                                          
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd     

        htop:动态显示资源使用情况(彩色)

         3)ptree:展示进程树,可以显示进程的父子关系

        4)查看给定进程的进程号:pidof 进程名

        5)kill:向进程发送信号

                        格式: kill -信号名(号)     进程号

                        能够发送的信号号有:可以通过指令 kil -查看

 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

共计62个

前32个属于稳定信号

SIGHUP
        当进程所在的终端关闭时,该终端会向运行在该终端上的所有进程发送该信号,让其结束进程

SIGINT

        当终端键入 ctrl+c时,终端向指定进程发送的就是该信号,表示中断进程

SIGOUIT

        当终端键入 ctrl + \时,表示终端要终止进程的结束

SIGILL

        当进程自己发生非法操作时,内核空间会发送该信号

SIGKILL

        杀死进程

SIGUSR1、SIGUSR2

        没有特殊的含义,留给程序员使用

SIGSEGV

        表示指针访问越界时的段错误

SIGPIPE

        当操作管道文件时,如果管道的读端被关闭,写端继续写的话,就会出现管道破裂

SIGALRM

        当启动一个定时器,并且定时器超时时,会发送该信号

SIGHCHLD

        当一个进程的子进程退出时,会向该进程的父进程发送该信号,表示让其为子进程收尸

SIGCONT

        该信号表示让暂停的进程继续执行

SIGSTOPSIGSTP

        表示让一个进程暂停,当用户从键盘上键入 ctrl +z时,就会发送该信号

1.7、进程的状态

        1)主要状态有五个:创建态、就绪态、运行态、阻塞态、死亡态

        2)程序中的进程状态显示:可以通过man ps查看

主状态:
               D    不可中断的休眠态 (usually IO)
               R    运行态 (on run queue)
               S    可中断的休眠态 (waiting for an event to complete)
               T    暂停态,会给出作业号进行控制
               t    程序调试时的暂停态
               W    已经弃用
               X    死亡态 (should never be seen)
               Z    僵尸态
附加态:                              
               <    高优先级的进程 (not nice to other users)
               N    低优先级的进程 (nice to other users)
               L    锁到内存中的进程 (for real-time and custom IO)
               s    会话组组长,默认为当前终端
               l    包含多线程的进程 (using CLONE_THREAD, like NPTL pthreads do)
               +    表示是前台运行的进程
 

二、 多进程编程

2.1fork进程的创建函数

1)在进程的创建过程,其实就是通过拷贝父进程的lask stucl结构体而来的,子进程中保存了大部分的父进程的遗传基因(内容一致),只需要修改少部分的内容,如子进程的进程号,子进程的父进程号

2)子进程和父进程的资源用户空间是完全独立的,创建出子进程后,父子进程的资源相互独立,互不影响

3)进程的创建,通过fork函数完成

4)当子进程创建后,会跟父进程一起执行fork后面的语句

       #include <sys/types.h>
       #include <unistd.h>

       pid_t fork(void);
    功能:拷贝父进程得到子进程
    参数:无
    返回值:成功时,父进程中返回子进程的pid号,子进程中返回0,失败返回-1并置位错误                    码

例1   不使用返回值

 创建出的子进程跟父进程没有先后执行的顺序,遵循时间片轮询机制

例2   使用返回值

#include <myhead.h>
int main(int argc, char const *argv[])
{pid_t pid = -1;  //定义变量存储 pid 号pid = fork();   //获取pidif (pid > 0){while (1){printf("父进程\n");sleep(1);}}else if (pid == 0){while (1){printf("子进程\n");sleep(1);}}sleep(1);return 0;
}

2.2 进程号的获取   getpid  getppid

       #include <sys/types.h>
       #include <unistd.h>

       pid_t getpid(void);
       功能:获取当前进程的进程号
       参数:无
       返回值:当前进程的pid
       pid_t getppid(void);
       功能:获取当前进程的父进程的pid号
       参数:无
       返回值:当前进程父进程的pid
 

2.3进程的退出    exit   _exit

       #include <sys/types.h>
       #include <unistd.h>

       pid_t getpid(void);
       功能:获取当前进程的进程号
       参数:无
       返回值:当前进程的pid
       pid_t getppid(void);
       功能:获取当前进程的父进程的pid号
       参数:无
       返回值:当前进程父进程的pid

2.4 进程资源的回收        wait  waitpid

       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *wstatus);
       功能:阻塞回收子进程的资源,如果没有进程退出,那么就阻塞等待
       参数:子进程退出时的状态,一般不接收,直接填NULL即可
       返回值:成功返回回收的子进程的pid,失败返回-1并置位错误码
       

       pid_t waitpid(pid_t pid, int *wstatus, int options);
       功能:既可以阻塞也可以非阻塞形式回收僵尸进程
       参数1:要回收的进程号
               >0:表示回收具体的某个进程
               =0:能够回收当前进程所在的进程组中的任意一个子进程
               =-1:回收任意一个子进程
               <-1: 回收别的进程组(进程组id为给定的pid的绝对值)中的任意一个子进程
        参数2:子进程退出时的状态,一般不接收,直接填NULL即可
        参数3:表示是否阻塞回收僵尸进程
                0:表示阻塞
                WNOHANG:表示非阻塞
        返回值:

                >0:如果成功回收了子进程资源,那么会返回该子进程的pid

                =0:表示以非阻塞的形式回收资源,但是没有回收到子进程

                =-1:失败返回-1并置位错误码

#include<myhead.h>int main(int argc, const char *argv[])
{//定义进程号pid_t pid = fork();     //创建一个子进程//判断父子进程if(pid > 0){printf("我是父进程:pid = %d, 当前进程的id为:%d,当前进程的父进程的id为:%d\n",\pid, getpid(), getppid());}else if(pid == 0){printf("我是子进程:pid = %d,当前进程的pid为:%d, 当前进程的父进程pid为:%d\n",\pid, getpid(), getppid());sleep(3);          //休眠3秒//退出子进程//exit(EXIT_SUCCESS);         //exit(0);_exit(EXIT_SUCCESS);         //exit(0);}else{perror("fork error");return -1;}//回收子进程资源//wait(NULL);//waitpid(-1, NULL, 0);       //阻塞回收sleep(5);waitpid(-1, NULL, WNOHANG);       //非阻塞回收printf("回收子进程资源结束\n");while(1);return 0;
}

作业

#include <myhead.h>#define N 128
char buf[N] = {0};int main(int argc, char const *argv[])
{pid_t pid;int len,size, o_file, n_file;if (argc != 3){printf("终端输入数不正确\n");return -1;}umask(0000);  //置位掩码if ((o_file = open(argv[1], O_RDONLY)) == -1){perror("open");exit(-1);}n_file = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664);if (n_file == -1){perror("open");exit(-1);}size = lseek(o_file, 0, SEEK_END);  //得到源文件大小if (size < 0){perror("lseek");exit(-1);}size /= 2;   //取一半的大小close(o_file);close(n_file);pid = fork();  //子程序创建if (pid < 0){perror("fork");exit(-1);}else if (0 == pid)  //子程序执行{o_file = open(argv[1], O_RDONLY);if (o_file < 0){perror("c open1");exit(-1);}n_file = open(argv[2], O_WRONLY);if (n_file < 0){perror("c open2");exit(-1);}lseek(o_file, size, SEEK_SET);  //光标定位到一半的位置lseek(n_file, size, SEEK_SET);//拷贝后一半while ((len = read(o_file, buf, N)) > 0){write(n_file, buf, len);}close(o_file);close(n_file);}else  //父程序执行{o_file = open(argv[1], O_RDONLY);if (o_file < 0){perror("f open1");exit(-1);}n_file = open(argv[2], O_WRONLY);if (n_file < 0){perror("f open2");exit(-1);}//拷贝前一半while (size > 0){if (size > N){write(n_file, buf, read(o_file, buf, N));size -= N;}else{write(n_file, buf, read(o_file, buf, size));break;}}close(o_file);close(n_file);}return 0;
}

相关文章:

学习记录——day23 多进程编程

目录 一、多进程引入 1.1、引入目的 1.2、进程的概念 1.3、进程的种类 1.4、进程号的概念 1.5、特殊进程 0号 1号 2号 孤儿 僵尸 1.6、进程的相关命令 1&#xff09;查看进程信息的命令&#xff1a;ps 跟不同的选项&#xff0c;执行不同的状态 2&am…...

英特尔股市暴跌,财报亏损 | HuggingFace 实现盈利 |iOS18 Beta 苹果AI

写在前面 了解一下最近科技圈发生的一些事情 英特尔 硬件巨头英特尔宣布裁掉1.5w个岗位&#xff0c;约占英特尔员工的12%&#xff0c;非常的夸张。本次裁员可能是由于前段时间英特尔的i7&#xff0c;i9的13/14代处理器的暴雷&#xff0c;导致英特尔Q2的财报低迷。 今年以来…...

C++入门基础(二)

6. 引用&#xff08;引用就是取别名&#xff09; 6.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。比如&#xff1a;水浒传中李逵&…...

fabricjs 实现图像的二值化功能

一、效果图 二、图像二值化的作用 二值化是图像处理中常用的一种方法&#xff0c;其作用是将灰度图像转换为二值图像&#xff0c;即将图像中的像素点根据其灰度值分成两类&#xff1a;黑色和白色。这种处理方法可以帮助我们更清晰地识别图像中的目标&#xff0c;简化图像的复杂…...

修改本地hosts文件及外部访问机器本地hosts文件后,rancher UI网站仍然不能访问

原因排查 kubectl get svc # 输出&#xff1a; NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d17hkubectl get svc -A # 输出&#xff1a; NAMESPACE …...

西北潮榆林范儿,新榆林首个360°沉浸式剧场发布会闪耀亮相

这是一场城市更迭的未来大赏&#xff0c;也是一场商业蝶变的复合对话 8月3日&#xff0c;朗阁集团商业品牌发布会在榆林银杏熙悦酒店隆重启幕。朗阁集团董事长杨志成携众多集团领导出席&#xff1b;多家主流媒体代表联袂参加&#xff1b;喜茶、中影时光国际影城、汉堡王、鲍师傅…...

如何创建响应式移动端网页设计?最佳实践详解

移动端网页设计是一个耗时而复杂的过程开发&#xff0c;包括UI设计、UX设计、检测、发布、改进、维护和持续的错误修复。通过学习这篇文章&#xff0c;你将掌握什么是移动端网页&#xff0c;如何制作移动端网页&#xff0c;以及设计网页的技巧。 什么是移动端网页&#xff1f;…...

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取&#xff08;Web Scraping&#xff09;是一种从网站提取数据的技术。Python有许多用于Web抓取的库&#xff0c;其中最常用的是BeautifulSoup和Scrapy。 BeautifulSoup BeautifulSoup是一个用于解析HTML和XML文档的Python库&#xff0c;适合处理简单的Web抓取任务。它将…...

白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理

系列目录 上一篇&#xff1a;白骑士的PyCharm教学进阶篇 2.4 Django开发支持 在Web开发中&#xff0c;数据库是必不可少的部分。PyCharm不仅是一款功能强大的IDE&#xff0c;还提供了丰富的数据库连接和管理工具&#xff0c;使开发者可以更方便地浏览和操作数据库。本篇将详细…...

(五)activiti-modeler 编辑器初步优化

最终效果&#xff1a; 1..首先去掉顶部的logo&#xff0c;没什么用&#xff0c;还占用空间。 修改modeler.html文件&#xff0c;添加样式&#xff1a; <style type"text/css"> #main-header{display: none; } #main{padding: 0px; } </style> 2.左边组…...

(学习总结12)C++类和对象3

C类和对象3 一、初始化列表二、类型转换三、static成员四、友元五、内部类六、匿名对象 以下代码环境在 VS2022。 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有⼀种方式&#xff0c;就是初始化列表&a…...

docxtpl,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - docxtpl。 项目地址&#xff1a;https://docxtpl.readthedocs.io/en/latest/ 在日常工作中&#xff0c;自动生成和处理 Word 文档是一个常见需求。doc…...

捷途山海T2:超长续航,节能环保的驾驶新星

在当今的汽车市场中&#xff0c;消费者的购车选择日趋多样化&#xff0c;不再仅限于传统的燃油车。随着环保理念的深入人心以及人们对用车成本的日益关注&#xff0c;像捷途山海T2这样配备高效混动系统的车型逐渐受到大众的青睐。 捷途山海T2&#xff0c;以其杰出的节能性、强劲…...

[Day 45] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的可擴展性挑戰 概述 區塊鏈技術在過去幾年中取得了顯著的進展&#xff0c;其去中心化、透明和安全的特性使其在金融、供應鏈管理、醫療等領域得到了廣泛應用。然而&#xff0c;區塊鏈技術的一個重大挑戰是其可擴展性。可擴展性是指系統能夠有效處理日益增長的數據和用…...

白骑士的PyCharm教学实战项目篇 4.3 自动化测试与持续集成

系列目录 上一篇&#xff1a; 在现代软件开发过程中&#xff0c;自动化测试与持续集成&#xff08;CI&#xff09;是确保代码质量和快速交付的关键环节。PyCharm作为一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为自动化测试和持续集成提供了全面的支持。本…...

权限模块开发+权限与角色关联(完整CRUD)

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.easycode生成代码1.配置2.AuthPermissionDao.java剪切到mapp…...

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…...

单细胞数据怎么表现genes mRNA表达的热图?

愿武艺晴小朋友一定得每天都开心 #热图 library("ComplexHeatmap") exp <- AverageExpression(subset(fasting_memory, Celltype %in% c("Pre-B")), layer = "data", #即CPM值 features …...

Java聚合快递对接云洋系统小程序源码

&#x1f680;【物流新纪元】聚合快递如何无缝对接云洋系统&#xff0c;效率飙升秘籍大公开&#xff01;✨ &#x1f50d; 开篇揭秘&#xff1a;聚合快递的魅力所在 Hey小伙伴们&#xff0c;你是否还在为多家快递公司账号管理繁琐、订单处理效率低下而头疼&#xff1f;&#…...

MySQL——数据表的基本操作(三)修改数据表

有时候&#xff0c;希望对表中的某些信息进行修改&#xff0c;这时就需要修改数据表。所谓修改数据表指的是修改数据库中已经存在的数据表结构&#xff0c;比如&#xff0c;修改表名、修改字段名、修改字段的数据类型等。在 MySQL中&#xff0c;修改数据表的操作都是使用 ALTER…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...