Linux操作系统学习笔记(十一)文件系统

一. 前言  本节开始将分析Linux的文件系统。Linux一切皆文件的思想可谓众所周知,而其文件系统又是字符设备、块设备、管道、进程间通信、网络等等的必备知识,因此其重要性可想而知。本文将先介绍文件系统基础知识,然后介绍最重要的结构体inode以及构建于其上的一层层的文件系统。二. 文件系统基础知识  一切设计均是为了实现需求,因此我们从文件系统需要的基本功能来看看其该如何设计。首先,一个文件系统需要有以下基本要求文件需要让人易于读写,并避免名字冲突等文件需要易于查找、整理归类操作系统需要
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十二)虚拟文件系统

一. 前言  基于上文介绍的文件系统的基本结构,本文将继续深入Linux文件系统的精髓所在:虚拟文件系统。操作文件的本质是将磁盘文件数据映射到进程中,上文的文件系统是如何存储文件数据,而从进程如何映射到该文件系统,中间还有一系列的过程,主要包括进程发出文件操作命令,通过系统调用如sys_open、sys_read、sys_write调用相应内核函数在内核中为进程打开的文件和系统文件创建数据结构进行维护通过虚拟文件系统对各种不同的文件系统操作,如I/O设备、管道、进程间通信、网络等进行抽象并统一接口
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十五)284—290题

顶端迭代器给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 – 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。很无聊的一道题,无非是考一个提前量而已/* * Below is the interface for Iterator, which is already defined for you. * **DO NOT** modify the interface for Iterat.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十六)299 - 305题

猜数字游戏需要遍历两次,优化在于第二次和第一次有关联:哈希表中存储的会包括第一次的class Solution {public: string getHint(string secret, string guess) { int x = 0, y = 0; string ret; unordered_map<char, int> map; for (int i = 0; i < guess.size(); i.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十三)字符设备

一. 前言  上文中我们分析了虚拟文件系统的结构以及常见的文件操作从用户态到虚拟文件系统再到底层实际文件系统的过程。而实际上我们并没有说明实际的文件系统如ext4是如何和磁盘进行交互的,这就是本文和下篇文章的重点:I/O之块设备和字符设备。输入输出设备我们大致可以分为两类:块设备(Block Device)和字符设备(Character Device)。块设备将信息存储在固定大小的块中,每个块都有自己的地址。如硬盘就是常见的块设备。字符设备发送或接收的是字节流,而不用考虑任何块结构,没有办法寻
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十七)307 - 316题

区域和检索-数组可修改很简单的一道题class NumArray { vector<int> m_sum; vector<int> m_nums;public: NumArray(vector<int>& nums) { m_nums = nums; m_sum = nums; if (nums.size() == 0) return;.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十四)块设备

一. 前言  上文我们分析了字符设备,本文接着分析块设备。我们首先分析块设备的基本结构体,然后分析块设备生成、加载的整个过程,最后分析块设备的直接I/O访问和缓存I/O访问。二. 块设备基本结构体  上文中我们分析了字符设备驱动程序的抽象结构体cdev和管理cdev的结构体cdev_map,在块设备中会相对复杂一些,因为涉及到一个概念:伪文件系统bdevfs。在此之下主要有三个结构体:对块设备或设备分区的抽象结构体block_device,对磁盘的通用描述gendisk以及磁盘分区描述hd_struc
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

#第1篇分享:编程语言简介-为什么要选择python

1.编程语言简介
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十八)318 - 327题

最大单词长度乘积给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。为了方便比较,可以采取位操作存储每个单词的bitfield,通过位运算进行互相比较。class Solution {public: int str2int(const string& s) { int res = 0; .
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十五)中断

一. 前言  在前面的文章里,我们多次见到了中断的作用,如任务调度,系统调用从用户态陷入内核,文件系统的读写操作等。本文就Linux的中断机制进行较为全面的剖析。二. 什么是中断  中断通常被定义为改变处理器执行指令的顺序的一个事件,该事件与CPU芯片内外部硬件电路产生的电信号相对应。中断通常分为同步中断和异步中断:同步中断(synchronous):又称异常(exception),在指令执行时由CPU控制单元产生,之所以称之为同步,是因为只有在一条指令终止执行后CPU才会发出中断。异步中断(
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十六)进程间通信之信号

一. 前言  众所周知,System V IPC进程间通信机制体系中有着多种多样的进程间通信方式,如管道和有名管道,消息队列,信号,共享内存和信号量,套接字。从本文开始我们就逐个剖析进程间通信的机制和底层原理,就从信号开始讲起吧。二. 信号基本知识  信号是进程处理紧急情况所用的一种方式,它没有特别复杂的数据结构,就是用一个代号一样的数字。Linux 提供了几十种信号,分别代表不同的意义。我们可以通过kill -l命令查看信号。# kill -l 1) SIGHUP 2) SIGIN
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十七)进程间通信之管道

一. 前言  上文中我们介绍了进程间通信的方法之一:信号,本文将继续介绍另一种进程间通信的方法,即管道。管道是Linux中使用shell经常用到的一个技术,本文将深入剖析管道的实现和运行逻辑。二. 管道简介  在Linux的日常使用中,我们常常会用到管道,如下所示ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9  这里面的竖线|就是一个管道。它会将前一个命令的输出,作为后一个命令的输入。从管道的这个名称可以看出来,管道是一种单向传输数据的
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十九)328 - 334题

奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。从题目要求可看出,把奇结点按原有顺序排到偶结点(保持原有顺序)之前即可。因此,我们只需要 把奇结点 一个一个地保持原有顺序插入到head之后即可/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * .
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(四十)335 - 343 题

路径交叉给定一个含有 n 个正数的数组 x。从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。编写一个 O(1) 空间复杂度的一趟扫描算法,判断你所经过的路径是否相交。本题的关键在于画图分析各种类型会相交的情况,最后总结成解法class Solution {public: bool isSelfCrossing(vector<int>&.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(四十一)344 - 354 题

反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。class Solution {public: void reverseString(vector<char>& s) { for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) { swap(s[i],s[j]); } }};.
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0

#第2篇分享:python开发环境安装-python&pyCharm

#python开发环境安装1.Python 安装:a.百度搜索python官网,第一个网站就是,或者可以点击下方链接:-python官网*python 下载:进入网站后选择Downloads-> Windows*选择python2或者python3:根据需求即可,差别不大*选择合适的版本:根据电脑类型->操作系统类型->操作系统位数web-based: 透过网络安装的,就是执行安装后才透过网络下载pythonexecutable: 可執行文件的,既把要安装的python全
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0

Linux操作系统学习笔记(十八)进程间通信之共享内存和信号量

一. 前言  本文为进程间通信的最后一篇,介绍共享内存和信号量。之所以将二者一起叙述,是因为二者有着密不可分的关系。共享内存会利用虚拟内存和物理内存的映射关系,让不同进程开辟一块虚拟空间映射到相同的物理内存上,从而实现了两个进程对相同区域的读写,即进程间通信。而信号量则实现了互斥锁,可以为共享内存提供数据一致性的保证,因此二者常结合使用。二. 基础知识  共享内存的使用包括调用shmget()创建共享内存调用shmat()映射共享内存至进程虚拟空间调用shmdt()接触映射关系  信号量
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0

Linux操作系统学习笔记(十九)网络通信之套接字

一. 前言  在前面我们逐一分析了进程间通信的各种方法:信号,管道,共享内存和信号量,本文开始将分析更为复杂也是更为常用的另一套进程间通信:网络通信。网络通信和其他进程间通信最大的区别在于不局限于单机,因此成为了互联网时代的主流选择,无论是分布式、云计算、微服务、容器及自动化运营都离不开网络通信,其重要性可想而知。  经过30多年的发展,网络协议栈已经变得极为复杂,远远不是一两篇文章能够说清楚的东西,所以这里着重剖析我们更为关注的东西:网络编程涉及到的相关协议栈。从本文开始,将分别介绍套接字及其创建、网
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0

网络安全知识体系思维导图

B站视频分析归纳:【陈鑫杰】网络安全到底在干啥?搞网络安全就是搞“黑客技术”?聊聊网络安全的知识体系与行业分类
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0

linux grep正则表达式习题解析

反思以及建议: 由于语法的丰富,尽可能的多思考某题的解题方法; 多思考这样的答案还可以应用在什么样的场景里; 写完一道题停顿思考一下 熟读文档‘man grep’ 基础部分1.用多种方式输出/proc/meminfo文件中所有以大写或小写s开头的行提示:忽略大小写;扩展方式不同写法grep -i '^s' /proc/meninfoecho -e "sb\nSb\nsB\nSB" | grep -i '^s'grep -E "^(s|S)" /et
分类: 其他 发布时间: 09-21 12:06 阅读次数: 0