扩展Nachos的文件系统
实验任务
尝试多级目录(目录树)的设计与实现方法。
拓展(选做):目前Nachos文件系统仅仅实现了单级目录结构,只有一个根目录。可以尝试采用目录树对文件进行管理。
设计思路
整体思路
在数据结构课设中,实现过带父结点指针的兄弟链表所实现的目录树,但是阅读Nachos代码,发现目录节点是DirectoryEntry并且在一开始初始化目录的时候,是以数组的形式初始化的,这样就不好进行像链表那样的动态新建目录或者文件的操作,也没法像链表一样索引关联节点。但是可以使用模拟指针的思想,以下标作为索引值,来找到某个文件/目录的父目录、左孩子、以及兄弟结点,从而能够遍历整颗树。
按照上面的思路进行编程发现,不需要那么强的拓展功能,所以不采用兄弟链表作为数据结构了,而是采用带模拟指针的多叉树数据结构 来实现目录树和多级目录,并且使用graphviz+dot 可视化目录树。
修改DirectoryEntry
首先修改DirectoryEntry,加入两个模拟指针以及孩子数的记录如下
class DirectoryEntry {
public:
bool inUse; // Is this directory entry in use?
int sector; // Location on disk to find the
// FileHeader for this file
char name[FileNameMaxLen + 1]; // Text name for file, with +1 for
// the trailing '\0'
int parent; // father dir 's index
int Child_Num; // dir's child num
int children[MaxDirChildNUm]; // dir's children
// bool filetype; // 0文件 1目录
};
Directory 的构造函数
在Directory 的构造函数中,设置0目录项是根目录Root,初始化的相关信息。他的父节点为-1,即没有,且children全为-1,即未分配。
Directory::Directory(int size)
{
table = new DirectoryEntry[size];
tableSize = size;
for (int i = 0; i < tableSize; i++){
table[i].inUse = FALSE;
// update
table[i].Child_Num = 0;
table[i].parent = 0;
for(int j = 0; j < MaxDirChildNUm; j ++){
table[i].children[j] = -1;
}
}
// set table[0] as root
table[0].parent = -1;
table[0].inUse = TRUE;
}
Directory::Add
阅读代码发现,在目录中,真正在cp命令时发挥作用的是FindIndex 以及 Add函数,首先修改Add函数
思路:
看文件是否存在
分割路径(因为可能是多级目录路径)
找到要添加的节点的父节点
加入新节点并且更新新节点信息
更新父节点信息
代码
bool
Directory::Add(char *name, int newSector)
{
// My Code
// 1. Judge whether file is alread exists
if (FindIndex(name) != -1)
return FALSE;
// 2. Split the path
string copy_name = name;
// Split it from the last file
// For example: dir1/dir2/dir3/file cut into:
int cutpos = -1;
// Seek Cut Position
for(int i=0;i 0){
// Limit 100 level
char cstrParentName[1000];
strcpy(cstrParentName , ParentDir.c_str());
ParentDirId = FindIndex(cstrParentName);
}
// 4. Add new node in DirTable, and add info into Table Tree
for(int i=1;i
修改FindIndex
修改FindIndex函数使其能够正确根据多级路径查找目录表项
思路
代码
int
Directory::FindIndex(char *name)
{
// origin code
/*
for (int i = 0; i < tableSize; i++)
if (table[i].inUse && !strncmp(table[i].name, name, FileNameMaxLen))
return i;
return -1; // name not in directory
*/
// My updated code
// List();
// 1. Check whether there is dir or file from root
if(table[0].Child_Num <= 0){
printf("No dir or file from root\n");
return -1;
}
// 2. Split the multi path
vector PathTable = SplitPath(name);
// 3. Find the first root dir ForExample : dir1/dir2/dir3/txt
// We need to find dir1 firstly
// to scan
string scandir = PathTable[0];
// index of the first dir
int firstDirIndex = -1;
for(int i = 0; i < table[0].Child_Num; i ++){
int index = table[0].children[i];
// judge inuse
if(!table[index].inUse)
continue;
// judge Name Equal
bool issame = JudgeNameEqual(scandir,index,table);
if(issame){
firstDirIndex = index;
break;
}
}
// check valid
if(firstDirIndex == -1)
return -1;
// 4. From up to bottom scan the Tree and match
// To find final parent dir
// maybe just one dir
if(PathTable.size() == 1)
return firstDirIndex;
// multi dir
// and parent Id is the parent of target file (which means target dir)
int parentId = firstDirIndex;
// scan multi dir to match name
for(int i = 1; i < PathTable.size(); i ++){
// find flag
bool isfind = FALSE;
// scan this level's child to match
for(int j = 0; j < table[parentId].Child_Num; j++){
// In this level, current scan ID
int currentId = table[parentId].children[j];
// check inuse
if(!table[currentId].inUse)
continue;
// check name
bool issame = JudgeNameEqual(PathTable[i],currentId,table);
if(issame){
// we find the next dir
isfind = true;
// record the last dir in parentId
parentId = currentId;
break;
}
}
// Find Failed
if(!isfind)
return -1;
}
printf("Successfully Find: %s",parentId);
// return the parent Dir
return parentId;
}
List
为了展示目录树,修改List代码
思路
从table[0] 即根目录开始向下遍历,迭代输出所有文件和目录的名称
代码
void
Directory::List()
{
// My codes:
// List all the file names in dir
printf("Directory Contents:\n");
printf("/root\n");
// from the root
for(int i=1;i PathTable;
int index = i;
// find the parents
while(table[index].parent != -1){
string tmp = table[index].name;
PathTable.push_back(tmp);
index = table[index].parent;
}
// cout the path
printf("/root");
for(int j = PathTable.size() - 1; j >= 0; j --){
printf( "/");
cout << PathTable[j];
}
printf("\n");
}
}
}
Print
修改Print函数 使-D 指令能够正常执行
思路
从上到下进行层次遍历,名字记录在vector里,然后输出
代码
void
Directory::Print()
{
// My Codes
FileHeader *hdr = new FileHeader;
printf("Directory contents:\n");
for (int i = 0; i < tableSize; i++){
if (table[i].inUse) {
vector PathTable;
int index = i;
// not to root
while(table[index].parent != -1){
string temp = table[index].name;
PathTable.push_back(temp);
index = table[index].parent;
}
printf("Name: /root");
// the next path
for(int j=PathTable.size()-1;j>=0;j--){
printf("/");
cout<FetchFrom(table[i].sector);
hdr->Print();
}
}
printf("\n");
delete hdr;
}
Remove
重写Remove函数,使其能够正常删除多级目录,并且能够递归删除含有文件或者目录的目录
思路
根据多级目录 找到该文件
修改目录表项的InUse信息
更新有关父节点的信息
如果删除的是目录,递归删除该目录所有内容
代码
bool
Directory::Remove(char *name)
{
// MY codes:
int i = FindIndex(name);
// name not in directory
if (i == -1)
return FALSE;
// clean dir table set false
table[i].inUse = FALSE;
// Update parent
int parentId = table[i].parent;
// Until Roor
if(parentId != -1){
// record other child except I
vector tempChild;
for(int j=0;j
递归删除子目录或者子文件DeteleChildren
//---------------------------------------------------------------------
// Directory::DeteleChildren
//
// "name" -- the file name to be removed
//----------------------------------------------------------------------
void
Directory::DeteleChildren(int i){
for(int j = 0; j < table[i].Child_Num; j ++){
int index = table[i].children[j];
if(table[index].inUse){
table[index].inUse = FALSE;
table[index].Child_Num = 0;
DeteleChildren(index);
}
}
}
可视化
(1) 增加 -V 参数 代表visualize Catalog Tree
(2) 在filesys 添加相应成员函数
以及
//---------------------------------------------------------------------
// FileSystem::VisualTree
// Visual CataLog TRee
//---------------------------------------------------------------------
void
FileSystem::VisualTree()
{
Directory *directory = new Directory(NumDirEntries);
directory->FetchFrom(directoryFile);
directory->VisualCataLogTree();
delete directory;
}
(3) 在目录类中加入可视化函数:
思路
使用graphviz + dot 作图
ofstream写出到文件dot代码
通过层次遍历添加dot代码
系统执行进行作图
代码
//--------------------------------------------------------------------
// Directory::VisualCataLogTree
// VisualCataLogTree
//--------------------------------------------------------------------
void Directory::VisualCataLogTree(){
ofstream fout;
fout.open("VisualCataLogTree.dot");
fout<<"strict digraph s{\n";
fout<<"root[shape=record,color=green];\n";
for(int i=0;i PathTable;
while(table[index].parent != -1){
string s = table[index].name;
PathTable.push_back(s);
index = table[index].parent;
}
PathTable.push_back("root");
for(int j=PathTable.size()-1;j>=1;j--)
fout< "<
完成!
测试CataLogTree
修改宏定义
在directory.h
#define MaxDirChildNUm 20 // the number of child that a dir can have
使得最多有20个孩子
在filesys.cc中
#define NumDirEntries 20
使得目录表可以有20项,最多20个文件+目录
测试cp命令
执行如下代码
rm DISK
./nachos -f
./nachos -cp test/small /file1
./nachos -cp test/empty /dir1
./nachos -cp test/empty /dir12
./nachos -cp test/medium /file2
./nachos -cp test/medium /dir1/file21
./nachos -cp test/empty /dir1/dir2
./nachos -cp test/small /dir1/file22
./nachos -cp test/small /dir12/file121
./nachos -cp test/empty /dir12/dir21
./nachos -cp test/small /dir12/file122
测试-l命令
测试-V命令
输出图片
测试-r命令
./nachos -r /dir12
./nachos -r /file2
./nachos -V
结论体会
在目录树的设计中,使用了m叉树,首先肯定是把这个数据结构应用到目录表上的,但是同时不仅仅需要修改目录表类的函数,很多其他函数也会修改,体现了操作系统紧密连接的
实现目录表时,用了一些STL等工具,会方便很多,但是也出现了gcc版本不一致导致的错误,即在untils.h 和 sysdep.cc 里面定义了一些c++的工具时基于C++98和C++11差距较大,会报错,其中一种解决方案是把他们注释掉使用stdlib.h 库
使用多叉树复杂度大致为 O ( l o g m ( n ) ) O(log_m(n)) O ( l o g m ( n ) ) ,比单单一个线性表的目录表的查找更加高效,真实的操作系统应该需要这种高效。
你可能感兴趣的:(课程学习,操作系统,系统架构,数据结构,c++,中间件)
微服务VS单体架构:代购系统如何用“乐高模式”破解百万订单困局?
Joe13265449558
代购系统 跨境电商 自建站 独立站 无货源
微服务架构vs单体架构:代购系统选型指南在跨境电商代购系统年交易规模突破3.2万亿元的背景下,系统架构选型直接决定了企业的扩展能力、运维成本与用户体验。2024年数据显示,采用微服务架构的代购平台故障率较单体架构低41%,但初期开发成本高出27%。本文将从技术原理、适用场景、实战案例三个维度,深度解析两种架构在代购系统中的选型逻辑。一、架构本质:从“巨无霸”到“乐高积木”的演进1.单体架构:一座封
聊聊JVM如何优化
首先应该明确的是JVM调优不是常规手段,JVM的存在本身就是为了减轻开发对于内存管理的负担,当出现性能问题的时候第一时间考虑的是代码逻辑与设计方案,以及是否达到依赖中间件的瓶颈,最后才是针对JVM进行优化。1.JVM内存模型针对JAVA8的模型进行讨论,JVM的内存模型主要分为几个关键区域:堆、方法区、程序计数器、虚拟机栈和本地方法栈。堆内存进一步细分为年轻代、老年代,年轻代按其特性又分为E区,S
ECMAScript 2025(ES15)核心新特性全面解析
neon1204
新技术 ecmascript 前端 开发语言
ECMAScript2025(ES15)核心新特性全面解析本文深入探讨ECMAScript2025(ES15)的最新语言特性一、ES2025核心特性概览ECMAScript2025(通常简称为ES15)作为JavaScript的最新年度标准更新,引入了一些新特性,优化了一些问题。这些改进主要体现在以下方向:模块系统增强:原生JSON模块与延迟加载优化数据结构扩展:不可变数据类型与集合操作增强流程控
【花雕学编程】Arduino FOC 之动态角度输入的五连杆分析
驴友花雕
嵌入式硬件 单片机 c++ 动态角度输入的五连杆分析 Arduino FOC
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Ardui
如何查看编译器提示存在非标准代码?如何知道当前编译器默认C/C++标准是多少?GCC有提供命令查看编译器基本配置吗?编译警告和错误?Clang也兼容MSVC?编译器如何把warning当做error?
目录如何查看编译器提示存在非标准代码?如何知道当前编译器默认C/C++标准是多少?GCC有提供命令查看编译器基本配置吗?编译警告和错误不同语言的编译警告禁用编译警告提示警告或错误编译行号Clang也兼容MSVC?编译器如何把warning当做error?如何查看编译器提示存在非标准代码?GCC提供-pedantic选项可以在发现非标准C/C++代码时,显示警告信息。The-pedanticopti
R语言的游戏开发
柳婉晴
包罗万象 golang 开发语言 后端
R语言在游戏开发中的应用随着科技的发展,游戏行业已经成为一个巨大的市场。虽然通常我们会认为游戏开发主要是使用C++、C#、JavaScript等语言,但实际上,R语言在游戏开发中也有其独特的应用,尤其是在数据分析和可视化方面。本文将探讨R语言在游戏开发中的应用,涵盖它的基础、游戏设计的复杂性、实际案例分析、以及未来的发展方向。一、R语言基础R语言是一种用于统计计算和数据分析的编程语言。它具有强大的
<数据结构>链表实战之单链表与双链表的增删改查
叶落秋白
数据结构与课程设计 c语言 开发语言 链表 visualstudio
✅作者简介:一名即将大三的计科专业学生,为C++,Java奋斗中✨个人主页:叶落秋白的主页系列专栏:数据结构干货分享推荐一款模拟面试、刷题神器进入刷题的世界前言上篇博客分享了创建链表传入二级指针的细节,那么今天就分享几个c语言课程实践设计吧。这些程序设计搞懂了的话相当于链表的基础知识牢牢掌握了,那么再应对复杂的链表类的题也就能慢慢钻研了。学习是一个积累的过程,想要游刃有余就得勤学苦练!目录单链表的
Intel Wi-Fi 驱动程序在macOS上的安装和使用指南
段日诗
IntelWi-Fi驱动程序在macOS上的安装和使用指南项目地址:https://gitcode.com/gh_mirrors/it/itlwm一、项目介绍itlwm,全称IntelWi-FiDriversformacOS,是一个开放源码项目,旨在为苹果操作系统提供对Intel无线网卡的支持。此项目的主要代码来源于OpenBSD并进行了一系列优化以适应macOS环境。它包含了两个主要组件:itl
Fiber是什么?
醉方休
react.js
对React的Fiber架构的理解需要从React的核心目标与面临的挑战说起。它本质上是React16引入的全新协调(Reconciliation)引擎,旨在解决React15及之前版本在处理大型应用和复杂更新时遇到的根本性性能瓶颈和用户体验问题。核心理解:Fiber是什么?虚拟的底层数据结构:Fiber是对React组件、DOM节点或其他UI元素的轻量级、链式表示的JavaScript对象。每个
DM 数据库操作全指南
2301_82150492
数据库
一、DM数据库安装系统要求检查确保操作系统满足DM数据库的要求,例如,对于Linux系统,检查内核版本、内存、磁盘空间等。以CentOS7为例,推荐内存至少1GB,磁盘空间剩余5GB以上。检查是否安装了必要的依赖库,如glibc等。下载DM数据库安装包从达梦官方网站(武汉达梦数据库股份有限公司)下载适合操作系统的DM数据库安装包,如DM8的Linux版安装包。安装步骤以root用户登录系统,进入安
DM 数据库概述
2301_82150492
数据库
目录DM数据库概述安装DM数据库实例配置详解备份与还原策略DM数据库函数运用SQL查询语句实战DMSQL程序设计总结与展望引言达梦数据库(DM)是一款国产的高性能数据库管理系统,具有丰富的功能和良好的兼容性,广泛应用于各类企业级应用场景。它支持多种操作系统,如Windows、Linux等,并提供了完善的数据库管理工具和开发接口。安装DM数据库系统准备在安装DM数据库之前,需要确保目标系统满足一定的
WHAT - React Native 中 Light and Dark mode 深色模式(黑暗模式)机制
文章目录一、Light/DarkMode的原理1.操作系统层2.ReactNative如何获取?3.样式怎么跟着变?二、关键代码示例讲解代码讲解:三、自定义主题四、运行时自动更新五、核心原理一张图组件应用例子最小示例:动态样式按钮的动态样式如何封装一套自定义主题四、如何和ThemeProvider配合?小技巧总结总结一句话这其实是现代移动应用开发中非常常用的功能:自动适配浅色/深色模式(Light
SaaS 的订阅计费模型设计实战指南:按量、按用户、按功能的架构与实现全解析
SaaS的订阅计费模型设计实战指南:按量、按用户、按功能的架构与实现全解析关键词SaaS计费模型、按量计费、用户数计费、功能模块计费、订阅管理、计费系统架构、账单系统、分级定价、后付费、使用量追踪摘要在企业级SaaS系统架构中,计费模型不仅关系到产品商业化路径的可行性,还直接决定了系统架构、数据采集与账务合规的设计逻辑。本文将深入解析三种主流SaaS订阅计费模式:按量计费(Usage-based)
虚拟机与容器技术详解:VM、LXC、LXD与Docker
AnsonNie
笔记 docker 容器 运维
虚拟机与容器技术详解:VM、LXC、LXD与Docker引言虚拟化技术是现代IT基础设施的核心,它通过抽象硬件资源提高利用率并实现环境隔离。目前主流的虚拟化方案可分为两类:虚拟机(VM)和容器技术。虚拟机模拟完整的硬件环境,而容器则共享主机操作系统内核,二者各有优势。本文将详细解析虚拟机、LXC、LXD和Docker的技术原理、差异及2025年最新发展动态,帮助读者理解如何根据场景选择合适的虚拟化
鸿蒙应用多租户为操作系统领域的创新提供动力
操作系统内核探秘
harmonyos 华为 ai
鸿蒙应用多租户为操作系统领域的创新提供动力关键词:鸿蒙操作系统、多租户架构、操作系统创新、资源隔离、安全沙箱、分布式能力、应用生态摘要:本文深入探讨鸿蒙操作系统(HarmonyOS)中多租户架构的创新设计与实现原理。我们将从操作系统基础概念出发,逐步解析多租户如何为鸿蒙带来独特的竞争优势,包括资源隔离机制、安全沙箱技术、分布式能力支持等核心特性。通过实际代码示例和架构图解,展示鸿蒙如何通过多租户设
操作系统NUMA架构下的内存一致性优化
操作系统内核探秘
架构 perl 开发语言 ai
操作系统NUMA架构下的内存一致性优化关键词:NUMA架构、内存一致性、缓存一致性、多核处理器、性能优化、操作系统调度、内存访问延迟摘要:本文深入探讨了NUMA(Non-UniformMemoryAccess)架构下的内存一致性优化问题。我们将从基础概念出发,逐步分析NUMA架构的特点、内存一致性的挑战,以及操作系统层面的优化策略。通过实际代码示例和性能分析,帮助读者理解如何在高性能计算环境中有效
【华为od刷题(C++)】HJ30 字符串合并处理
m0_64866459
华为od c++ 链表
我的代码:#include//用于输入输出流#include//用于字符串处理#include//用于动态数组的处理#include//包含排序等常见算法#include//用于字符串流的处理,可以将数据从字符串流中提取#include//提供字符处理函数,如isdigit、isalpha等#include//提供位集处理,能够将数字转换为二进制表示usingnamespacestd;charbi
用队列实现生产者-消费者模型 —— 详解与代码讲解
百年孤独_
C语言项目 计算机网络 C 操作系统
用队列实现生产者-消费者模型——详解与代码讲解一、引言生产者-消费者问题(Producer-ConsumerProblem)是操作系统、并发编程和数据结构课程中的经典案例。它描述了两个角色:生产者负责生产数据并放入缓冲区,消费者则从缓冲区取出数据进行消费。两者通过一个共享的缓冲区(通常为队列)进行协作,既要保证数据的正确流转,又要避免资源竞争和数据丢失。本篇文章将以循环队列为核心,详细讲解如何用C
挑战华为社招:7年老Java一次坑爹的面试经历
m0_57286571
程序员 java 后端 面试
前言今天刚好有空,跟大家聊聊如何学好算法进大厂。前两天一个读者和我说,他坚持刷算法题2个月,薪资翻番去了他梦寐以求的大厂,期间面字节跳动还遇到了原题…其实据我所知目前国内的大厂和一些独角兽,已经越来越效仿硅谷公司的做法,通过编程定题面试,来考察数据结构和算法的扎实程度。以我的经验来说,**对于新手来说,扎实的掌握一门语言是其一,其二就是要有基本的算法能力,这个非常重要。对于进阶的用户,更多技术栈的
【数据结构】栈
会的全对٩(ˊᗜˋ*)و
数据结构 数据结构 经验分享 栈
要求:熟悉栈的定义,栈的特点以及栈的基本操作。能够根据实际情况选择合适的存储结构,解决实际问题。对任意给定的一个中缀算术表达式输出等价的后缀形式。代码实现:#include#include#includeusingnamespacestd;intprio(charop){//给运算符优先级排序intt;if(op=='*'||op=='/')t=2;if(op=='+'||op=='-')t=1;
STM32的 syscalls.c 和 sysmem.c
is0815
stm32 c语言 嵌入式硬件
syscalls.c是STM32CubeIDE自动生成的标准系统调用适配文件,用于裸机环境下支持newlib标准库(如printf,scanf,malloc)的运行。这份文件提供了标准库运行所需的最小系统调用实现。现在我来逐段解析其作用,并补充你可能需要修改或关注的地方。主要用途该文件让标准C库函数在没有操作系统的STM32环境中可以正常工作。特别是:printf()调用_write()(需要重定
C++ Socket多人聊天室完整源码详解
赵阿萌
本文还有配套的精品资源,点击获取简介:本资源提供了一个使用C++实现的多人聊天室应用程序的源码,涵盖了网络编程的多个关键点。该聊天室利用Socket编程进行网络通信,通过C++的系统级功能实现多客户端处理。本文章将详细解析源码中所涉及的关键技术,包括Socket基础、TCP/IP协议、多线程编程、字节序转换、I/O复用技术、数据序列化与解析、错误处理和日志记录,以及安全性方面的考虑。1.Socke
常见手撕项目C++
氏族归来
c++ 开发语言
常见手撕项目C++设计模式单例模式饿汉模式懒汉模式策略模式策略接口实现具体的策略(虚函数重写)定义上下文用户调用代码最短路径算法使用函数模板写冒泡排序写一个类模板stringreplace详解方法概览参数介绍代码示例多线程信号量解释设计模式单例模式单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。优点:资源控制:单例模式能够确保一个类只有一个实例存
C++语言标准
Shy_tom
C++ c++
title:C++语言标准description:C++标准C++语言的起源 与C语言一样,C++也是在贝尔实验室诞生的,BjarneStroustrup于20世纪80年代在这里开发出了这种语言。用他自己的话来说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的。它的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。C++语言标准 美国国家标准委
CentOS 7正式退役一年,技术团队都在用哪些系统替代?
运维李哥不背锅
Linux基础 centos linux 运维
今天分享一下CentOS7停止支持后该怎么选操作系统。2024年6月,CentOS7正式停止支持,距离今天,已经过去整整一年。前段时间集团下来审计,发现我们还有一部分用centos7,就让我们赶紧整改,所以就写了这篇如何替换CentOS7的参考文章。迁移选择还是挺多的,但是要结合实际情况来选择。本文列举Rocky、Alma、redhat、Ubuntu、openEuler、麒麟V10这几个比较常用的
Jupyter安装指南及Python配置
CodeWG
python jupyter ide Python
Jupyter是一个非常流行的交互式计算环境,广泛用于数据分析、机器学习和科学计算等领域。本文将详细介绍如何安装Jupyter并配置Python环境。步骤1:安装Python首先,我们需要安装Python。请按照以下步骤进行操作:打开Python官方网站(https://www.python.org)并下载适用于您操作系统的最新版本的Python。运行下载的安装程序,并按照向导的指示进行安装。在安
树的分裂操作的性能评估
hi error.cn
经验分享
树的分裂操作的性能评估在计算机科学中,树是一种常用的数据结构,广泛应用于文件系统、数据库索引等场景。树的分裂操作是维护树平衡性和高效性的重要手段之一。本文旨在对树的分裂操作进行详细的性能评估,探讨不同实现方式下的表现和优劣。树的基本概念树是由节点(Node)组成的一种层次结构,其中每个节点包含一个值以及指向其子节点的指针。常见的树类型包括二叉搜索树、B树、红黑树等。分裂操作通常用于处理超过最大节点
超详细yolov8/11-segment实例分割全流程概述:配置环境、数据标注、训练、验证/预测、onnx部署(c++/python)详解
因为yolo的检测/分割/姿态/旋转/分类模型的环境配置、训练、推理预测等命令非常类似,这里不再详细叙述,主要参考**【YOLOv8/11-detect目标检测全流程教程】**,下面有相关链接,这里主要针对数据标注、格式转换、模型部署等不同细节部分;【YOLOv8/11-detect目标检测全流程教程】超详细yolo8/11-detect目标检测全流程概述:配置环境、数据标注、训练、验证/预测、o
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
使用C++/OpenCV和MFCC构建双重认证智能门禁系统引言随着物联网和人工智能技术的发展,智能门禁系统在安防领域的应用越来越广泛。相比于传统的钥匙、门禁卡或密码,生物识别技术(如人脸识别、指纹识别、虹膜识别等)提供了更高的安全性与便利性。然而,单一的生物识别方式在某些场景下可能存在安全隐患。例如,人脸识别可能被高清照片或视频欺骗(称为“欺骗攻击”),在光照、姿态变化剧烈时识别率也可能下降。为了
利用C#开发USB摄像头驱动及图像捕获应用详解
威哥说编程
c# 单片机 开发语言
一、项目背景与挑战USB摄像头在工业、安防、视频会议等领域应用广泛。通过C#开发USB摄像头驱动及图像捕获应用,能够灵活地控制设备,实现定制化功能。但由于硬件驱动开发复杂且受限于操作系统,C#开发USB摄像头驱动面临以下挑战:Windows不支持用C#编写内核驱动,需结合WinUSB或现有驱动USB设备通讯协议复杂,多为厂商定制高性能实时图像采集要求较高本文重点讲述:如何基于WinUSB与C#实现
用MiddleGenIDE工具生成hibernate的POJO(根据数据表生成POJO类)
AdyZhang
POJO eclipse Hibernate MiddleGenIDE
推荐:MiddlegenIDE插件, 是一个Eclipse 插件. 用它可以直接连接到数据库, 根据表按照一定的HIBERNATE规则作出BEAN和对应的XML ,用完后你可以手动删除它加载的JAR包和XML文件! 今天开始试着使用
.9.png
Cb123456
android
“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png
智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。
我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边
算法的效率
天子之骄
算法效率 复杂度 最坏情况运行时间 大O阶 平均情况运行时间
算法的效率
效率是速度和空间消耗的度量。集中考虑程序的速度,也称运行时间或执行时间,用复杂度的阶(O)这一标准来衡量。空间的消耗或需求也可以用大O表示,而且它总是小于或等于时间需求。
以下是我的学习笔记:
1.求值与霍纳法则,即为秦九韶公式。
2.测定运行时间的最可靠方法是计数对运行时间有贡献的基本操作的执行次数。运行时间与这个计数成正比。
java数据结构
何必如此
java 数据结构
Java 数据结构
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:
枚举(Enumeration)
位集合(BitSet)
向量(Vector)
栈(Stack)
字典(Dictionary)
哈希表(Hashtable)
属性(Properties)
以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collect
MybatisHelloWorld
3213213333332132
//测试入口TestMyBatis
package com.base.helloworld.test;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibat
Java|urlrewrite|URL重写|多个参数
7454103
java xml Web 工作
个人工作经验! 如有不当之处,敬请指点
1.0 web -info 目录下建立 urlrewrite.xml 文件 类似如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE u
达梦数据库+ibatis
darkranger
sql mysql ibatis SQL Server
--插入数据方面
如果您需要数据库自增...
那么在插入的时候不需要指定自增列.
如果想自己指定ID列的值, 那么要设置
set identity_insert 数据库名.模式名.表名;
----然后插入数据;
example:
create table zhabei.test(
id bigint identity(1,1) primary key,
nam
XML 解析 四种方式
aijuans
android
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object
spring中配置文件占位符的使用
avords
1.类
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.o
前端工程化-公共模块的依赖和常用的工作流
bee1314
webpack
题记: 一个人的项目,还有工程化的问题嘛? 我们在推进模块化和组件化的过程中,肯定会不断的沉淀出我们项目的模块和组件。对于这些沉淀出的模块和组件怎么管理?另外怎么依赖也是个问题? 你真的想这样嘛? var BreadCrumb = require(‘../../../../uikit/breadcrumb’); //真心ugly。
上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?
bijian1013
项目管理 沟通 IT职业规划
问题:上司说「看你每天准时下班就知道你工作量不饱和」,如何回应
正常下班时间6点,只要是6点半前下班的,上司都认为没有加班。
Eno-Bea回答,注重感受,不一定是别人的
虽然我不知道你具体从事什么工作与职业,但是我大概猜测,你是从事一项不太容易出现阶段性成果的工作
TortoiseSVN,过滤文件
征客丶
SVN
环境:
TortoiseSVN 1.8
配置:
在文件夹空白处右键
选择 TortoiseSVN -> Settings
在 Global ignote pattern 中添加要过滤的文件:
多类型用英文空格分开
*name : 过滤所有名称为 name 的文件或文件夹
*.name : 过滤所有后缀为 name 的文件或文件夹
--------
【Flume二】HDFS sink细说
bit1129
Flume
1. Flume配置
a1.sources=r1
a1.channels=c1
a1.sinks=k1
###Flume负责启动44444端口
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
a1.sources.r1.chan
The Eight Myths of Erlang Performance
bookjovi
erlang
erlang有一篇guide很有意思: http://www.erlang.org/doc/efficiency_guide
里面有个The Eight Myths of Erlang Performance: http://www.erlang.org/doc/efficiency_guide/myths.html
Myth: Funs are sl
java多线程网络传输文件(非同步)-2008-08-17
ljy325
java 多线程 socket
利用 Socket 套接字进行面向连接通信的编程。客户端读取本地文件并发送;服务器接收文件并保存到本地文件系统中。
使用说明:请将TransferClient, TransferServer, TempFile三个类编译,他们的类包是FileServer.
客户端:
修改TransferClient: serPort, serIP, filePath, blockNum,的值来符合您机器的系
读《研磨设计模式》-代码笔记-模板方法模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
配置心得
chenyu19891124
配置
时间就这样不知不觉的走过了一个春夏秋冬,转眼间来公司已经一年了,感觉时间过的很快,时间老人总是这样不停走,从来没停歇过。
作为一名新手的配置管理员,刚开始真的是对配置管理是一点不懂,就只听说咱们公司配置主要是负责升级,而具体该怎么做却一点都不了解。经过老员工的一点点讲解,慢慢的对配置有了初步了解,对自己所在的岗位也慢慢的了解。
做了一年的配置管理给自总结下:
1.改变
从一个以前对配置毫无
对“带条件选择的并行汇聚路由问题”的再思考
comsci
算法 工作 软件测试 嵌入式 领域模型
2008年上半年,我在设计并开发基于”JWFD流程系统“的商业化改进型引擎的时候,由于采用了新的嵌入式公式模块而导致出现“带条件选择的并行汇聚路由问题”(请参考2009-02-27博文),当时对这个问题的解决办法是采用基于拓扑结构的处理思想,对汇聚点的实际前驱分支节点通过算法预测出来,然后进行处理,简单的说就是找到造成这个汇聚模型的分支起点,对这个起始分支节点实际走的路径数进行计算,然后把这个实际
Oracle 10g 的clusterware 32位 下载地址
daizj
oracle
Oracle 10g 的clusterware 32位 下载地址
http://pan.baidu.com/share/link?shareid=531580&uk=421021908
http://pan.baidu.com/share/link?shareid=137223&uk=321552738
http://pan.baidu.com/share/l
非常好的介绍:Linux定时执行工具cron
dongwei_6688
linux
Linux经过十多年的发展,很多用户都很了解Linux了,这里介绍一下Linux下cron的理解,和大家讨论讨论。cron是一个Linux 定时执行工具,可以在无需人工干预的情况下运行作业,本文档不讲cron实现原理,主要讲一下Linux定时执行工具cron的具体使用及简单介绍。
新增调度任务推荐使用crontab -e命令添加自定义的任务(编辑的是/var/spool/cron下对应用户的cr
Yii assets目录生成及修改
dcj3sjt126com
yii
assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问。
assets设置对应的方法位置 \framework\web\CAssetManager.php
assets配置方法 在m
mac工作软件推荐
dcj3sjt126com
mac
mac上的Terminal + bash + screen组合现在已经非常好用了,但是还是经不起iterm+zsh+tmux的冲击。在同事的强烈推荐下,趁着升级mac系统的机会,顺便也切换到iterm+zsh+tmux的环境下了。
我为什么要要iterm2
切换过来也是脑袋一热的冲动,我也调查过一些资料,看了下iterm的一些优点:
* 兼容性好,远程服务器 vi 什么的低版本能很好兼
Memcached(三)、封装Memcached和Ehcache
frank1234
memcached ehcache spring ioc
本文对Ehcache和Memcached进行了简单的封装,这样对于客户端程序无需了解ehcache和memcached的差异,仅需要配置缓存的Provider类就可以在二者之间进行切换,Provider实现类通过Spring IoC注入。
cache.xml
<?xml version="1.0" encoding="UTF-8"?>
Remove Duplicates from Sorted List II
hcx2013
remove
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,Given 1->2->3->3->4->4->5,
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
MySQL安装文档
liyong0802
mysql
工作中用到的MySQL可能安装在两种操作系统中,即Windows系统和Linux系统。以Linux系统中情况居多。
安装在Windows系统时与其它Windows应用程序相同按照安装向导一直下一步就即,这里就不具体介绍,本文档只介绍Linux系统下MySQL的安装步骤。
Linux系统下安装MySQL分为三种:RPM包安装、二进制包安装和源码包安装。二
使用VS2010构建HotSpot工程
p2p2500
HotSpot OpenJDK VS2010
1. 下载OpenJDK7的源码:
http://download.java.net/openjdk/jdk7
http://download.java.net/openjdk/
2. 环境配置
▶
Oracle实用功能之分组后列合并
seandeng888
oracle 分组 实用功能 合并
1 实例解析
由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下:
表test 数据如下:
ID,SUBJECTCODE,DIMCODE,VALUE
1&nbs
Java定时任务注解方式实现
tuoni
java spring jvm xml jni
Spring 注解的定时任务,有如下两种方式:
第一种:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http
11大Java开源中文分词器的使用方法和分词效果对比
yangshangchuan
word分词器 ansj分词器 Stanford分词器 FudanNLP分词器 HanLP分词器
本文的目标有两个:
1、学会使用11大Java开源中文分词器
2、对比分析11大Java开源中文分词器的分词效果
本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。
11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:
/**
* 获取文本的所有分词结果, 对比