扩展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++,中间件)
OpenCV CUDA模块设备层-----线性插值函数log()
村北头的码农
OpenCV opencv 人工智能 计算机视觉
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述该函数用于创建线性插值访问器,支持对GPU内存中的图像数据进行双线性插值采样。主要应用于图像缩放、旋转等几何变换中需要亚像素级精度的场景。为输入图像构造一个基于“双线性插值”的访问器对象LinearInterPtrSz,可以在CUDA核函数中按需访问缩放后的像素值
《去哪儿网Redis高并发实战:从问题定位到架构升级》
猕员桃
redis 架构 数据库
去哪儿网Redis高并发实战:从问题定位到架构升级在互联网行业竞争日益激烈的当下,高并发场景下的系统性能优化一直是技术团队面临的重要挑战。对于去哪儿网这类在线旅游平台来说,节假日期间的流量高峰更是对系统架构的严峻考验。本文将深入剖析去哪儿网在五一假期期间,针对Redis高并发问题的实战解决方案,从问题定位、优化策略到架构升级,全方位展现整个优化过程。一、案例背景:五一假期流量峰值挑战1.1业务场景
(LeetCode 面试经典 150 题 ) 238. 除自身以外数组的乘积 (前缀和)
岁忧
LeetCode 面试经典 150 题 LeetCode C++ JAVA Go版本 leetcode 面试 算法 c++ go java
题目:238.除自身以外数组的乘积思路:前缀和,时间复杂度0(n)。先用前缀和预处理出前n的乘计和,然后第二次遍历时,从后往前,同时维护右边的乘计和即可。C++版本:classSolution{public:vectorproductExceptSelf(vector&nums){intn=nums.size();vectorpre(n,1);pre[0]=nums[0];for(inti=1;i
算法训练营|数组总结
慧泽huize
数据结构 算法 leetcode python c++
时间复杂度:算法执行语句的次数空间复杂度:算法在运行过程中临时占存储空间大小数组(C++):存放在连续内存空间的相同类型固定大小的数据的集合,不能删除,只能覆盖列表(Python):数据可以是不同类型,列表长度可变1.二分查找循环不变量原则,清楚区间定义时间复杂度:O(logn)空间复杂度:O(1)2.双指针法快指针找到新数组元素,慢指针指向新数组下标时间复杂度:O(n)空间复杂度:O(1)3.双
Windows Server 2019 安装 Docker 完整指南
z日火
docker windows docker 容器
博主本人使用的是离线安装1.安装前准备系统要求操作系统:WindowsServer2019(或2016/2022)权限:管理员权限的PowerShell网络:可访问互联网(或离线安装包)启用容器功能Install-WindowsFeature-NameContainers如果提示需要重启,但Restart-Computer-Force失败,请手动重启服务器。2.安装Docker方法1:在线安装(推
手把手教程:在 VS2017 32位 Windows 环境下编译 OR-Tools 9.6 并集成到 C++ 项目
A小庞
C++知识 算法 c++ 开发语言 or-tools 算法库
OR-Tools是Google开源的优化算法库,支持路径规划、线性规划、约束编程等多种功能。本文将详细介绍在VisualStudio201732位Windows环境下编译OR-Tools9.6的两种方法:联网自动下载依赖和手动编译依赖项,并提供避坑指南。方法一:联网自动下载依赖(推荐新手)步骤1:克隆OR-Tools仓库gitclonehttps://github.com/google/or-to
Visual Studio 编译错误 LNK2038:MTD 和 MDD 的区别及解决方法
A小庞
C++知识 个人 visual studio windows ide
在使用VisualStudio进行C++项目开发时,我们经常会遇到一些编译错误。其中,LNK2038错误是一个比较常见的链接器错误,通常与运行时库(RuntimeLibrary)的配置不匹配有关。本文将详细介绍MTD和MDD的区别,以及如何解决因运行时库配置不匹配导致的编译错误。一、错误示例以下是一个典型的LNK2038错误示例:从错误信息中可以看出,链接器检测到了运行时库的不匹配项,具体表现为M
stm32毕设 基于单片机的太阳追光系统(源码+硬件+论文)
m0_984093
单片机
文章目录0前言1课题介绍光线追踪的原理系统架构2硬件设计3核心软件设计4实现效果5最后0前言这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是毕业设计基于单片机的太阳追光系统(源码+硬件+论文)学长这里
电子信息毕设 基于单片机的太阳追光系统(源码+硬件+论文)
爱你单片机
单片机 stm32 毕业设计
文章目录0前言1课题介绍光线追踪的原理系统架构2硬件设计3核心软件设计4实现效果5最后0前言这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是毕业设计基于单片机的太阳追光系统(源码+硬件+论文)学长这里
毕设开源 基于单片机的太阳追光系统(源码+硬件+论文)
Mdc_stdio
单片机 stm32 毕业设计
文章目录0前言1课题介绍光线追踪的原理系统架构2硬件设计3核心软件设计4实现效果5最后0前言这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是毕业设计基于单片机的太阳追光系统(源码+硬件+论文)学长这里
韶音科技嵌入式面试题及参考答案
大模型大数据攻城狮
科技 单片机 嵌入式硬件 八股文面试 牛客网 大厂面试 C++11
Bootloader的启动流程是什么?Bootloader是在操作系统内核运行之前运行的一段小程序。它的启动流程主要分为以下几个阶段。首先是硬件初始化阶段。这个阶段会对处理器以及一些关键的硬件设备进行初始化。比如,会配置处理器的工作模式、设置堆栈指针等。以ARM处理器为例,会设置处理器进入SVC(管理)模式,这是因为在这个模式下能够访问系统的所有资源,方便后续对硬件进行初始化。还会初始化一些基本的
C++正则表达式语法
Coding小公仔
c/c++ c++ 正则表达式 开发语言
在C++中,正则表达式是处理文本模式匹配和字符串操作的强大工具。C++11及以后的标准库提供了头文件,支持正则表达式的使用。下面是C++正则表达式的核心语法规则和用法:一、基本正则表达式语法1.普通字符直接匹配自身,例如:a匹配字符a。2.元字符(需转义)具有特殊含义的字符,需用反斜杠\转义(在C++字符串中需用双反斜杠\\)。.:匹配除换行符外的任意字符。^:匹配字符串的开头。$:匹配字符串的结
Next.js漏洞风暴:CVE-2025-29927全网爆发,你的项目躺枪了吗?
前端菜鸡日常
服务端渲染 javascript 开发语言 后端 node.js
Next.js中间件鉴权绕过漏洞(CVE-2025-29927)全面解析与应急指南近日,Next.js框架曝出一个高危安全漏洞CVE-2025-29927,该漏洞允许攻击者通过构造特殊HTTP请求头绕过中间件的安全控制,可能导致未授权访问、数据泄露等严重后果。本文将全面剖析该漏洞的技术细节、影响范围、检测方法及修复方案,帮助开发者快速评估风险并采取应对措施。漏洞概述与技术原理CVE-2025-29
常见的会话劫持攻击是指什么?
wanhengidc
安全 网络 web安全
会话劫持攻击是一种常见的网络安全攻击,恶意攻击者通过窃取用户的会话标识符号来接管用户的会话,当攻击者或者有效的会话标识符,那么就可以借取正常用户的数据信息,来访问目标用户的账号,并进行各种操作,来修改或者盗取重要的数据信息,以此来给用户造成巨大的经济损失。所以企业对于会话劫持攻击,可以选择定期更新和修补系统漏洞来保护用户的数据安全,及时更新操作系统、应用程序和安全组件,以此来修复已知的服务器安全漏
什么是 QueryGPT?智能查询工具如何重塑信息检索的未来?
镜舟科技
StarRocks QueryGPT 数据查询 数据分析 多模态交互
从客户行为数据到供应链信息,从市场趋势到内部运营指标,这些数据蕴含着巨大的商业价值。然而,数据量的激增也带来了前所未有的检索挑战:如何在海量信息中快速定位所需数据?如何确保查询结果的准确性和时效性?据统计,75%的企业正受困于低效的查询工具,这已成为阻碍企业数字化转型的关键痛点。传统的数据查询方式主要依赖SQL语句或特定的查询语言,这要求用户具备专业的编程知识和对数据结构的深入理解。即使对于数据分
【C++】简单学——类和对象(下)
CtrlZ小牛码
C++简单学 c++ 开发语言
初始化列表前提:对象实例化,成员变量就整体定义了,那么成员变量是在哪里单体定义初始化的?构造函数处吗?概念概念:初始化列表是每个的成员定义初始化的位置位置:在构造函数底下结构::代表开始,代表分点classDate{public:////初始化列表Date(intyear,intmonth,intday):_year(year),_month(month),_day(day){}}语法一个成员变量
【C++】简单学——类和对象(中)
CtrlZ小牛码
C++简单学 c++ 开发语言
六个默认成员函数共性你如果没有写这六个成员函数,编译器就会自动帮你写编译器会自动调用构造函数析构函数拷贝构造函数赋值运算符重载取地址运算符重载被const修饰的取地址运算符重载构造函数作用帮助你初始化以前的初始化的问题:总是会忘记初始化,然后用着用着就崩了使用的位置:对象实例化的时候这几个词要区分开来默认成员函数:类里“隐藏”的6个特殊函数(包括构造函数、析构函数、拷贝构造等),不写时编译器自动生
ArkTS与仓颉语言的深度解析(鸿蒙操作系统多设备)
爱学习的小齐哥哥
仓颉 华为 仓颉 HarmonyOS5
一、引言随着物联网和智能设备的飞速发展,多设备协同开发成为当前软件开发领域的重要课题。鸿蒙操作系统作为面向全场景的分布式操作系统,为开发者提供了ArkTS和仓颉语言两种强大的开发工具,助力实现高效的多设备应用开发。本文将全面剖析这两种语言在鸿蒙多设备开发中的应用,探讨其优势、开发环境、实现一次开发多端部署的方法以及在不同设备上的性能表现和适配策略,并结合智能驾驶应用场景进行实例分析。二、ArkTS
C++程序实现阻止屏保、阻止系统自动关闭屏幕、阻止系统待机(附源码)
dvlinker
C/C++实战专栏 阻止屏保 阻止系统自动关闭屏幕 阻止系统待机 API Monitor
目录1、概述2、设置屏幕保护程序,修改自动关闭显示器和待机的时间2.1、设置屏保程序2.2、修改自动关闭显示器和待机的时间3、通过屏保的通知消息来阻止屏保4、调用API函数SystemParametersInfo关闭/启用屏保,但存在问题4.1、初步确定处理策略4.2、启动监控进程去监控主进程4.3、系统强行关机的情况无法处理5、使用APIMonitor监测到目标程序对API的调用,找到了问题的突
[Python] 使用 dataclass 简化数据结构:定义、功能与实战
踏雪无痕老爷子
Python python 开发语言
在经典面向对象编程中,为了保存和操作数据往往需要定义多个类,手写__init__()、__repr__()、__eq__()等方法。Python3.7引入了@dataclass装饰器,它能自动生成这些常见方法,大幅减少样板代码。本文将介绍dataclass的定义与参数、比较与普通类的差别、实战示例,以及常见注意事项。一、什么是dataclass@dataclass是一种类装饰器,它通过类成员的类型
算法竞赛备考冲刺必刷题(C++) | 洛谷 P8814 解密
热爱编程的通信人
算法 c++ 开发语言
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏:算法题解:C++与Python实现!附上汇总贴:算法竞赛备考冲刺必刷题(C++)|汇总【题目来源】洛谷:P8814[CSP-J2022]解密-洛
Linux I/O 文件操作详解:从系统调用到实际工程应用
平凡灵感码头
linux学习 linux 运维 服务器
一、写在前面在Linux或任何类Unix操作系统中,文件是一切的核心——无论是硬盘上的文本文件,还是串口设备、GPIO寄存器、甚至网络接口,几乎都被抽象为“文件”。理解Linux下的I/O文件操作机制,不仅是嵌入式开发的基础,也是进行系统编程与底层控制的关键。二、I/O的本质:一切皆文件Linux将外设抽象成文件的方式,统一了对各种资源的操作模型。你可以用open打开串口设备/dev/ttyS0,
【C++】atoi和std::stoi
bluebonnet27
编程语言 # C++ c++ 算法 开发语言
两个将字符串转为int的方法atoi(C语言)atoi是C库中的一个函数,它定义在头文件里。其作用是把一个字符串转换为对应的整数。/*Convertastringtoaninteger.*/externintatoi(constchar*__nptr)__THROW__attribute_pure____nonnull((1))__wur;转换的原则如下:此函数接收一个以空字符'\0'结尾的字符串
Memfault 简介及在Nordic nRF91 系列 DK的应用
1:Memfault是一个云平台,它允许您和您的团队持续监控设备、调试固件问题,并将OTA更新部署到您的设备群,从而以软件的速度交付硬件产品。Memfault以嵌入式优先:支持运行在任何实时操作系统(RTOS)或Android、Linux等操作系统上的嵌入式系统和设备它适用于任何设备:从功能强大的SoC一直到功能受限的MCU,Memfault都能适配您设备的可用闪存、RAM和带宽我们的SDK是专为
008 【入门】算法和数据结构简介
要天天开心啊
算法专栏 算法 数据结构
算法与数据结构系统概览|[算法]-[基础]-[通用]一、算法分类与应用1.硬计算类算法|[算法]-[中级]-[通用]特点应用场景复杂度特征-精确求解问题-可能带来较高计算复杂度-大厂笔试/面试-ACM竞赛-所有程序员岗位必考⏱️通常为O(n)~O(n²)//[示例]快速排序算法-分治思想核心实现publicvoidquickSort(int[]arr,intleft,intright){if(le
Linux操作系统,故障排查
月堂
linux 运维 服务器
案例1:GRUB引导故障故障现象:系统启动卡在"GRUB>"提示符,无法进入系统原因分析:GRUB配置文件损坏(/boot/grub/grub.cfg)引导文件被误删或磁盘损坏解决步骤:在GRUB命令行依次执行:insmodxfssetroot=(hd0,msdos1)linux/vmlinuz-root=/dev/sda1initrd/initramfs-.imgboot进入系统后执行:grub
单双链表及其反转
醇醛酸醚酮酯
开发语言
一,空指针的补充1.空指针的定义在C语言中,空指针通常被定义为NULL,或者在C++中为nullptr。它的本质是一个指针,指向无效的地址,用来表示一个指针当前没有指向有效的内存空间。空指针并不指向实际的内存地址,因此可以用于表示指针没有被初始化或者没有指向任何有效的对象。例如:int*ptr=NULL;//ptr是一个空指针在许多编译器中,空指针通常会被定义为0,或者一个特定的常量值(例如0x0
009 【入门】单双链表及其反转-堆栈诠释
要天天开心啊
算法专栏 算法 链表
链表与堆栈系统详解|[数据结构]-[中级]-[通用]一、基础概念与内存模型1.按值传递vs按引用传递|[Java]-[基础]-[内存]//[典型错误示例]-Java中的引用传递陷阱voidmodify(Nodenode){node=node.next;//[警告]错误!仅修改局部引用的指向,不影响原始链表}//[正确做法]-通过引用修改对象内部状态voidrealModify(Nodenode){
基于摩尔线程 S80 显卡在 Ubuntu 系统下双卡交火部署 DeepSeek
流量留
Deepseek 人工智能
以下是基于摩尔线程S80显卡在Ubuntu系统下双卡交火部署DeepSeek的详细教程:###一、环境准备1.**操作系统**:推荐使用Ubuntu22.04。2.**显卡驱动**:-访问摩尔线程官网,登录账号后进入产品页面,找到软件部分下载MUSASDK。-安装显卡驱动,确保驱动版本与MUSASDK兼容。3.**安装Ollama**:-官方推荐使用命令安装Ollama,但下载速度可能较慢,可前往
Ansible——lookup,过滤器
凤凰战士芭比Q
Ansible ansible linux
文章目录Ansible——lookup,过滤器lookup读取文件lookup生成随机密码lookup读取环境变量lookup读取Linux命令的执行结果lookup读取template变量替换后的文件lookup读取配置文件lookup读取DNS解析的值过滤器过滤器使用的位置过滤器对普通变量的操作过滤器对文件路径的操作过滤器对字符串变量的操作过滤器对JSON的操作过滤器对数据结构的操作过滤器的链
用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开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:
/**
* 获取文本的所有分词结果, 对比