Linux:进程(三)——进程状态

news2024/9/22 20:32:02

目录

Linux源代码对进程的描述

R

S

D

T

t

X

Z(进程僵尸)

孤儿进程


Linux源代码对进程的描述

        理论上把进程状态大致被分为了:运行、阻塞、挂起。那么,在操作系统中具体是如何描述状态的。(有时候Linux内核也把进程称为任务)

        Linux内核的源代码定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R

        R(running),运行状态,并不意味着进程一定正在被CPU执行,只要进程在运行队列中,都显示为运行状态。(对应理论中的运行状态)

S

        S(sleeping),睡眠状态,意味着进程正在等待硬件或者软件资源,用S表示的睡眠状态是可中断睡眠,也称为浅度睡眠。(对应理论中的阻塞状态)

        在目录24919下面编辑文件myprocess.c的内容如下。

[euto@VM-4-13-centos 24919]$ cat myprocess.c 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main()
{ 
  while(1)
  {
    printf("I am a process\n");
    sleep(1);
  }
  return 0;
}

        程序运行起来后,不要中断运行。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
·······

        在新的窗口打印进程信息。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4223  7525  7525  4223 pts/2     7525 S+    1001   0:00 ./myprocess
 7157  7564  7563  7157 pts/3     7563 R+    1001   0:00 grep --color=auto myprocess

        其中STAT这一列用来表示运行状态。

  • 程序myprocess正在被执行,打印的进程状态应该是R,为什么是S?

        其实这和程序的功能有关,我所写的这个源文件只有一行printf,当程序运行起来后,执行printf这一行代码的速度是非常非常快的,而这一行代码的执行结果是要把字符串输出到显示器,显示器属于硬件资源,其实这个程序的99%的时间都用来将字符串输出到显示器,这个进程大部分时间都是在阻塞队列中排队,因此,进程状态是S。如果有幸在打印的瞬间,进程正在运行队列中排队,那么打印的结果就会是R。

        实际上大部分进程都会和外设产生关联,因此大部分进程都处在S状态,而非R状态。

  • 为什么grep的进程状态是R?

        grep用来全局搜索,那么,只有当grep处于运行状态R时,才能做正在搜索的动作。

  • S+中的'+'是什么意思?

        我们在命令行中运行程序后,所启动的程序可以称为前台程序,前台程序启动后,在命令行执行其他指令是没有响应的,使用Ctrl + C可以中断运行,如果是前台程序,则进程状态都会有'+'的字样。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
I am a process
I am a process
pwdI am a process//运行pwd是没有响应的

I am a process
I am a process
I am a process
cdI am a process//运行cd是没有响应的
 .I am a process
^HcI am a process
^H^HI am a process
cd ..I am a process

I am a process
^C//Ctrl+C是可以中断执行流的

        如果执行下面这条指令来运行可执行程序,则启动的程序称为后台程序,后台程序运行的时候,如果在命令行中执行其他指令,是可以被响应的。但是执行Ctrl + C不能中断运行后台程序。后台进程的进程状态不带'+'字样。

[euto@VM-4-13-centos 24919]$ ./myprocess &
[1] 7297
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
pwd//pwd被响应
/home/euto/linux/24919
[euto@VM-4-13-centos 24919]$ I am a process
lsI am a process

Makefile  myprocess  myprocess.c
[euto@VM-4-13-centos 24919]$ llI am a process
//ll被响应
total 20
-rw-rw-r-- 1 euto euto   82 Sep 19 17:56 Makefile
-rwxrwxr-x 1 euto euto 8416 Sep 19 19:47 myprocess
-rw-rw-r-- 1 euto euto  173 Sep 19 19:46 myprocess.c
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
^C//Ctrl + C不能中断运行
[euto@VM-4-13-centos 24919]$ I am a process
I am a process

       进程状态不带'+'字样。

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606   824   824 31606 pts/1    31606 S     1001   0:00 ./myprocess
  476   861   860   476 pts/2      860 S+    1001   0:00 grep --color=auto myprocess

        如果要中断运行,则执行kill指令杀掉进程。

[euto@VM-4-13-centos 24919]$ kill -l
 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	

        信号9的功能是杀掉进程,后面跟上进程的PID。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
13708  7297  7297 13708 pts/2    13708 S     1001   0:00 ./myprocess
13887  7493  7492 13887 pts/3     7492 S+    1001   0:00 grep --color=auto myprocess
[euto@VM-4-13-centos 24919]$ kill -9 7297//杀掉进程
·········
I am a process

[1]+  Killed                  ./myprocess

D

        D(disk sleeping),磁盘睡眠状态,只不过这种睡眠状态是不可中断睡眠,也称为深度睡眠。(D状态也对应理论中的阻塞状态)。

        一般,如果一个进程在等待磁盘的资源,那么这个进程的状态大概率会被设置为D。在内存资源紧张的时候,这个时候操作系统要选择释放掉部分进程,而状态为D的进程,操作系统会保留。

        一般如果出现D状态的进程,说明操作系统访问磁盘的速度已经非常慢了,系统离奔溃也不远了。

T

        T(stopped),暂停状态,如果一个进程想要获取某种硬件或者软件资源,但是当前资源并不能让进程获取到(比如不允许进程访问显示器资源),而操作系统也不想杀掉这个进程,为了防止这个进程有非法操作,故将这个进程状态设置为T。(T也对应理论中的阻塞状态)

        通过kill命令发送19号信号,可以让进程处于暂停的状态,同时也变成了后台进程。可以发送18号信号让进程继续运行。

18) SIGCONT	19) SIGSTOP
[euto@VM-4-13-centos 24921]$ kill -19 12235
[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 12235 12235 31606 pts/1    31606 T     1001   0:00 ./myprocess
  476 12402 12401   476 pts/2    12401 S+    1001   0:00 grep --color=auto myprocess

t

        t(tracing stop),被追踪的暂停状态。一般在调试程序中,程序在断点处暂停的时候,就是被gdb程序追踪的暂停状态。(t也对应理论中的阻塞状态)

        启动调试程序后,在第10行打一个断点。

(gdb) l 0
1	#include <stdio.h>
2	#include <unistd.h>
3	#include <sys/types.h>
4	#include <stdlib.h>
5	
6	int main()
7	{ 
8	  while(1)
9	  {
10	   printf("I am a process\n");
(gdb) b 10
Breakpoint 1 at 0x400581: file myprocess.c, line 10.
(gdb) r
Starting program: /home/euto/linux/24921/myprocess 

Breakpoint 1, main () at myprocess.c:10
10	   printf("I am a process\n");
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
(gdb) 
······

        此时查看进程状态就是t状态


 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 25839 25839 31606 pts/1    25839 S+    1001   0:00 gdb myprocess
25839 25940 25940 31606 pts/1    25839 t     1001   0:00 /home/euto/linux/24921/myprocess
  476 26437 26436   476 pts/2    26436 S+    1001   0:00 grep --color=auto myprocess

X

        X(dead),X就是理论中的终止状态、进程死亡后的状态,X一般是瞬时状态,没法打印出来。(对应理论中的死亡或者终止状态)。

Z(进程僵尸)

        Z(zombie),僵尸状态

        当一个进程准备死亡之前,(进程 = PCB+可执行程序)操作系统会把代码和数据释放掉,但是PCB会保留一段时间,在这段时间内,进程就是处于Z状态

        注意,处于Z状态的时候,进程已经退出了,只是PCB被保留一段时间。

        进程消亡的时候,都要先后经过Z、X两种状态

  • 那么,为什么操作系统要把一个消亡进程的PCB保留一段时间?

        进程都有父进程,子进程都是由父进程创建出来的。父进程创建子进程的目的必然是为了完成某一个任务,达到某种需求,那么,当这个进程快要消亡的时候,这个进程所肩负的任务是否完成,以及具体详情是怎么样的,都要由父进程调用子进程的PCB才能得知,故保留子进程的PCB一段时间来让父进程获取信息。

  • 如果父进程没有调用消亡子进程的PCB会怎样?

        操作系统会把这个PCB一直保留,这也算作内存泄露!!!


        编辑源文件的内容如下。

int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    int cnt = 5;
    while(cnt)
    {
      printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
      --cnt;
    }
    exit(0);
  }
  //父进程
  while(1)
  {
    printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());
    sleep(1);
  }
  return 0;
}

        这个程序在运行五秒后,子进程退出,由于父进程没有读取PCB,故子进程会处于僵尸状态。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
······
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>
······

        让父进程获取子进程的PCB信息后,那么子进程的僵尸状态就会消失,变成X状态,只是X状态是瞬时状态,显示器速度太慢,我们打印不出来。

        编辑源文件内容如下,子进程变成僵尸后,要让父进程作等待操作wait。

man 2 wait
WAIT(2)                         Linux Programmer's Manual                        WAIT(2)

NAME
       wait, waitpid, waitid - wait for process to change state

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

       pid_t wait(int *status);

       pid_t waitpid(pid_t pid, int *status, int options);

       int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
·······

        父子进程一起运行5s后。子进程变僵尸状态,父进程继续运行5s。然后父进程等待,僵尸状态消失。父进程再运行5s后,程序结束运行。 

int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    int cnt = 5;
    while(cnt)
    {
      printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
      --cnt;
    }
    exit(0);
  }
  //父进程
  int cnt = 10;
  while(cnt)
  {
    printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());
    sleep(1);
    --cnt;
  }

  wait(NULL);
  printf("father get child\n");
  sleep(5);
  return 0;
}

        运行结果符合预期。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>
······
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······

孤儿进程

        如果父子进程中,父进程先退出,子进程会发生什么变化。

        编辑源文件内容如下,让子进程运行50秒,让父进程运行5s,则父进程会先退出。

int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    int cnt = 50;
    while(cnt)
    {
      printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
      --cnt;
    }
    exit(0);
  }
  //父进程
  int cnt = 5;
  while(cnt)
  {
    printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());
    sleep(1);
    --cnt;
  }

        运行结果如下。

[euto@VM-4-13-centos 24921]$ ./myprocess 
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am child,pid:31425,ppid:31424
[euto@VM-4-13-centos 24921]$ I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
······

        运行五秒后,父进程退出,子进程变成孤儿进程,同时变成后台进程。此外,子进程被PID为1的进程“领养”

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 31424 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocess
31424 31425 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocess
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocess

        PID为1的进程就是操作系统自己

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep 1 | grep -v grep

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     1     1     1 ?           -1 Ss       0  33:30 /usr/lib
/systemd/systemd --switched-root --system --deserialize 22

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的高校门禁管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

长亭WAF绕过测试

本文的Bypass WAF 的核心思想在于&#xff0c;一些 WAF 产品处于降低误报考虑&#xff0c;对用户上传文件的内 容不做匹配&#xff0c;直接放行 0、环境 环境&#xff1a;两台服务器&#xff0c;一台配置宝塔面板&#xff0c;一台配置长亭雷池WAF 思路主要围绕&#xff1a;m…

Python | Leetcode Python题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…

20240922 每日AI必读资讯

OpenAI 首席科学家 MIT演讲&#xff01; - 揭示 o1模型训练核心秘密&#xff1a; 通过激励模型学习是培养 AGI 系统通用技能的最佳方式。 - 提出了类比“教人钓鱼”的方式&#xff0c;强调激励学习的重要性&#xff1a;“授人以鱼&#xff0c;不如授人以渔”&#xff0c;但是…

机器视觉OpenCV

1. 环境配置 1.1 安装Python https://www.python.org/downloads/windows/ python-3.9.13-amd64 pip下载加速&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com1.2 安装Ope…

串口RS232,485

RS232和RS485都是串口通信的变种 TTL 串口的波特率/频率&#xff1a;9600&#xff0c;115200等&#xff0c;表示在1s内&#xff0c;串口可以传输9600个高低电平 那串口通信时&#xff0c;高低电压的范围&#xff1a;TTL电平 TTL 的电平标准&#xff0c;理想状态下&#xff0…

通信工程学习:什么是NFV网络功能虚拟化

NFV&#xff1a;网络功能虚拟化 NFV&#xff08;Network Function Virtualization&#xff09;&#xff0c;即网络功能虚拟化&#xff0c;是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构&#xff0c;将传统的网络硬件设备如路由器、交换机、防火墙、负载…

SOMEIP_ETS_123: SD_Length_of_Entry_Array_longer_than_message_allows

测试目的&#xff1a; 验证DUT能够拒绝一个条目数组长度超出消息总长度的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个条目数组长度超出消息总长度的SubscribeEventgroup…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653&#xff1a;两数之和IV - 输入二叉搜索树 1.1 题目&#xff1a; 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 true。 示例 1&#xff1a; 输入: root [5,3,6,2,4,null,7…

【Python从入门到进阶】65、Pandas如何批量拆分与合并Excel文件

接上篇《64、Pandas如何实现数据的Concat合并》 上一篇我们学习了Pandas如何实现数据的Concat合并&#xff0c;本篇我们来继续学习Pandas如何批量拆分与合并Excel文件。 一、引言 在当今数据驱动的时代&#xff0c;Excel文件作为数据处理和分析的基石&#xff0c;扮演着不可或…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

SpringBoot 3.4.0还没来之前,又又又更新啦!SpringBoot 3.3.4版本依赖升级,性能与稳定性再提升!

为什么要使用SpringBoot在现代开发中&#xff0c;高效与灵活性是每个开发团队追求的核心目标。然而&#xff0c;如何在不牺牲灵活性的前提下&#xff0c;快速构建复杂的应用程序&#xff0c;常常成为开发者的难题。SpringBoot的出现&#xff0c;正是为了解决这个矛盾。它以“约…

【Linux】【Hadoop】大数据基础实验一

实验一&#xff1a;熟悉常用的Linux操作和Hadoop操作 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验平台 操作系统…

从 Affine Particle-In-Cell (APIC) 到 Material Point Method (MPM 物质点法)

APIC与MPM Particle-In-Cell (PIC)Affine Particle-In-Cell (APIC)Material Point Method (MPM)关于边界投影等额外操作 Material Point Method (MPM 物质点法)是一种混合欧拉-拉格朗日视角物理仿真方法。 欧拉视角即网格视角&#xff0c;将空间划分为网格&#xff0c;通过表示…

【永磁同步电机(PMSM)】 5. PMSM 的仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 5. PMSM 的仿真模型 1. 基于 Simulink 的仿真模型1.1 PMSM 的数学模型1.2 Simulink 仿真模型1.3 模块封装&#xff08;mask&#xff09;1.4 三相PMSM矢量控制仿真模型 2. Simscape 的 PMSM 模块2.1 PMSM 模块的配置2.2 PMSM 模块…

秃头篇——二叉树进阶算法题

一、根据二叉树创建字符串 题目&#xff1a; 思路&#xff1a;这个题很明显需要我们采用二叉树的递归实现&#xff08;前序遍历&#xff09;&#xff0c;但有一个注意的点&#xff1a;空括号能不能省略的问题&#xff0c;其实我们发现只要左为空&#xff0c;右不为空不能省略括…

[JavaEE] 网络初识(网络通信 及 TCP / UDP / IP 封装分用 )

Author&#xff1a;MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 文章目录 目录 文章目录 一. 网络通信基础 1. 局域网LAN 2. ⼴域⽹WAN 3. IP地址 4. 端口号 二.协议 1. 五元组 2. 协议分层 协议分层的优点: 3. OSI七层协…

OJ在线评测系统 后端开发数据库初始化工作 开发库表 建立数据库索引 Mybatis映射初始化接口开发

后端接口开发库表设计 项目主业务流程的开发 1.用户模块 注册&#xff08;后端已实现&#xff09; 登录&#xff08;后端已实现 前端已实现&#xff09; 2.题目模块 创建题目&#xff08;管理员&#xff09; 删除题目&#xff08;管理员&#xff09; 修改题目&#xff0…

基于SpringBoot+Vue+MySQL的校园一卡通系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的快速发展&#xff0c;校园一卡通已成为大学生活中不可或缺的一部分。它不仅承载着校园消费的功能&#xff0c;还集成了学生身份证明、图书馆借阅、门禁系统等多种服务。然而&#xff0c;传统的一卡通管理系统往往…