Linux操作系统学习笔记(四)系统调用

前言  通过前面几篇文章,我们分析了从按下电源键到内核启动、完成初始化的整个过程。在后面的文章中我们将分别深入剖析Linux内核各个重要部分的源码。考虑到后面的部分我们会从用户态的代码开始入手一步一步深入,因此在分析这些之前,我们需要仔细看一看如何实现一个从用户态到内核态再回到用户态的系统调用的全过程,即系统调用的实现。  本文的说明顺序如下首先从一个简单的例子开始分析glibc中对应的调用针对32位和64位中调用的结构不同会分开两部分单独介绍,会介绍整个调用至完成的过程。即用户态->内核
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

10.RDB持久化

RDB文件的创建与载入SAVE指令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求BGSAVE命令会派生出一个子进程,由它负责创建RDB文件,服务器进程(父进程)继续处理命令请求。def SAVE(): #创建RDB文件 rdbSave() def BGSAVE(): # 创建子进程 pid=fork() if pid == 0: # 子进程负责创建RDB文件 rdbSave() # 完成之后向父进程发送信号 s
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(二十六)187 - 192题

重复的DNA序列编写一个函数来查找 DNA 分子中所有出现超过一次的 10 个字母长的序列(子串)。class Solution {public: vector<string> findRepeatedDnaSequences(string s) { //对应二进制00, 01, 10, 11.那么10个组合只要20位就够了。 unordered_map<char, int> m{{'A', 0}, {'C', 1}, {'G', 2.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(二十七)193 - 199题

有效电话号码给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)你也可以假设每行前后没有多余的空格字符。正则表达式的重点有三:特殊字符、限定字符、定位符表达 (xxx) xxx-xxxx^\([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9].
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(五)进程的核心——task_truct

一. 前言  在前文中,我们分析了内核启动的整个过程以及系统调用的过程,从本文开始我们会介绍Linux系统各个重要的组成部分。这一切就从进程和线程开始,在 Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 task_struct 进行管理。这个结构非常复杂,本文将细细分析task_struct结构。主要分析顺序会按照该架构体中的成员变量和函数的作用进行分类,主要包括:任务ID亲缘关系任务状态任务权限运行统计进程调度信号处理内存管理文件
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(二十八)200—206题

岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(六)进程、线程的创建和派生

一. 前言  在前文中,我们分析了内核中进程和线程的统一结构体task_struct,本文将继续分析进程、线程的创建和派生的过程。首先介绍如何将一个程序编辑为执行文件最后成为进程执行,然后会介绍线程的执行,最后会分析如何通过已有的进程、线程实现多进程、多线程。因为进程和线程有诸多相似之处,也有一些不同之处,因此本文会对比进程和线程来加深理解和记忆。二. 进程的创建  以C语言为例,我们在Linux下编写C语言代码,然后通过gcc编译和链接生成可执行文件后直接执行即可完成一个进程的创建和工作。下面将详细
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(七)任务调度

一. 前言  在前文中,我们分析了内核中进程和线程的统一结构体task_struct,并分析进程、线程的创建和派生的过程。在本文中,我们会对任务间调度进行详细剖析,了解其原理和整个执行过程。由此,进程、线程部分的大体框架就算是介绍完了。本节主要分为三个部分:Linux内核中常见的调度策略,调度的基本结构体以及调度发生的整个流程。下面将详细展开说明。二. 调度策略  Linux的调度策略主要分为实时任务和普通任务。实时任务需求尽快返回结果,而普通任务则没有较高的要求。在前文中我们提到了task_str
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(二十九)207—213题

课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?...
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十)214—220题

最短回文串给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。本题可以用马拉车去取最长回文子串,然后反向添加。也可以采用KMP解决class Solution {public: string shortestPalindrome(string s) { int n = s.size(); string rev(s); reverse(rev.begin(), rev.end(.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

LeetCode刷题笔记_142. 环形链表 II

题目出自LeetCode142. 环形链表 II其他题解或源码可以访问: tongji4m3描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node in.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(八)任务空间管理

一. 前言  从本文开始,我们进入内存部分的学习。首先会接着前面的任务task_struct讲解任务空间管理结构体mm_struct,并简单介绍物理内存和虚拟内存的相关知识,关于详细的基础知识和概念可以参照CSAPP一书,这里不会做过多的赘述,而是默认在已了解其映射关系的基础上进行的学习。在后文中,会继续介绍物理内存的管理以及用户态和内核态的内存映射。二. 基本概念梳理CPU、缓存、内存、主存的架构是源于越快的设备越贵,因此出于节约(qiong)考虑设计了多层架构,CPU中有了MMU物理内存有限,
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十一)221—227题

最大正方形在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。理解状态转移方程就可以简单解决 dp(i, j) = min(dp(i − 1, j), dp(i − 1, j − 1), dp(i, j − 1)) + 1class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { if (matrix.size() == .
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十二)228—234题

汇总区间给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。很简单的一道题,遍历一遍即可class Solution {public: vector<string> summaryRanges(vector<int>& nums) { vector<string> ans; for (int i = 0; i < nums.size(); i++) { .
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(九)内存管理之分页

一. 前言  上文分析了内存再用户态的结构体mm_struct及各个区域映射的vm_area_struct以及32位和64位的内核态结构体,本文将基于这些结构来分析Linux的内存管理系统。内存管理系统包括虚拟内存和物理内存的分页以及虚拟内存和物理内存的映射。本文将介绍分页机制,而映射则在下文中说明。本文首先简单介绍SMP和NUMA系统,然后对物理内存的节点、区域、页结构进行分析,在此基础上剖析伙伴系统和Slub Allocator的实现原理,最后介绍页面交换。二. 内存模型  在计算机的发展历程中
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

Linux操作系统学习笔记(十)内存管理之内存映射

一. 前言  本文为内存部分最后一篇,介绍内存映射。内存映射不仅是物理内存和虚拟内存间的映射,也包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。本文首先分析用户态在堆中申请小块内存的brk和申请大块内存的mmap,之后会分析内核态的内存映射机制vmalloc,kmap_atomic,swapper_pg_dir以及内核态缺页异常。二. 用户态内存映射  用户态调用malloc会分配堆内存空间,而实际上则是完成了一
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十三)235—241题

二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。很简单的一道题,递归求解/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十四)242—264题

有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。本题采用哈希表或者排序易解class Solution {public: bool isAnagram(string s, string t) { if(s.size() != t.size()) return false; int hash[26]={0}; //构建哈希数组 for.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

LeetCode刷题笔记_146. LRU缓存机制

题目出自LeetCode146. LRU缓存机制其他题解或源码可以访问: tongji4m3描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0

leetcode解题思路分析(三十四)268—283题

缺失数字给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。挨个异或一遍,没有出现的即是缺失数字class Solution {public: int missingNumber(vector<int>& nums) { int res = nums.size(); for(int i = 0; i < nums.size(); ++i) res = res ^ i ^ nu.
分类: 其他 发布时间: 09-21 12:07 阅读次数: 0