【Linux】进程的概念 进程状态 进程优先级

Content

    • 一、什么是进程
      • 1. 进程的概念
      • 2. 进程的描述 - 进程控制块(PCB)
      • 3. Linux下的进程
    • 二、进程状态
      • 1. 教科书中的进程状态
        • 运行状态
        • 阻塞状态
        • 挂起状态
      • 2. Linux下的进程状态
        • R(running)- 运行状态
        • S(sleeping) - 睡眠状态
        • D(disk sleep)- 磁盘休眠状态
        • T(stopped)- 停止状态
        • t(tracing stop)- 追踪暂停状态
        • X(dead)- 死亡状态
        • > 两种特殊的进程 <
          • 1. 僵尸进程
          • 2. 孤儿进程
    • 三、进程的优先级
      • 1. 什么是优先级
      • 2. 为什么要有优先级
      • 3. Linux中优先级的特点
    • 四、进程的其他概念

[!abstract] 进程的学习

  • 认识冯诺依曼系统
  • 操作系统概念与定位
  • 深入理解进程概念,了解PCB
  • 学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害
  • 了解进程调度,Linux进程优先级,理解进程竞争性与独立性,理解并行与并发
  • 理解环境变量,熟悉常见环境变量及相关指令, getenv/setenv函数
  • 理解C内存空间分配规律,了解进程内存映像和应用程序区别, 认识地址空间
  • 学习进程创建,fork/vfork
  • 学习到进程等待
  • 学习到进程程序替换, 微型shell,重新认识shell运行原理
  • 学习到进程终止,认识$?

一、什么是进程

1. 进程的概念

  • 课本概念:进程就是被加载到内存中的程序,或者被运行起来的程序就叫做进程
  • 操作系统内核观点:进程=可执行程序+进程控制块(PCB)。

2. 进程的描述 - 进程控制块(PCB)

进程控制块PCB (Process Control Block),是操作系统中用于描述进程的工具,其中包含的是进程属性的集合。

Linux操作系统下的PCB是 task_struct,它是Linux内核的一种数据结构,其内容可以分为如下几类:

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

3. Linux下的进程

  1. 描述起来,用结构体(struct)
struct task_struct 
{     //进程的所有属性... ...//进程对应的代码和数据的地址... ...//下一个进程的地址struct task_struct* next;
};

在 Linux 系统中,进程控制块(Process Control Block,简称 PCB)通常是用 C 语言中的 struct 结构体来实现的。这个结构体包含了与进程相关的各种信息,比如进程状态、进程 ID、优先级、CPU 寄存器值、内存映射信息等。在 Linux 源代码中,这个描述进程的结构体通常被命名为 task_struct

  • 课本上称之为PCB(process control block)
  • Linux操作系统下的PCB是: task_struct

task_struct 是 PCB 的一种

  1. 组织起来,用链表或其他高效的数据结构
    在 Linux 中,所有进程都通过一个 task_list 双向循环链表来连接。每个 task_struct 结构体都有一个 tasks 成员(通常是 list_head 类型),该成员用于将它插入到全局的 task_list 链表中。
/** Simple doubly linked list implementation.** Some of the internal functions ("__xxx") are useful when* manipulating whole lists rather than single entries, as* sometimes we already know the next/prev entries and we can* generate better code by using them directly rather than* using the generic single-entry routines.*/struct list_head 
{struct list_head *next, *prev;
};

进程=可执行程序 (exe) + task_struct对象(内核对象)


二、进程状态

1. 教科书中的进程状态

请添加图片描述

在普适的操作系统层面,即站在操作系统学科的角度来说,进程状态可能有如下几种:运行、挂起、阻塞、新建、就绪、等待、挂机、死亡;其中最重要也是最难理解的几种状态分别是:运行、阻塞、挂起

运行状态

操作系统为了合理分配CPU以及各种硬件资源,也为了更好的调度各个进程,会为CPU创建一个进程队列,为每一个硬件都创建一个等待队列;而让某一个进程处于运行状态本质上就是将该进程对应的PCB放入CPU的运行队列中,然后再将PCB中维护进程状态的变量修改为相应的值,比如0;

因为进程PCB里面有进程的各种属性,以及进程对应的代码和数据的地址,所以CPU从运行队列中取出PCB后,可以根据该PCB来得到进程的各种数据和指令,然后执行相应运算;

所以进程处于运行状态并不一定意味着该进程此刻正在被运行,只要该进程处于CPU的运行队列中即可。所以,运行状态就是进程处于执行中,或者在运行队列中等待执行。(注:CPU是纳秒级的芯片,运算速度非常快,所以只要进程处于CPU的运行队列中,我们就可以认为该进程正在被运行)

阻塞状态

和CPU一样,我们计算机中的各种硬件也是十分有限的,但是需要使用这些硬件资源的进程却有很多,比如很多进程都需要向磁盘中写入数据,又或者要通过网卡发送数据;但是一个磁盘或者一个网卡在同一个时刻只能为一个进程提供服务,那么如果此时有其他运行中的进程需要使用该硬件资源,操作系统就会将该进程的PCB放入硬件的等待队列中,等待硬件来为我提供服务。

上面这种由于访问某种硬件需要进行等待的状态就被称为阻塞状态,阻塞状态本质上就是将进程的PCB从CPU的运行队列中剥离出来,放入硬件的等待队列中,然后将PCB中维护进程状态的变量修改为相应的值,比如1;待该进程获得对应的对应的硬件资源以后,再将该进程放入CPU的运行队列中。

(注:并不是只有等待硬件资源进程才会处于阻塞状态,一个进程等待另一个进程就绪、一个进程等待某种软件资源就绪等都会处于阻塞状态。)

挂起状态

上面我们学习了阻塞状态,处于阻塞状态的进程由于需要等待某种资源,所以它对应的代码和数据在短期内并不会被执行,此时它们仍存在在内存中就相当于浪费了内存资源;而如果当前操作系统处于高IO的情况下,内存空间不足,操作系统就会选择将这些处于阻塞状态的进程对应的代码和数据拷贝一份存放到磁盘中,然后释放内存中那一份,从而节省出内存空间;

上面这种由于内存空间不足,操作系统将在等待资源的进程对应的代码数据放到磁盘中以节省内存空间的状态就被称为挂起状态;挂起状态不会移动进程的PCB,只会移动进程对应的代码和数据。

(注:挂起进程并不是释放进程,因为该进程对应的PCB仍然处于某硬件的等待队列中,当该进程获得对应的资源以后,操作系统仍然可以将该进程对应的代码和数据从磁盘加载到内存中来继续运行,其本质是对内存数据的唤入唤出;同时阻塞不一定挂起,挂起也不一定阻塞,也可能是新建挂起、就绪挂起,甚至是运行挂起。)

[!attention] 阻塞和挂起的区别:
与阻塞(等待)状态不同,在挂起状态下,进程通常不是在等待某种资源或条件的满足,而是被显式地暂停了,可以通过相应的信号(例如,在Linux中的 SIGCONT)来继续执行。


区别:

  1. 触发原因:

    • 阻塞通常是因为进程在等待某些系统资源或事件。
    • 挂起通常是由用户或管理员明确要求的。
  2. 可控性:

    • 阻塞状态通常是自动的,由系统内核管理。
    • 挂起状态通常是可以被用户或管理员控制的。
  3. 可中断性:

    • 阻塞状态可能是可中断或不可中断的。
    • 挂起状态总是可以通过 SIGCONT 信号来解除的。
  4. 持续时间:

    • 阻塞状态持续到所等待的条件得到满足。
    • 挂起状态持续到进程收到一个 SIGCONT 信号。

[!quote] 总结
进程状态改变的本质是进程对应的 PCB (task_struct 对象) 处于不同设备的运行队列/等待队列中。

2. 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(running)- 运行状态

它表明进程PCB在运行队列里,虽然在运行队列并不意味着进程一定在运行中,但是因为CPU非常快,所以只要进程处于CPU的运行队列中,我们就可以认为该进程正在被运行。请添加图片描述

S(sleeping) - 睡眠状态

味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep)),Linux下的睡眠状态其实就是我们上面所说的阻塞状态。
请添加图片描述

注:我们使用 ps axj 指令查看进程状态只能查看进程某一时刻的状态,而外设的速度是要远远低于CPU的,所以我们可以发现,虽然 process 也在执行加法运算,但是我们每次查询时进程基本都处于阻塞状态,因为进程99%的时间都在等待硬件资源就绪,只有1%的时间在进行加法运算以及执行打印代码。

D(disk sleep)- 磁盘休眠状态

有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
上面我们提到,当内存空间不足的时候,操作系统会将一部分进程挂起来节省资源;但是如果内存空间严重不足,挂起已经解决不了问题的时候,操作系统就会主动杀掉某些进程;

那么这里就出现了一个问题,万一操作系统把某些非常重要的进程杀掉了怎么办?比如,当前有一个进程需要向磁盘写入一批数据,这批数据是10万名用户一年的转账记录,非常重要;该进程访问磁盘,让磁盘帮它写入数据,在磁盘写数据的时间段内,该进程是属于阻塞状态的,因为它要等待磁盘返回给它一个结果,即是否写入成功;而一旦该进程被操作系统杀掉,且恰好磁盘写入失败了,磁盘将写入结果反馈给该进程发现无人应答,磁盘就只能将该部分数据丢弃然后为其他进程提供服务;此时,这部分十分重要的用户数据就丢了。

为了防止这种情况的发生,Linux设计出了深度睡眠 (D) 状态,处于深度睡眠状态的进程既不能被用户杀掉,也不能被操作系统杀掉,只能通过断电,或者等待进程自己醒来

注:深度睡眠一般只会在高IO的情况发生下,且如果操作系统中存在多个深度睡眠状态的程序,那么说明该操作系统也即将崩溃了。

T(stopped)- 停止状态

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
列出kill的选项:请添加图片描述

请添加图片描述

t(tracing stop)- 追踪暂停状态

追踪暂停状态是一种特殊的暂停状态,进程处于此状态表示该进程正在被追踪,比如 gdb 调试进程。
请添加图片描述

X(dead)- 死亡状态

这个状态只是一个返回状态,死亡状态代表着一个进程结束运行,该进程对应的PCB以及代码和数据全部被操作系统回收,我们不会在任务列表里看到这个状态。

Linux下的进程状态,本质上就是进程PCB中的一个变量:

#define TASK_RUNNING        0
#define TASK_INTERRUPTIBLE  1
#define TASK_UNINTERRUPTIBLE    2
#define __TASK_STOPPED      4
#define __TASK_TRACED       8
/* in tsk->exit_state */
#define EXIT_ZOMBIE     16
#define EXIT_DEAD       32
/* in tsk->state again */
#define TASK_DEAD       64
#define TASK_WAKEKILL       128

因此,进程状态变化的本质:

  1. 更改PCB中的status变量
  2. 将 PCB 连入不同的运行队列中
> 两种特殊的进程 <
1. 僵尸进程

什么是僵尸进程
在Linux中,当一个进程完成它的执行但还没有被其父进程清理(也就是读取其退出状态)时,它就会变成僵尸进程。这种情况通常发生在父进程在其子进程结束之前就结束了。在这种情况下,子进程的状态信息会被保留在系统中,以便父进程在以后的某个时候读取。

用代码说明:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>int main()
{int id = fork();if(id > 0){while(1){printf("我是父进程,pid: %d, ppid: %d\n", getpid(), getppid());sleep(1);}}else if(id == 0){while(1){printf("我是子进程,pid: %d, ppid: %d\n", getpid(), getppid());sleep(1);}}else {perror("fork fail");exit(-1);}return 0;
}

请添加图片描述

kill 掉子进程之后,由于父进程中没有对子进程的退出状态代码进行读取,所以子进程变成了 Z 状态,并且子进程后面还提示了 defunct (失效的,不再使用的),此时,如果父进程一直不对不对子进程进行读取,那么子进程就会变成僵尸进程。

僵尸进程的危害
僵尸进程本身并不占用任何系统资源(如CPU时间或内存),因为它们已经停止执行。然而,每个僵尸进程的PCB还存在于操作系统进程表中,这可能会消耗有限的系统资源。如果有大量的僵尸进程,它们可能会耗尽进程表的空间,导致新的进程无法启动。此外,如果父进程不正确地处理子进程的退出,可能会导致僵尸进程的数量持续增加。

2. 孤儿进程

孤儿进程是指在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

请添加图片描述

[!warning] 两个细节:

  1. 父进程退出后并没有变成Z状态:
    当一个进程结束时,它的进程描述符会立即消失,而是等待父进程读取其退出状态。在这个等待过程中,进程被称为僵尸进程(Z状态)。如果父进程先于子进程退出,子进程就会被init进程接管,子进程结束后,init进程会负责读取其退出状态,因此,子进程不会变成僵尸进程。

  2. 子进程被领养后变成了后台进程:
    在UNIX系统中,后台进程是指与终端脱离关系,独立运行的进程。当父进程退出,子进程被init进程接管后,子进程就会变成后台进程。这是因为init进程是在系统启动时由内核创建的,它不依赖于任何终端,因此,被它接管的子进程也会变成后台进程。


ps:进程状态后面的 + 号代表着一个进程是前台进程,没有 + 号就代表是后台进程

三、进程的优先级

1. 什么是优先级

优先级和权限不同,权限决定的是一件事情能不能做;优先级是在权限允许的前提下,该事情先做还是后做;

2. 为什么要有优先级

资源是有限的,内存中有很多进程都要占用资源,但是资源是有限的,所以我们需要指定优先级来合理的分配资源;

3. Linux中优先级的特点

Linux 中优先级的表示与维护通过两个变量 PRI (priority) 和 NI (nice) 来完成,每个进程默认的 PRI 都是 80,NI 都是 0;我们可以通过修改 NI 的值来调整进程的优先级,NI 的改动范围为 [-20, 19];PRI 与 NI 的和越小,进程的优先级就越高;

我们也可以通过如下步骤来修改进程优先级 (将进程优先级调高可能需要 sudo 权限):

输入top --> 输入r --> 输入进程id --> 输入NI值

请添加图片描述

修改进程优先级的本质就是修改进程的nice值

请添加图片描述

四、进程的其他概念

进程还有一些其他概念:

  • 竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的;(进程为了高效完成任务,更合理竞争相关资源,便具有了优先级)
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰;(每个进程的PCB以及代码数据都是独立的,一个进程的死亡不会影响其他进程,包括父子进程,子进程崩溃并不会影响父进程)
  • 并行:多个进程在多个CPU下分别、同时进行运行,这称之为并行;
  • 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。(我们用的电脑一般都是并发,只有一个CPU)请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 程序设计语言学习——基础语法

Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发&#xff0c;最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apach…

大模型日报-20240122

清华、小米、华为、 vivo、理想等多机构联合综述&#xff0c;首提个人LLM智能体、划分5级智能水平 https://mp.weixin.qq.com/s/JYB4BzsXhWF8pEUUkvn_GQ 想必这些唤醒词中至少有一个曾被你的嘴发出并成功呼唤出了一个能给你导航、讲笑话、添加日程、设置闹钟、拨打电话的智能个…

ROS学习笔记7——ROS通信机制3(参数服务器)

参数服务器是以参数共享模式实现的&#xff0c;参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。参…

mysql 容器化安装(docker)离线和在线

前言&#xff1a;在部署hive或airflow 升级过程中&#xff0c;总需要一个对应的数据库存储元数据&#xff0c;一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …

【前后端的那些事】评论功能实现

文章目录 聊天模块1. 数据库表2. 后端初始化2.1 controller2.2 service2.3 dao2.4 mapper 3. 前端初始化3.1 路由创建3.2 目录创建3.3 tailwindCSS安装 4. tailwindUI5. 前端代码编写 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&…

JVM知识总结

1.概述 JVM指的是Java虚拟机&#xff0c;本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件&#xff0c;作用是为了支持跨平台特性。 功能&#xff1a; 装载字节码&#xff0c;解释/编译为机器码 管理数据存储和垃圾回收 优化热点代码提升效率 …

Pytest应用PO设计模式

Pytest应用PO设计模式 本篇内容主要涉及在软件测试中实现PO设计模式的应用 包含PO思想、PO原则、PO使用方法&#xff0c;最后会写一个实际模板供大家参考。 一、PO思想 ​ PO(PageObject)&#xff0c;在UI页面测试时&#xff0c;通常会存在大量的页面元素和各种点击操作&#…

华为欧拉操作系统结合内网穿透实现固定公网地址SSH远程连接

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 欧拉操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘openEuler是面向数字基础设施的操作系…

【开源】基于JAVA的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【QT+QGIS跨平台编译】之二:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zlib介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、zlib介绍 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#xff09;压缩和解压函数。zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&am…

#vue3 实现前端下载excel文件模板功能

一、需求&#xff1a; 前端无需通过后端接口&#xff0c;即可实现模板下载功能。 通过构造一个 JSON 对象&#xff0c;使用前端常用的第三方库 xlsx&#xff0c;可以直接将该 JSON 对象转换成 Excel 文件&#xff0c;让用户下载模板 二、效果&#xff1a; 三、源码如下&…

【Docker】部署和运行青龙面板:一个支持python3、javaScript、shell、typescript 的定时任务管理面板

引言 青龙面板是一个支持python3、javaScript、shell、typescript 的定时任务管理面板。 步骤 拉取镜像 从 Docker Hub 上拉取最新的 “qinglong” 镜像。 docker pull whyour/qinglong:latest启动容器 使用刚刚拉取的镜像来启动一个新的 Docker 容器。 docker run -dit \-v…

Linux中的软件包管理器yum

目录 1.什么是软件包 2.关于 rzsz 3.查看软件包 4.如何安装软件 5.如何卸载软件 1.什么是软件包 ● 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. ● 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

寒假思维训练计划day11

每日一题&#xff0c;这两天有事&#xff0c;断更了一天&#xff0c;今天补上&#xff0c;感觉状态也不太好&#xff0c;来道1500的题压压惊。 宣传一下我总结的几个构造题模型&#xff0c;一点个人的浅薄见解&#xff1a; 1、前后缀贪心&#xff0c;比如说观察前后缀的sum&…

Spring Boot 整合 Camunda 实现工作流

工作流是我们开发企业应用几乎必备的一项功能&#xff0c;工作流引擎发展至今已经有非常多的产品。最近正好在接触Camunda&#xff0c;所以来做个简单的入门整合介绍。如果您也刚好在调研或者刚开始计划接入&#xff0c;希望本文对您有所帮助。如果您是一名Java开发或Spring框架…

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…

Spring框架面试题

目录 1.Spring中bean的生命周期 2.Spring中bean的循环依赖 3.SpringMVC执行流程 4.Springboot自动装配原理 5.Spring框架常见注解(Spring、Springboot、SpringMVC) 6.mybatis执行流程 7.mybatis延迟加载使用及原理 8.mybatis一级、二级缓存 1.Spring中bean的生命周期 2.…

11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录 一、卷积 1、卷积概念 2、卷积如何工作 3、常见算子&#xff08;卷积核 Kenel&#xff09; 4、自定义卷积模糊 5、代码演示 二、卷积边缘 1、卷积边缘问题 2、处理边缘 3、相关的API说明 4、代码演示 一、卷积 1、卷积概念 &#xff08;1&#xff09;在OpenC…

[MySQL]基础的增删改查

目录 1.前置介绍 2.数据库操作 2.1显示当前数据库 2.2创建数据库 2.3 使用数据库 2.4 删除数据库 3.常用数据类型 3.1整型和浮点型 3.2字符串类型 4.表的操作 4.1查看表结构 4.2创建表 4.3删除表 5.重点 5.1操作数据库 5.2常用数据类型 5.3操作表 1.前置介绍 …