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

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言

冯诺依曼架构是现代计算机系统的基础,它的提出为计算机的发展奠定了理论基础。在学习 C++ 和 Linux 系统时,理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的,包括程序的存储、执行和资源管理。这对于编写高效、可靠的 C++ 程序以及更好地利用 Linux 系统资源非常重要。

二、冯诺依曼架构概述

存储程序概念

存储程序是冯诺依曼架构的核心思想之一。在 C++ 中,当我们编写源代码时,代码和数据都存储在文件中。经过编译和链接过程,生成的可执行文件存储在存储设备上。当我们运行程序时,可执行文件被加载到内存中,CPU 从内存中读取指令和数据,并按顺序执行。例如:

#include <iostream>
using namespace std;int main() {int a = 5;int b = 10;int c = a + b;cout << c << endl;return 0;
}

在这个简单的 C++ 程序中,代码和数据(变量abc)都存储在内存中。编译器将源代码转换为机器代码,存储在可执行文件中,加载后 CPU 会执行指令,如将 5 和 10 存储在内存中,执行加法操作,将结果存储在c中,然后将c的值输出。

运算器

运算器负责执行算术和逻辑运算。C++ 中的运算符对应于运算器的操作:

#include <iostream>
using namespace std;int main() {int result = (10 > 5) && (20 < 30);  // 逻辑运算int sum = 10 + 20;  // 算术运算cout << result << " " << sum << endl;return 0;
}

这里,><&&+运算符的操作由运算器执行。编译器将这些运算符转换为相应的机器指令,运算器根据指令进行运算。

控制器

控制器决定程序的执行顺序。C++ 中的流程控制语句体现了这一点:

#include <iostream>
using namespace std;int main() {int num = 10;if (num > 5) {cout << "Greater than 5" << endl;} else {cout << "Less than or equal to 5" << endl;}for (int i = 0; i < 5; ++i) {cout << i << endl;}return 0;
}

控制器根据if条件决定执行哪个分支,以及根据for循环的条件决定循环次数。

存储器

Linux 系统有多种存储器。在 C++ 中,我们可以这样使用内存:

#include <iostream>
#include <new>
using namespace std;int main() {int* ptr = new int[10];  // 动态内存分配for (int i = 0; i < 10; ++i) {ptr[i] = i;}delete[] ptr;  // 释放内存return 0;
}

这里使用new进行动态内存分配,操作的是主存。指针ptr指向分配的内存块,使用完后使用delete[]释放内存,以避免内存泄漏。

输入输出设备

在 C++ 中,标准输入输出流提供了方便的 I/O 操作:

#include <iostream>
#include <fstream>
using namespace std;int main() {int num;cout << "Enter a number: ";cin >> num;  // 从键盘输入cout << "You entered: " << num << endl;ofstream outfile("output.txt");  // 向文件输出outfile << "Hello, World!" << endl;outfile.close();return 0;
}

三、冯诺依曼架构在 Linux 系统中的体现

进程管理

在 Linux 中,进程是程序的执行实例。使用 C++ 可以这样创建进程:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程std::cout << "Child process" << std::endl;exit(0);} else if (pid > 0) {// 父进程std::cout << "Parent process" << std::endl;wait(NULL);} else {std::cerr << "Fork failed" << std::endl;}return 0;
}

这里fork系统调用创建进程,wait等待子进程结束,这些操作由控制器协调。

内存管理

Linux 使用虚拟内存,C++ 程序可以使用mmap等系统调用进行内存映射:

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>int main() {void* ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);if (ptr == MAP_FAILED) {std::cerr << "mmap failed" << std::endl;return 1;}((int*)ptr)[0] = 10;std::cout << ((int*)ptr)[0] << std::endl;if (munmap(ptr, 4096) == -1) {std::cerr << "munmap failed" << std::endl;return 1;}return 0;
}

文件系统

C++ 中的文件操作:

#include <iostream>
#include <fstream>
#include <string>int main() {std::string filename = "test.txt";std::ofstream file(filename);if (file.is_open()) {file << "This is a test file." << std::endl;file.close();} else {std::cerr << "Could not open the file." << std::endl;}std::ifstream inputFile(filename);std::string line;if (inputFile.is_open()) {while (std::getline(inputFile, line)) {std::cout << line << std::endl;}inputFile.close();} else {std::cerr << "Could not open the file." << std::endl;}return 0;
}

四、C++ 与 Linux 系统调用的结合

系统调用的重要性

系统调用允许 C++ 程序访问操作系统的资源。例如,使用open系统调用打开文件:

#include <iostream>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("test.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) {std::cerr << "Failed to open file" << std::endl;return 1;}write(fd, "Hello, World!", 12);close(fd);return 0;
}

系统调用的实现

可以使用syscall函数直接调用系统调用:

#include <iostream>
#include <sys/syscall.h>
#include <unistd.h>int main() {long result = syscall(SYS_getpid);std::cout << "Process ID: " << result << std::endl;return 0;
}

五、C++ 程序在冯诺依曼架构下的性能优化

编译器优化

使用编译器选项优化代码:

g++ -O2 myprogram.cpp -o myprogram

内存优化

使用数据结构优化内存使用:

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);for (int num : v) {cout << num << endl;}return 0;
}

六、案例分析

案例一:简单的网络服务器程序

考虑一个使用 C++ 编写的简单 TCP 网络服务器程序,以下是一个简化的示例:

#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>
#include <thread>// 处理客户端连接的函数
void handleClient(int clientSocket) {char buffer[1024];while (true) {memset(buffer, 0, sizeof(buffer));int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);if (bytesRead <= 0) {break;}std::string message(buffer);std::cout << "Received from client: " << message << std::endl;std::string response = "Server received: " + message;send(clientSocket, response.c_str(), response.length(), 0);}close(clientSocket);
}int main() {int serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == -1) {std::cerr << "Failed to create socket" << std::endl;return 1;}struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8080);serverAddress.sin_addr.s_addr = INADDR_ANY;if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) {std::cerr << "Failed to bind socket" << std::endl;close(serverSocket);return 1;}if (listen(serverSocket, 5) == -1) {std::cerr << "Failed to listen on socket" << std::endl;close(serverSocket);return 1;}std::cout << "Server is listening on port 8080" << std::endl;while (true) {struct sockaddr_in clientAddress;socklen_t clientAddressLength = sizeof(clientAddress);int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLength);if (clientSocket == -1) {std::cerr << "Failed to accept connection" << std::endl;continue;}std::cout << "Client connected" << std::endl;std::thread clientThread(handleClient, clientSocket);clientThread.detach();}close(serverSocket);return 0;
}
分析
存储程序方面
  • 整个程序的源代码存储在文件系统中,在编译后生成可执行文件,可执行文件存储在存储设备上。当程序启动时,操作系统将其加载到内存中,遵循存储程序的概念。例如,函数handleClientmain函数以及相关的字符串常量和变量,都存储在内存中。
  • 数据如serverSocketclientSocketbuffer等变量也存储在内存中,程序根据需要对其进行操作。7
运算器和控制器
  • 运算器在程序中参与各种计算操作,虽然此服务器程序主要是数据的收发和处理,但在handleClient函数中,strlen函数的调用、字符串拼接等操作涉及运算器的运算。
  • 控制器协调程序的执行顺序,决定了程序流程。例如,在main函数中,程序按顺序执行socket函数创建套接字,bind函数绑定地址,listen函数监听端口,accept函数接受连接,以及recvsend函数处理数据传输。while循环和if条件判断语句控制程序的流程,这些都是控制器在起作用。
  • accept函数接收到新连接时,使用std::thread创建新线程,控制器需要协调线程的创建和执行,将handleClient函数分配到新线程中运行,同时使用detach操作,这涉及到操作系统的线程调度,也是控制器的重要体现。
存储器
  • 内存用于存储程序代码、变量和套接字信息等。动态分配的内存包括为buffer分配的空间,它的大小是 1024 字节。如果有大量的客户端连接,多个handleClient线程同时运行,将需要更多的内存用于存储它们各自的buffer数据。
  • 系统还使用虚拟内存机制,操作系统将根据需要将程序的部分内容从磁盘交换到内存或从内存交换到磁盘,以确保程序的运行。例如,当内存不足时,一些不活跃的线程的数据可能会被交换到磁盘,这涉及到 Linux 系统的内存管理和冯诺依曼架构中的存储器层次结构。
输入输出设备
  • 输入设备:网络套接字接收来自网络的数据,可视为输入设备,这些数据通过网络接口卡进入系统,存储在buffer中。
  • 输出设备:服务器将响应数据通过网络发送出去,通过send函数,数据从内存发送到网络接口卡,然后发送给客户端,这里的网络接口卡可视为输出设备。
性能优化
  • 内存优化:
    • 可以考虑使用内存池技术,对于频繁创建和销毁的buffer,使用内存池可以减少内存分配和释放的开销,提高性能。例如,可以预先分配一定数量的buffer并存储在一个队列中,需要时从队列中获取,使用完后放回队列,避免频繁调用newdeletemallocfree
    • 优化数据结构的使用,比如使用更紧凑的数据结构存储连接信息,避免不必要的内存浪费。
  • 运算器优化
    • 可以对字符串处理进行优化,如使用更高效的字符串操作函数或库,提高字符串处理速度。
    • 减少冗余计算,例如避免在handleClient函数中重复计算response的长度,可以在计算一次后存储结果。

案例二:文件处理程序

以下是一个简单的文件处理程序,它读取文件内容,对数据进行处理,然后将结果写入另一个文件:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>int main() {std::ifstream inputFile("input.txt");std::vector<std::string> lines;std::string line;while (std::getline(inputFile, line)) {lines.push_back(line);}inputFile.close();std::transform(lines.begin(), lines.end(), lines.begin(), [](const std::string& s) {std::string result = s;std::transform(s.begin(), s.end(), result.begin(), ::toupper);return result;});std::ofstream outputFile("output.txt");for (const auto& l : lines) {outputFile << l << std::endl;}outputFile.close();return 0;
}
分析
存储程序方面
  • 程序的代码存储在磁盘上,当运行时,操作系统将其加载到内存中。变量linesline存储在内存中,文件的内容也会存储在内存中(存储在lines向量中)。
运算器和控制器
  • 运算器参与字符串处理操作,在std::transform函数中,对每个字符进行toupper操作,将小写字符转换为大写字符,这涉及字符的 ASCII 码运算。
  • 控制器协调程序的执行,使用while循环读取文件内容,使用std::transform进行数据转换,使用for循环将结果写入文件。
存储器
  • 内存存储程序代码、变量linesline以及文件内容。如果文件很大,可能会占用大量内存,需要考虑内存使用问题。
  • 可能会涉及内存的动态分配,当lines向量存储大量数据时,会动态调整其容量,涉及内存的重新分配。
输入输出设备:
  • 输入设备:文件input.txt作为输入源,通过文件系统和磁盘读取数据。
  • 输出设备:将处理结果写入文件output.txt,通过文件系统和磁盘进行存储。
性能优化
  • 内存优化
    • 可以考虑分批读取文件,避免一次性将大文件的全部内容加载到内存中,减少内存压力。例如,每次读取一定行数的数据,处理完后再读取下一批。
    • 对于lines向量,可以提前预留一定的容量,避免频繁的扩容操作,提高性能。
  • 运算器优化
    • 可以使用多线程或并行算法对文件内容进行处理,提高转换速度,充分利用多核处理器,发挥运算器的并行处理能力。

七、结论

通过对冯诺依曼架构在 C++ 程序中的深入理解,我们可以更好地把握程序的运行机制,从而优化程序性能和资源利用。在 C++ 编程中,尤其是在 Linux 系统下,我们可以看到程序的每个操作都可以在冯诺依曼架构的框架下找到对应的部分。

  • 对于存储程序,我们需要考虑程序和数据的存储和加载过程,确保代码和数据的高效存储和加载,避免不必要的存储开销。
  • 运算器和控制器的操作反映在程序的执行逻辑和计算操作中,合理的程序结构和算法可以提高运算器的效率,控制器的合理调度可以确保程序的正确执行顺序和资源的合理利用。例如,在多线程或多进程程序中,合理的并发控制和同步机制可以让控制器更有效地调度资源。
  • 存储器的使用直接影响程序的性能和可扩展性。合理的内存管理,包括动态内存分配、内存池的使用、内存数据结构的选择等,能够避免内存泄漏、内存溢出等问题,提高程序的稳定性和性能。
  • 输入输出设备的操作体现了程序与外界的交互,在 C++ 中,我们使用不同的 I/O 方式(如文件 I/O、网络 I/O),这些操作涉及到操作系统和硬件的交互,需要考虑如何优化 I/O 操作,提高数据传输效率。

随着计算机技术的发展,虽然现代计算机在很多方面已经对冯诺依曼架构进行了扩展和优化,如多核处理器、缓存层次结构、并行计算等,但冯诺依曼架构的基本原理仍然是我们理解程序运行的基础。对于 C++ 程序员来说,这种理解可以帮助我们在开发程序时更好地利用 Linux 系统的资源,包括处理器、内存和 I/O 设备,设计出更加高效、可靠、可扩展的程序。

未来,随着技术的不断进步,如非冯诺依曼架构的探索(如量子计算、神经形态计算),我们可能会看到新的计算架构,但冯诺依曼架构仍然会在很长一段时间内作为我们开发和理解传统计算机程序的基础。通过理解冯诺依曼架构,我们能够更好地适应这些变化,将新的技术融入到我们的编程实践中,为计算机系统的发展和创新提供有力的支持。

同时,这种对冯诺依曼架构的理解也为我们学习更高级的计算机系统概念,如操作系统、编译器设计、计算机网络等提供了坚实的基础。在 Linux 系统中,我们可以更深入地理解进程管理、内存管理、文件系统和设备驱动等方面的工作原理,进而在 C++ 编程中更加得心应手,从系统层面优化程序,解决复杂的编程问题,开发出高质量的软件应用程序和系统软件。

在 C++ 学习和实践中,不断结合对冯诺依曼架构的理解,将使我们的编程能力更上一层楼,不仅能写出功能正确的程序,还能写出高性能、低资源消耗的程序,更好地服务于各种应用场景,如数据处理、网络服务、嵌入式系统开发等。

八、参考文献

  • 《Computer Systems: A Programmer’s Perspective》
  • Linux man pages
  • C++ Standard Library documentation

通过以上博客,我们可以系统地阐述在 C++ 学习中对 Linux 系统的冯诺依曼架构的理解,帮助读者更好地掌握相关知识,提高编程和系统理解能力。

相关文章:

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠…...

JS:将JS对象格式化为php语法形式(完美支持无unicode编码匹配的正则)

/*** 格式化Object数据为php语法形式* param {*} obj 任意数据* param {String} spaceLen 缩略符长度&#xff1a;必须在2~65536之间&#xff0c;否则默认为2* return {String} 格式化后的PHP语法字符串*/ function formatToPhp(obj, spaceLen) {formatToPhp function (obj, s…...

网络安全 | 零信任架构:重构安全防线的未来趋势

网络安全 | 零信任架构&#xff1a;重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…...

告别手动操作!用Ansible user模块高效管理 Linux账户

在企业运维环境中&#xff0c;服务器的用户管理是一项基础但非常重要的任务。比如&#xff0c;当有新员工加入时&#xff0c;我们需要在多台服务器上为他们创建账户并分配合适的权限。而当员工离职或岗位发生变化时&#xff0c;我们也需要迅速禁用或删除他们的账户&#xff0c;…...

将Windows下的USB设备共享给WSL(ubuntu)

前言 本文用于学习记录&#xff0c;文中提到的方法也来自于网上资料&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 微软官方参考链接&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb 如果没有特殊标注&#xff0c;以下命令均在Windows终…...

lneaught SyntaxError :lnexpected tokenPIaYE(at chunk 5728.bdff1b31.is:1:1)

1.遇到问题&#xff1a; lneaught SyntaxError :lnexpected tokenPIaYE(at chunk 5728.bdff1b31.is:1:1) 当我部署到nginx上之后&#xff0c;第一次测试 没有啥问题当我点击登录之后&#xff0c;然后测试一个删除按钮之后就爆这个错误。 2.原因分析&#xff1a; 我遇到的是缓…...

Vue el-input密码输入框 按住显示密码,松开显示*;阻止浏览器密码回填,自写密码输入框;校验输入非汉字内容;文本框聚焦到内容末尾;

输入框功能集合 <template><div style"padding: 10px"><!-- 密码输入框 --><el-input:type"inputType"v-model"password"placeholder"请输入密码"auto-complete"new-password"id"pwd"style…...

Three.js实现炫酷图片粒子化效果:从聚合到扩散的动态演变

一、效果展示 本特效实现了一个基于图片像素的智能粒子系统&#xff0c;通过Three.js引擎驱动&#xff0c;呈现出以下惊艳效果&#xff1a; 图片粒子化&#xff1a;将任意图片转化为动态粒子系统智能聚合扩散&#xff1a;粒子在聚合状态与随机扩散状态间自然过渡物理运动模拟…...

MySQL中like模糊查询如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中like模糊查询如何优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中like模糊查询如何优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;LIKE模糊查询通常会影…...

为什么使用nohup 和 启动的python脚本,进程还在,但是不处理数据

使用 nohup 和 & 启动 Python 脚本后&#xff0c;进程仍然在运行但不处理数据&#xff0c;可能有几个原因&#xff1a; 1. 脚本内部问题&#xff08;例如死循环、阻塞&#xff09; Python 脚本内部可能存在阻塞操作或死循环&#xff0c;导致进程不执行预期的任务。你可以…...

Android 约束布局ConstraintLayout整体链式打包居中显示

Android 用约束布局ConstraintLayout实现将多个控件视作一个整体居中显示&#xff0c;使用 app:layout_constraintHorizontal_chainStyle"packed"实现 chain 除了链条方向有横向和竖向区分外&#xff0c; chain链条上的模式有 3种 spread - 元素将被展开&#…...

在 MySQL 8 中配置主从同步(主从复制)是一个常见的需求,用于实现数据的冗余备份、读写分离等。

在 MySQL 8 中配置主从同步(主从复制)是一个常见的需求,用于实现数据的冗余备份、读写分离等。以下是详细的配置步骤: 一、环境准备 假设你有两台 MySQL 服务器: 主服务器(Master):IP 地址为 192.168.1.100,端口为 3306从服务器(Slave):IP 地址为 192.168.1.101,…...

4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

文章目录 前言一、Ajax技术&#xff08;从服务端获取数据&#xff0c;发送各种请求&#xff09;0 接口文档管理&#xff1a;使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例&#xff08;几年前的早期用法&#xff09; 二、 Axios技术(对原…...

【自学笔记】Python的基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Python基础知识总览1. Python简介2. 安装与环境配置3. 基本语法3.1 变量与数据类型3.2 控制结构3.3 函数与模块3.4 文件操作 4. 面向对象编程&#xff08;OOP&#…...

lambda表达式写java比较器

文章目录 示例 1&#xff1a;按字符串长度比较示例 2&#xff1a;按数字大小比较示例 3&#xff1a;按对象属性比较&#xff08;简洁&#xff1a;推荐&#xff09;示例 4&#xff1a;使用 Comparator 的静态方法示例 5&#xff1a;链式比较 在Java中&#xff0c;Comparator 是一…...

vim modeline

1. 什么是 Vim 模型行&#xff08;modeline&#xff09;&#xff1f; Vim 模型行是嵌入在文件中的特殊注释行&#xff0c;用于告诉 Vim 编辑器如何配置编辑选项。它的语法格式如下&#xff1a; # vim: 选项1值1:选项2值2:...它以 # vim: 开头&#xff08;# 是注释符&#xff…...

【赵渝强老师】Spark RDD的依赖关系和任务阶段

Spark RDD彼此之间会存在一定的依赖关系。依赖关系有两种不同的类型&#xff1a;窄依赖和宽依赖。 窄依赖&#xff1a;如果父RDD的每一个分区最多只被一个子RDD的分区使用&#xff0c;这样的依赖关系就是窄依赖&#xff1b;宽依赖&#xff1a;如果父RDD的每一个分区被多个子RD…...

前缀和练习——洛谷P8218:求区间和

题目: 这道题很简单&#xff0c;直接根据题目无脑套公式 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 9; using ll long long; ll a[N], perfix[N]; int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步输…...

Python----Python高级(并发编程:线程Thread,多线程,线程间通信,线程同步,线程池)

一、线程Thread 1.1、线程 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位线程是程序执行的最小单位&#xff0c;而进程是操作系统分配资源的最小单位&#xff1b;一个进程由一个或多个线程…...

八大排序算法细讲

目录 排序 概念 运用 常见排序算法 插入排序 直接插入排序 思想&#xff1a; 步骤&#xff08;排升序&#xff09;: 代码部分&#xff1a; 时间复杂度&#xff1a; 希尔排序 思路 步骤 gap的取法 代码部分&#xff1a; 时间复杂度&#xff1a; 选择排序 直接选…...

组合总和III(力扣216)

这道题在回溯的基础上加入了剪枝操作。回溯方面我就不过多赘述&#xff0c;与组合(力扣77)-CSDN博客 大差不差&#xff0c;主要讲解一下剪枝(下面的代码也有回溯操作的详细注释)。我们可以发现&#xff0c;如果我们递归到后面&#xff0c;可能集合过小&#xff0c;无法满足题目…...

鲜牛奶订购系统的设计与实现

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 基…...

python:内置函数与高阶函数

1.内置函数 abs() round() print(abs(-6))#求绝对值 print(round(3.56))#四舍五入运行结果 6 4 2.高阶函数 高阶函数&#xff1a;把一个函数作为参数传递给另外一个函数 实例一&#xff1a;绝对值加减法与四舍五入 def add_num(a,b):return abs(a)abs(b) print(add_num…...

postgresql 函数错误捕捉

BEGIN 逻辑块 EXCEPTION WHEN 错误码&#xff08;如&#xff1a;unique_violation&#xff09; or others THEN 异常逻辑块 END; 在PL/pgSQL函数中&#xff0c;如果没有异常捕获&#xff0c;函数会在发生错误时直接退出&#xff0c;与其相关的事物也会随之回滚。我们可以通过使…...

Java面试场景题分享

假设你在做电商秒杀活动&#xff0c;秒杀开始时&#xff0c;成千上万的用户同时请求抢购商品。你会如何设计系统来处理这些请求&#xff0c;确保库存不超卖 你如何保证库存的准确性&#xff1f; 这个问题引导你思考如何在高并发下确保库存更新的原子性&#xff0c;最直接的方式…...

ESP32开发学习记录---》GPIO

she 2025年2月5日&#xff0c;新年后决定开始充电提升自己&#xff0c;故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了&#xff0c;我就不再赘述&#xff0c;我这里只是对我的学习经历的一些记录。 首先学习一个…...

【PyTorch】解决Boolean value of Tensor with more than one value is ambiguous报错

理解并避免 PyTorch 中的 “Boolean value of Tensor with more than one value is ambiguous” 错误 在深度学习和数据科学领域&#xff0c;PyTorch 是一个强大的工具&#xff0c;它允许我们以直观和灵活的方式处理张量&#xff08;Tensor&#xff09;。然而&#xff0c;即使…...

文件 I/O 和序列化

文件I/O C#提供了多种方式来读写文件&#xff0c;主要通过System.IO命名空间中的类来实现&#xff0c;下方会列一些常用的类型&#xff1a; StreamReader/StreamWriter&#xff1a;用于以字符为单位读取或写入文本文件。 BinaryReader/BinaryWriter&#xff1a;用于以二进制格…...

python中的lambda function(ChatGPT回答)

Python 中的 lambda 函数是一个匿名函数&#xff0c;它没有名字&#xff0c;通常用于定义简单的、一次性使用的函数。它可以接受任意数量的参数&#xff0c;但只能有一个表达式&#xff0c;并且该表达式的结果就是返回值。 lambda 函数的语法是&#xff1a; lambda 参数1, 参…...

智慧停车系统:不同规模停车场的应用差异与YunCitys解决方案

在智慧停车领域&#xff0c;不同规模停车场因自身特点&#xff0c;对智慧停车系统的需求和应用效果存在显著差异。云创智城凭借丰富的经验和先进的技术&#xff0c;为各类规模停车场打造了贴合需求的智慧停车系统&#xff0c;下面为您详细剖析。 小型停车场&#xff1a;精准高…...