chatgpt教我复习专业课知识(整理)

本文详细探讨了数据库的基础概念,包括数据库、数据库系统和数据库管理系统之间的区别,以及数据表的规范化(1NF,2NF,3NF)。同时,文章还涵盖了软件工程的核心要素,如需求分析、软件生命周期、内存管理,以及内存泄露的预防和修复方法。
摘要由CSDN通过智能技术生成

1.数据库

1.1数据库,数据库系统,数据库管理系统之间有什么联系和区别

数据库(Database):数据库是指按某种数据模型组织、存储和管理数据的集合。它是一个结构化的数据存储集合可以存储多个数据表,用于支持应用程序的数据操作和管理。  仓库

数据库系统(Database System):数据库系统是指由数据库、数据库管理系统(DBMS)及相关应用软件组成的一种计算机系统。它负责管理和维护数据库中的数据,并提供数据访问、处理、查询等功能。   管理

数据库管理系统(Database Management System,DBMS):数据库管理系统是数据库系统核心组成部分,是一种软件系统,用于管理和操作数据库。DBMS负责处理数据库的创建、更新、读取和删除等操作,保证数据的完整性、安全性和一致性。   和用户交互的接口

1.2 1NF 2NF 3NF

1NF(第一范式):数据表中的每个字段都是不可再分的原子值,即每个字段都不可再分为更小的数据单元。每个单元格内只包含一个值,避免数据冗余和复杂性。

2NF(第二范式):在满足第一范式的基础上,表中的所有非主键完全依赖于所有主键,而不是仅依赖于主键的一部分。消除部分依赖,并提高数据的完整性和一致性。

3NF(第三范式):在满足第二范式的基础上,表中的所有字段非主键字段之间没有直接依赖关系,即不存在传递依赖。将数据表分解为更小的关系,可以减少数据冗余和提高数据的一致性。

BCNF是在第三范式的基础上进一步强调主属性完全函数依赖于码。消除了任何函数依赖非候选键的情况,进一步提高了数据表的规范化程度。

1.3事务

事务(transaction)是指作为单个逻辑工作单元执行的一系列操作。在数据库管理系统中,事务是由一组数据库操作(例如插入、更新、删除)组成的工作单元。事务具有以下四个特性(ACID 特性):

  1. 原子性(Atomicity):事务是一个不可分割的操作单元,要么全部执行成功,要么全部失败回滚。如果在事务执行过程中出现错误,数据库会自动撤销之前的操作,使数据回滚到事务执行前的状态。

  2. 一致性(Consistency):事务在执行前后,数据库的完整性约束保持一致。事务确保数据的状态从一个一致性状态转换到另一个一致性状态,避免数据损坏。

  3. 隔离性(Isolation):指多个并发执行的事务之间应该相互隔离,互不干扰。每个事务应该被视为独立操作,不受其他事务的影响。数据库系统使用隔离级别来管理事务间的并发操作。

  4. 持久性(Durability):一旦事务成功执行并提交,数据的修改将被永久保存,即使系统发生故障或重启,数据也不会丢失。数据库系统会将事务的改变保存到永久性存储介质中

1.4自然连接和等值连接

自然连接,就自然

等值连接 突出等值,需要指明等值条件

无损连接 链接后不损失数据,也不冗余

1.5 关系模型

关系模型  包括实体,属性,键,约束

  1. 实体:关系模型中的每一个行代表一个实体。
  2. 属性:关系模型中的每一个列代表一个属性。
  3. 键(Key):用来唯一标识一个实体的属性或属性组合,关系模型中的每一行都应有一个唯一的键
  4. 约束(Constraint):用来规定关系模型中数据的完整性,如主键约束、外键约束等。

2.软件工程

2.1 什么是软件工程

软件工程是研究和应用一系列方法、工具和过程的学科,旨在开发高质量、可靠且高效的软件系统。软件工程涵盖了软件开发的整个生命周期,包括需求分析、设计、编码、测试、部署和维护等阶段。软件工程师利用系统化的方法论来管理软件项目,确保项目按时、按预算、按质量完成。软件工程旨在提高软件开发的可靠性、可维护性、可扩展性和安全性,以满足用户需求并提高生产力。

2.2 软件工程的建模方法

需求建模用于分析和定义软件系统的需求,包括用例建模、需求规约和场景建模等。

结构建模关注软件系统的静态结构,使用类图、组件图和包图等来描述组件和模块之间的关系。

行为建模描述软件系统的动态行为,通过状态图、活动图和时序图等展示系统的状态、流程和交互。

架构建模用于设计和组织整体系统结构,包括体系结构图和部署图等。

数据建模描述软件系统的数据结构和数据流,使用实体-关系图和数据流图等表示数据之间的关系和转换流程。

2.3 软件工程有几个阶段

  1. 需求分析:与客户合作确定系统需求,并确保对系统需求的理解达成一致。功能和特性。

  2. 设计阶段:根据需求分析阶段的文档和规范,制定详细的系统设计方案,包括系统结构、组件、模块、数据流等。目标是定义系统的架构、接口和行为。

  3. 编码阶段:开发团队根据设计文档编写和实现软件系统的代码。编码阶段的目标是将设计转化为可执行的软件程序。

  4. 测试阶段:对已实现的软件进行测试,以确保系统能够按照需求和设计规范正常运行,并修复发现的问题和缺陷。确保系统的质量和可靠性。

  5. 部署与维护阶段:将系统部署到生产环境中,让用户开始使用。进行系统的维护和更新,以确保系统始终能够满足用户需求。

2.4 生命周期

软件从概念阶段到退役和取代之间的各个阶段,软件生命周期涵盖了软件的规划、开发、测试、部署、维护和退役等各个阶段,以及这些阶段之间的转换和相互关系。

  1. 阶段性:软件生命周期是由一系列连续的阶段组成的,每个阶段都有特定的目标和活动。

  2. 可控性:软件生命周期是可以被规划、管理和控制的。通过规范的软件开发流程和方法,可以有效地管理软件项目,确保按计划顺利完成。

  3. 循环性:软件生命周期是一个循环过程,不断重复进行。在软件的维护阶段,可能会出现新的需求或问题,需要进行新的开发、测试和部署,形成一个循环。

  4. 文档化:在软件生命周期的不同阶段,需要生成各种文档和报告,包括需求文档、设计文档、测试报告等,以记录软件开发过程和确保质量。

2.5 怎么做项目需求分析

  1. 确定项目范围:明确项目的范围和目标,确定需要实现的功能和特性。与利益相关者(项目团队、客户、用户等)充分沟通,了解期望和需求。

  2. 收集需求:收集各方的需求和期望,通过多种方式进行。确保充分了解用户的实际需求,而不仅仅是表面的要求。

  3. 分析和整理需求:对收集到的需求进行分类、整理和分析,区分出核心需求和次要需求,确保理解清楚每个需求的背景和原因。

  4. 确认需求:与利益相关者确认需求,确保对需求的理解达成一致。

  5. 文档化需求:将确认的需求详细记录在需求文档中,包括功能需求、非功能性需求(性能、安全等)、用户界面设计等内容。需求文档应该清晰、完整、一致,并得到相关方的批准。

  6. 管理变更:在项目进行过程中,需求可能会发生变化。需要建立变更管理机制,确保变更经过评审、批准和跟踪,以避免对项目进度和质量造成影响。

3.408

3.1  cache工作原理

利用局部性原理,也就是最近使用过的数据可能很快会被再次使用,解决cpu和内存之间的速度不匹配问题

当cpu想从某地址读取数据时,先检查cache是否命中,若命中则直接读出,否则进行替换算法:最近最少使用,先进先出、随机替换

写回:要被替换的时候写回主存

直写:

直接映射:唯一位置

全相连:任意位置

组相连:组内全相连,组间直接

3.2 虚拟存储器有哪些类型

分页式:固定大小

段式:

段页式:先按段,段内分页

3.3 内存映射的方式

文件或其他设备映射到应用程序地址空间的技术,使应用程序可以像访问内存一样访问文件或设备

  1. 文件映射(File Mapping):文件的内容被映射到应用程序的地址空间中,使得应用程序可以直接通过内存访问文件内容,而无需进行繁琐的读取和写入操作。在文件映射中,文件内容通常被映射为一个内存区域,应用程序通过操作这个内存区域来读取和写入文件内容。

  2. 匿名映射(Anonymous Mapping)将内存映射到应用程序地址空间,但没有与文件或设备对应的映射。匿名映射通常用于进程间通信或共享数据,也可以用于动态分配内存等操作。

  3. 设备映射(Device Mapping):将设备的寄存器等映射到应用程序地址空间的技术,使得应用程序可以直接读写设备寄存器,而无需通过底层驱动程序进行操作。

  4. 共享映射(Shared Mapping):允许多个进程共享同一段内存映射的方式,使得多个进程可以通过共享内存来进行通信和数据共享

  5. 写时复制映射(Copy-on-write Mapping):一种延迟复制技术,允许多个进程共享同一段内存映射,当其中一个进程尝试写入共享内存时,系统会复制该内存页面,以保证写入不影响其他进程

3.4 抽象类是什么意思,举例

抽象类是一种在面向对象编程中使用的概念,它不能被实例化只能作为其他类的父类来继承和扩展。抽象类通常包含一些抽象方法(方法只有声明而没有具体实现),子类必须实现这些抽象方法才能被实例化。抽象类的存在主要是为了提供一个通用的模板或契约,以确保子类实现了必要的方法。

比如定义一个抽象社团类,里面包含加入社团和退出社团两个抽象方法,定义一个舞蹈社作为社团类的子类,然后在舞蹈社的类内部就要实现加入社团和退出社团这两个抽象方法。

3.5 TCP/IP三次握手

3.6 操作系统管理什么

文件,设备,内存,用户界面,进程

3.7 排序

冒泡:从前向后比较相邻的两个元素,

插入:从未排序的元素中选一个插入已排序部分

选择:每次选最大/最小元素,放在已排序的最开头、末尾

快排:递归,比它大的放左边,小的放右边 O(nlogn)                空间On

归并:分治,将两个分别排序然后合起来再排序O(nlogn)                空间On

堆:建堆,移出堆顶O(nlogn)                

其他O(n2)    O1

3.8 查找

  1. 线性查找

    逐个遍历数据集中的元素,依次比较目标值和当前元素的值。 O(n)
  2. 二分查找

    有序数据集,在每一步都将查找范围缩小一半,直到找到目标值为止。 O(logn)
  3. 哈希查找

    利用哈希函数将元素映射到哈希表中的位置,根据键来直接访问目标元素。 O(1)
  4. 二叉搜索树

    构建二叉搜索树,在每一步中比较目标值和当前节点的值,从而快速定位目标元素。O(logn)

1.内存泄露

内存泄漏是指在程序中动态分配的内存空间在不再需要时未被正确释放的情况。这种情况会导致程序持续占用内存,最终可能导致系统资源耗尽,程序崩溃或运行缓慢。

内存泄漏通常发生在以下情况下:

  1. 动态分配的内存没有被释放:当使用函数如 malloc()newcalloc() 来分配内存时,应该在不再需要时使用对应的释放函数(如 free()deletefree())来释放内存。如果忘记释放内存,就会导致内存泄漏。

  2. 丢失对已分配内存的引用:如果分配了一块内存,并将其地址赋给一个指针变量,但后续丢失了该指针变量,那么就无法再释放这块内存,从而导致内存泄漏。

  3. 循环引用:在某些编程环境中,比如面向对象的语言中,对象之间可能存在循环引用。

内存泄漏的修复方法包括:

  1. 显式释放内存:确保在不再需要使用动态分配的内存时,使用对应的释放函数显式地释放内存。

  2. 使用垃圾回收(Garbage Collection):某些编程语言(如Java、C#)具有内置的垃圾回收机制,可以自动检测和回收不再使用的内存。

  3. 使用智能指针(Smart Pointers):在一些编程语言中,如C++,可以使用智能指针来管理动态分配的内存。智能指针会自动在不再需要时释放内存,从而避免内存泄漏。

  4. 使用内存分析工具:使用专门的内存分析工具来检测和识别内存泄漏问题。这些工具可以帮助找出未释放的内存和内存泄漏的来源。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东部欧安时

祝你今天也顺利~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值