【初探Linux】窥探Read系统调用源码2
系统调用—Read
read源码搜索sys_read:https://elixir.bootlin.com/linux/v6.8.1/source/fs/read_write.c#L627
上一篇已经对read系统调用的源码进行了一定程度的初步解读,那么我又产生了新的疑问:read的具体实现是有多种的,系统应该是会根据不同的文件采取对应的读取方式的,也就是说会调用不同的read具体实现,那么系统具体是如何实现的?于是便有了这篇博客。
// fs/read_write.c// 输入参数:// fd:文件描述符(用户进程打开的文件句柄)// buf:用户空间缓冲区指针(数据将被读取到这里)// count:请求读取的字节数// 输出结果:读取到的字节数SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count){ return ksys_read(fd, buf, count);}ssize_t ksys_read(unsigned int fd, char __user *buf, ...
【初探Linux】窥探Read系统调用源码
系统调用—Read
read简介系统调用read的作用是:从与文件描述符fd相关联的文件中读取 n bytes个字节的数据,并把它放入到数据缓冲区buf中。
概要:
read函数在<unistd.h>头文件中定义。
原型是:ssize_t read(int fd, void *buf, size_t count);
说明:
read()函数尝试从文件描述符fd中读取count个字节到buf开头的缓冲区中。
如果count=0;read返回0,并且没有其他结果,如果count>SSIZE_MAX,结果未指定。
ssize_t:有符号整型,与long类似。typedef long size_t
size_t:无符号的ssize_t,:typedef unsigned long size_t
返回值
调用成功返回读取的字节数,文件指示符指到对应的位置。这个返回值可能会比count,比如以下情况:
当文件的整体字节比count小时,读到文件尾。
我们从管道或者终端读取
我们读取时被一个信号打断了等等情况。
调用失败的时候返回-1;并且errno会被设置,这时候文件的 ...
【初探Linux】文件压缩和打包
文件压缩和打包这里主要看zip和tar
zip适合于需要压缩并打包的场景,特别是在Windows环境下;而tar通常用于Linux/Unix系统中,适合打包大型目录,并且与不同的压缩工具搭配使用。一下是常见的用法:
zip test.zip test #zip 压缩文件名 原文件夹 (只包含文件夹test)zip test.zip test -r #zip 压缩文件名 原文件夹 包含test文件夹中所有文件unzip test.zip -d ziptesttar -cf test.tar test # 压缩文件tar -xf test.tar -C tardir # 解压缩到指定目录(不指定默认当前目录,会覆盖文件)
以下是一个实验,按照要求使用命令完成。
A. 将位于当前用户(shiyanlou)家目录下的03.tar.gz压缩文件中所有的html文件(包括所在目录)解压并解包到当前用户(shiyanlou)家目录下的Desktop目录中。mkdir temptar -xzf ~/03.tar.gz -C ~/tempfind temp -name '*html ...
【初探操作系统】进程管理
理解Linux进程进程概念我对于程序已经有了一定程度的认知——一段指令集合。那么进程又是什么,进程不应该就是一种程序吗?一个经典的例子,把程序比喻成菜谱,记录了做一道菜的过程,那么进程就是动手做出一道菜的过程。可以说,进程就是执行的程序,程序的一次执行。
程序是静态的,进程是动态的实体
进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、文件描述符、环境变量等资源,进程之间相互隔离,互不干扰。
进程具有并发性,也就是说,程序的执行并不一定是顺序的,是并发的,并发能够极大提高了程序的执行效率和资源利用率,于是引入线程的概念。
线程(Thread) 是进程中的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但每个线程有自己的栈和程序计数器。
多线程编程可以提高程序的并发性和响应性,但也需要注意线程安全问题(如竞态条件、死锁等)。
进程状态创建(New):进程正在被创建。
就绪(Ready):进程已准备好运行,等待CPU分配时间片。
运行(Running):进程正在CPU上执行。
阻塞(Blocked):进程等待某些 ...
【初探Linux】系统调用函数开发
Linux内核系统调用开发流程?
省流:
1、kernel/sys.c里实现函数
2、Include/linux/syscalls.h在系统调用表里声明
3、arch/x86/entry/syscalls/syscall_64.tbl里映射:462 ——> sys_get_process_memory_info
4、make clean && make -j$(nproc)编译内核
5、make install && update-grub安装新内核,更新GRUB
获取源码:从Linux官网或Git仓库克隆内核源码。
环境准备:安装编译工具和相关依赖。
配置内核:使用make menuconfig等工具配置内核选项。 *****这一步就是开发过程
编译内核:通过make命令编译内核和模块。
安装内核:使用make install安装内核和make modules_install安装模块。
更新引导程序:更新GRUB配置,确保系统使用新内核。
测试内核:重启并验证新内核是否正 ...
【初探Linux】文件结构及基本操作
Linux文件结构文件组织结构:目录树状结构,FHS(Filesystem Hierarchy Stardard)标准
在Linux系统中,常见的文件夹及其全称如下:/bin - Binary(可执行文件):包含系统启动和日常操作所需的基础命令程序。/boot - Boot(启动文件):包含启动加载程序文件和系统启动所需的内核文件。/dev - Devices(设备文件):存放设备文件,用于与硬件设备交互。/etc - Etcetera(配置文件):存放系统的配置文件和管理脚本。/home - Home(用户目录):包含所有用户的个人文件夹。/lib - Library(库文件):存放共享库文件,支持程序运行。/lost+found - Lost and Found(丢失和找到的文件):用于存放通过文件系统修复过程中恢复的文件。/media - Media(可移动存储设备):挂载可移动存储设备的默认位置,如CD、USB等。/mnt - Mount(挂载点):用于临时挂载文件系统。/opt - Optional(可选程序包):包含额外的应用程序包,一般是第三方软件的安装目录。/proc ...
【代码随想录】二叉树(1)
前言:最近一个学习小组里大家约定每天刷算法题(虽然近期因为题目难度变难变为了两天一道),没想到的是几个组员居然不约而同地说出了代码随想录这个名字,正是“英雄所见略同”,最近已经是刷了有一阵子了,期间虽然偶然有做笔记,又因为这样那样的事情写得断断续续很零碎,实在凑不出一篇博客来,最近写到了二叉树,有了些感悟和时间,正好整理出篇博客来记录。
代码随想录:https://www.programmercarl.com/
二叉树
二叉树的递归遍历递归:在函数的定义中使用函数自身的方法
因为二叉树的左右子树还是二叉树,所以可以使用递归的方法。前中后序遍历时使用递归则可以写出非常简洁优美的代码,并且在前中后切换时也仅仅只需要改变几行代码之间的顺序,代码的结构是保持不变的。
// 前序遍历·递归·LC144_二叉树的前序遍历class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList ...
【数据结构】动态查找表
动态查找表动态查找表,表结构本身是在查找过程中动态生成的,动态更新意味着适合使用指针
二叉排序树二叉排序树:构造的过程就是排序的过程,在无序的关键字序列中,在既有的二叉排序树(一开始的二叉排序树是一个空树)中查询一个个关键字应该所在的位置,往二叉排序树一个个添加,最后只需要对生成的二叉排序树进行中序遍历就可以得到有序的关键字序列了
在实际应用中,平衡二叉树有其弊端——在数据量大的情况下深度太大,因为每当访问一个节点的时候,我们需要进行更多的比较(每层都要比较选择进入哪个子树),不过消耗时间主要不是在内存中元素之间的比较,而是每次进入一个节点时都需要进行磁盘I/O读取,那么为了减少时间消耗,我们现在需要的就是尽量减少树的深度,引入B-树这种数据结构
B-树B-树要尽量减少树的深度,为了达到这个目的,B-树增加了可拥有子节点的上限;还有要提高每个节点的利用率(不要存储太少的元素),设置一个下限,每个节点的子节点(M个)保持在 (m/2)-1(向上取整)<= M <= m 之间,下限取m/2(向上取整)-1是考虑到节点之间的合并操作,低于m/2才能进行合并操作,合并时候 ...
TodoList日志(1)
TodoList设计这是创新实践课程的作业,做一个简单的TodoList应用,借这个机会把整个业务开发的流程熟悉一遍。
需求分析功能调研TODO 应用通常是一个帮助用户管理日常任务的工具,用户可以在其中创建、查看、编辑、删除任务,并通过标记任务状态来追踪进度。常见的功能包括:
创建任务:允许用户输入任务标题、描述、优先级、截止日期等信息。
查看任务:展示所有任务,并按状态(如已完成、未完成)进行过滤。
编辑任务:让用户修改任务的内容、截止日期等。
删除任务:删除已不再需要的任务。
标记任务完成/未完成:允许用户标记任务的完成状态,帮助跟踪进度。
此外,一些TODO应用还可能包括任务提醒、优先级设置、任务分类、搜索功能等扩展功能。
核心功能
这些是项目的基本功能,优先实现基本功能,扩展功能之后再说。
创建任务:用户可以添加新的任务,任务包含标题、描述和截止日期(可选)。任务可以标记为已完成或未完成。
输入框:任务标题、任务描述、截止日期。
按钮:保存、取消。
查看任务:用户可以查看所有任务,并过滤选项:全部任务、未完成任务、已完成任务。。
列表展示:任务标题、描述、状 ...
【青训营X豆包MarsCode】第六课-走进消息队列
走进消息队列消息队列前世今生在现代分布式系统中,消息队列(Message Queue,简称 MQ)已成为一种不可或缺的中间件,用于解耦系统组件、提高系统可靠性与扩展性。消息队列的出现和发展,与以下几个系统问题密切相关:
系统崩溃:
在高并发系统中,直接处理请求可能导致系统崩溃。通过将请求先放入消息队列,系统可以避免瞬时过载,确保稳定运行,等待后端存储服务逐步处理这些请求。
服务处理能力有限:
当系统的处理能力达到瓶颈时,前端请求会迅速堆积,造成系统崩溃。此时可以将请求放入消息队列,按需逐步消费,避免一瞬间的请求涌入导致服务过载。
链路耗时长尾:
在一些分布式系统中,某些链路的处理时间可能会较长,导致长尾效应。通过异步方式将请求投递到消息队列中,避免长时间等待影响系统整体性能。
日志存储:
在分布式系统中,日志的存储与分析是关键环节。将日志数据发送到消息队列后,后端日志分析平台可以异步获取数据,进行实时或定期分析。
什么是消息队列?
消息队列(MQ)是一个用于存储和传输消息的容器,其本质上是一个先进先出(FIFO)的队列。在分布式系统中,消息队列通常具有以下特点:
高吞 ...