自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 【INT的内核笔记】tcp接收端相关实现

1. file_operations在epoll_ctl(add)中有这样的调用链:主要涉及了file->f_op和private_data中的socket结构tfile->f_op->poll(tfile, &epq.pt) |->sock_poll |->sock->ops->poll |->tcp_poll(应该也是类似sk->sk_prot->recvmsg??

2021-03-08 11:30:32 390

原创 【INT的内核笔记】Linux信号递达过程详解

1. 什么时候执行信号处理一般在从中断或系统调用返回到用户态前,会执行一段逻辑检查TIF_SIGPENDING位,如果被置位了的话则会经由:–> do_notify_resume --> do_signal,进入到do_signal执行信号处理。中断/系统调用返回的大致情况,可以参考下图:中断返回用户态的相关代码:/** *返回用户空间,只需要检查need_resched * *可能从中断返回,也可能从系统调用返回。 */ENTRY(resume_userspace) #

2020-11-25 15:10:15 545 1

转载 【内核资料】stackoverflow上关于内核为何偏爱kmalloc(),而很少用vmalloc()的讨论

1. 问题What is the difference between vmalloc and kmalloc?2. 大致观点涉及到DMA的话,需要物理上连续的内存;内核之所以偏好分配物理上连续内存,并不是必须的,而主要是考虑性能:kmalloc()和vmalloc()效率高;kmalloc()对TLB更友好;内核的页面不会被swapped,而是常驻内存中,无论kmalloc()分配还是vmalloc()分配;...

2020-07-14 16:00:50 253

原创 【INT的内核笔记】Linux内核内存空间布局研究

1.Linux内核映射从上面的页表设置可以看出:内核对内核虚拟地址和物理地址之间的转换,是会有需求的。很容易可以想到最简单的解决方法:将内核虚拟空间地址,和实际物理空间逐一对应进行线性映射。在很早期的时候,确实就是这样做的。但是在32位时代,内核的虚拟空间只有1G,也就是说全部都进行线性映射的话,内核只能使用1G物理内存,但是我们也知道就是32位时代,其实物理内存很多也不止4G了,而且CPU后面也相应支持。但是,虚拟地址空间还是只有4G,内核还是只有1G,如果还是进行直接线性映射的

2020-07-11 21:38:34 539

转载 转stackoverflow一个问题,关于内核是如何管理页表(pgd,pud,pmd,pte)本身所占的内存

碎碎念我今天莫名开始纠结起,关于linux页表方面的问题。然后就想到,【页表本身也是要占有一部分内存的,所以内核又是如何管理页表本身所占有的这部分内存的呢?】找了很久,没太满意的答案。甚至都没有具体方向,所以也不太有希望从源码中找到答案。暂时就以在stackoverflow上找到的这个提问,作为这次疑惑的收尾吧,可能要很久很久之后才能得到圆满的解答了。回复的大致意思是:【根据linux内核相关wiki,页表就是常驻在内存中的,不会换出。】也不知道实际是如何的,还是希望有从动态层面上研究过内核的

2020-07-09 01:24:56 587

原创 【INT的内核笔记】梳理sleep_avg,prio,activated,timestamp,last_ran等重要调度变量

1. sleep_avg1.1 sleep_avg简介sleep_avg处在task_struct数据结构中,sleep其实和平均没有什么关系,是一个睡眠时间评估值,命名可能有历史原因。直接关系到进程动态优先级prio的计算:动态优先级prio = 静态优先级static_prio - CURRENT_BONUS(p) + 5CURRENT_BONUS(p)和p->sleep_avg是正相关的,prio越小越好,因此:sleep_avg越大,调用effective_prio(p)重新计算

2020-07-02 08:58:11 550

原创 【INT的内核笔记】调度时机与抢占

1. 调度时机调度时机一般可以分成两类:主动调度和强制调度。1.1 主动调度在形式上一般是这样的:内核在等待资源的时候,将当前进程移到等待队列,并主动调用schedule()放弃CPU;主动调度的例子:read()系统调用,会调用到wait_on_sync_kiocb(),其中有这么一段 while (iocb->ki_users) { set_current_state(TASK_UNINTERRUPTIBLE); if (!iocb->ki_users)

2020-07-01 16:26:15 485

原创 【INT的内核笔记】scheduler_tick()源码分析

1. 调用时机一般会在时钟中断时被调用,作用有:剥夺时间片耗完的进程的CPU使用权,当然具体细节上没这么简单;进行定时的CPU间负载均衡处理;2. 大致流程idle进程(swapper进程)的处理。idle进程没有时间片可言,主要思路是如果当前逻辑CPU的可执行队里已有进程,应该尽快调度。这里所指的调度还是延时调度,也就是设置TIF_NEED_RESCHED,还会有些强制调度之类的处理,细节暂未研究;实时进程的处理。在这版本的源码中,没有调度类的概念,实时进程和普通进程是放在

2020-06-30 22:40:33 433

转载 【内核资料】小知识点,likely与unlikely

看内核源码看见好几次likely和unlikely了,于是就查了一下具体的意义,之前发现了这篇文章,很短,小小地涨了一下姿势2333。作者:不详,看的那篇文章,作者也是转的别人转自:https://blog.csdn.net/tigerjibo/article/details/8279183###likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?首先明确:if (likely(value)) //等价于if (value)if (likel

2020-06-27 15:09:59 224

原创 【INT的内核笔记】关于pthread_cond_wait()虚假唤醒,在不同unix系内核的实验结果

1.博主的实验这两天把ULK的信号机制和相应的内核源码大致看了一遍,了解到pthread_cond_wait()的底层futex()属于慢系统调用,可以被信号中断,这是导致虚假唤醒的系统层面原因(另一个是逻辑层面)。所以我就写了一个小demo来进行验证,就是主线程给子线程发信号而已,很简单。结果当然是失败的,不然就不会纠结,也没有这篇记录了。所以我就很懵逼了,原理上不应该的啊?我直接去看pthread_cond_wait()的源码,了解到底是怎么回事的… 但是一来不好找对应OS版本的源码,二来是网上

2020-06-15 03:19:04 446

转载 【内核资料】Linux进程的睡眠和唤醒

1. Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU。一旦这个主动放弃CPU的进程被重新调度占用 CPU,那么它将从上次停

2020-06-13 01:06:04 391

原创 【INT的内核笔记】调度研究(一)

未完待续…研究的源码主要是2.6版本。1. 调度策略概述1.1 调度调度时机和调度是不同的,什么时候阻塞进程,什么时候唤醒进行,什么时候执行调度,这属于调度时机;阻塞和唤醒进程时候相应调度变量如何改变,应该从可执行队列中挑选哪个进程运行,这属于调度;调度大致提供这些主要功能:从可执行队列中,选出合适进程执行;阻塞和唤醒进程;多CPU间等方面的负载平衡;1.2 进程类型类型批处理进程一般为后台进程,不需要和用户交互,处理上受慢待。例如编译程序,数据库搜索引擎,科学计算

2020-06-12 22:39:41 294

转载 【内核资料】进程切换 switch_to 与 __switch_to

这是我觉得在网上介绍switch_to函数的众多文章中,讲得算最明白的一篇。只要有耐心一路看下来,基本上都能把这个比较奇葩的函数看明白。其实难点在于:需要有一点汇编知识,因为涉及到一点汇编层面的hack技巧;本身很晦涩,这边文章通过逐行讲解并且尽量转换的形式,很好地解决了一点;作者:visayafan文章链接#define switch_to(prev, next, last) \do { \/* \ * Context-switching cl

2020-06-11 22:59:29 1059

转载 【内核资料】fork写时拷贝实现原理

作者:Leosocy链接:https://blog.leosocy.top/深入了解Linux-COW写时拷贝实现原理/为了节约物理内存,减少进程创建时资源和时间的消耗,父进程在调用 fork() 生成子进程时,子进程与父进程会共享同一内存区。只有当其中一进程进行写操作时,系统才会为其另外分配内存页面。这就是写时复制机制 (copy on write) 的意思。那么 Linux 内核是如何实现这种机制的呢,今天我们来简要的分析一下。fork 系统调用流程sys_fork -> _do_fork

2020-06-08 22:35:03 543

原创 文件中经常遇见的小问题

问题1.linux和windows间传文件,’\n’变成"\r\n"。刚刚又被坑了一波,有一段时间我对这个特别敏感,帮同学指出过几次,现在太久没遇见自己都被坑了。解决方法很简单,使用linux上dos2unix这个小软件转一下就行。2.用’\n’分割的txt数据文件中,某一行末尾多了一个空格。就是类似于这样abcabccdecdeefgefg'我是空格'hahahhahaha第一次遇到是在hadoop大作业的时候,还挺坑的,一眼下去啥问题没有。感觉可以写个小工具,自动检测和去除。

2020-06-06 17:31:04 258

原创 【暴力】凸包算法

1. 前言基本上就是最原始的暴力,多余的计算很多。试过优化,但是弄出了一堆bug,找的焦头烂额。最终放弃了,反正就是手痒实现着玩的,能AC就先算了。算法本身很简单,主要是特殊情况的处理有点烦,debug的时候实在有点暴躁。HDUOJ2. 实现#include <iostream>#include <vector>#include <map>#include <set>#include <cmath>#include <al

2020-06-03 21:03:05 320

原创 软件测试复习

1. 前言软件测试中很多思想,尤其是对边界值的处理,还是值得借鉴的,因此进行一下简单的复习。2. 黑盒测试等价类划分法3. 白盒测试暂不复习路径覆盖。用到的例子:语句覆盖,就是每个语句都能执行到,例子中判断全为T即可达成:判定覆盖,每个判定的T、F都能执行到:条件覆盖,将判定分解成 条件(条件通过||,&&组合成判定),然后对条件进行覆盖:判定:(A > 1) && (B == 0),(A == 2) || (X > 1)条件:设

2020-05-28 19:06:59 337

转载 stackoverflow上关于gdb attach一个很好的回答

原文地址This is a classic problem that people have with gdb. It’s so common that you’d think it would have a handy name!There are a few solutions to the problem, some time-tested and some relatively more experimental.If the program to debug (in gdb lingo, "

2020-05-15 14:24:13 301

原创 【gdb多线程调试笔记】gdb attach pid启动方式的应用

1.前言之前一直使用gdb filename方式启动调试,昨天想停住某个特定线程,然后就犯难了,捣鼓了很久。后来就想着,反正都捣鼓gdb,干脆就顺便好好研究一下attach启动方式吧。捣鼓明白之后,感觉自己太智障了,想要在non-stop下停住特定线程,使用attach才是正解。2.attach启动方式相关启动方式假设:程序是使用-g选项编译的,带有调试信息。如何确认程序是否可调试?对于没有调试信息的程序如何处理?这类的问题在后面会介绍,先不涉及;默认为non-stop模式,不过all-

2020-05-15 14:17:03 3271

原创 【gdb多线程调试笔记】如何在non-stop模式下停住特定线程(gdb filename启动方式)

1. 前言还是由于最近毕设,需要修改实验室里某个有一定规模的分布式框架。由于动态调试真的很麻烦,这个半个月基本都在看代码和日志来分析程序。虽然经过了半个月,以现在对代码的熟悉程度,忽略gdb动态调试基本也问题不大。但还是觉得很不舒服,很想在实际的多线程调试工作中,加入gdb这个熟手的工具。于是今天就挑战了一下,如何在non-stop模式下,把分解器工作线程给停住。现在还有一个头痛的问题,还没搞懂怎么去调试回调函数,因为gdb跟不进去。2. gdb多线程的三种运行模式假设有t1, t2, t3三个线程

2020-05-14 21:58:26 1949

原创 Excel双击打开每个表就是单独进程的问题

朋友遇到这个事儿了,查了一下资料,备份一下以后可能有用。如何让Excel在一个进程里打开多个表https://www.kafan.cn/A/end0jry632.html07修改注册表,改成一个表一个进程的https://wenku.baidu.com/view/e875aaac360cba1aa811da7b.html这个反而就是说在同一个进程里,求怎么多进程的http://club.excelhome.net/thread-1251488-1-1.html和朋友的问题一致,感觉看起来就是

2020-05-11 10:00:00 2288

原创 C++类成员函数在多线程中的一些问题研究

之前只在C语言下,利用pthread搞过一些小demo玩。看实验室并行框架源码时发觉,全是C++风格的多线程,涉及到的pthread_create()为何不能以成员函数作为参数、锁成员变量、线程安全的类各种的问题,这些之前完全没有接触过。特此进行了两天的调研和思考,现在就简单整理一下这两天看过的资料。由于就真的是光看没练,只是单纯翻了一堆大致原理,可能会有不少纰漏。阅读后觉得有不妥的地方,那很可能就真的是不妥的,笑。1. C++类成员函数在内存中的摆法之前转载了一篇文章,文中大致介绍C++类成员函数在

2020-05-10 13:14:42 1916 1

原创 【INT的内核笔记】文件系统浅析

1. 磁盘中的文件系统理想组织形式| 引导块 | 超级块 | 空闲空间管理 | i节点表 | 逻辑块(根目录+文件和目录) |满足了文件系统几个需求:存储和读取信息、空闲管理、文件属性(基本信息+权限)职责分配:引导块,和系统启动有关,不讨论;超级块,保存整个文件系统的属性,可以类比到文件的属性,就是大小、时间之类。摘录:超级块中会存储整个文件系统的类型、大小,文件系统中索引节点的总数量,当前文件系统的空间占用量、空闲块数量,存储块的大小,文件系统的最近一次检查时间等信息。

2020-05-09 20:02:40 214

转载 C++成员函数在内存中的存储方式

原文:https://blog.csdn.net/fuzhongmin05/article/details/59112081用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如下图所示。能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如下图所示。显然,这样做会大大节约存储空间。C++编译系统正

2020-05-09 14:02:55 233

原创 zsh安装和配置

1.zsh安装与切换sudo apt-get install -y zshsudo chsh -s /bin/zsh2.oh-my-zsh安装无论什么渠道都可以,把oh-my-zsh项目先拉下来,再运行其中的install.sh脚本就行:git clone https://gitee.com/roclyp/oh-my-zshcd /home/lyp/oh-my-zsh/tools....

2020-03-17 22:43:57 445

原创 C语言socket编程中关于read()和write()的思考

最近开始学习C的socket编程,教材上有一处依照我对IO函数的理解,我感觉有点问题,故而研究了一下。学的很浅,可能有错漏。1.socket编程中read()和write()内部原理每个socket应该是在内核中具有相应的send_buffer和recv_buffer,这个就是普通文件读写中常说的内核缓冲,应该大致是一样的。以下的讨论均基于阻塞模式下,实际可以设置为非阻塞模式,但暂还没详细研究...

2020-02-25 21:44:11 7540

原创 C++异常使用思考

1.概述我觉得C++异常的讨论应该从三个方面去展开:异常的设计意义层面;什么样的异常应该用异常机制处理;异常的底层实现和效率层面;由于只是玩具级程序员,暂时更关注1、2,第3点后面再研究不过暂时实在还是太过于才疏学浅,以后再回来看看有多少地方是理解错的吧。2. 异常的设计意义C++有两种常用的异常处理思路:错误码机制,在函数返回值中包含式地返回错误码,结合与errno类似的...

2020-02-23 23:00:31 198

原创 C语言标准IO的缓冲机制

1.主要思想书上和很多地方只着重提到了延迟写,我有点疑惑,那么读缓冲是这样的情况呢?后面利用setbuf()自定义了一下缓冲,并输出。结合之前对于实现intel论文上的并行基数排序中一个优化,这个和延迟写相对的读缓冲优化,应该称为预读。这两个技术颇为通用,在标准IO缓冲中、在cahce机制中等等。预读,利用局部性原理,猜测既然读了一个字符,那么相邻一块字符被读几率都很大。为减少系统调用、减少...

2020-02-22 21:07:23 364

原创 scanf()和getchar()在循环中出现的输入问题研究

1. scanf()在循环中出现的问题下面这段代码,如果一开始就输入字符d这样非数字的话,那么会直接执行完剩余9次循环,用户不再有输入的机会。 int unused; for (size_t i = 0; i < 10; i++) { printf("please press any key to continue:\n"); scanf...

2020-02-22 17:15:37 665

原创 C语言基础文件读写总结

1. 基础输入函数int fscanf(FILE *stream, const char *format, …)参数stream,输入流fileIn之类;format,例如"%c %d %s“, ”%c,%d,%s"是不行的,不接受这样的分割;…,变量的指针/数组指针;返回值返回读取单元数,当无出错和非到达文件末尾时;返回EOF,当在中途到达文件末尾,或者发生读...

2020-02-19 22:45:19 336

原创 网络层、链路层理解

1.网络层和链路层关系2.网络层路由器其实计算机本身就有路由器的功能,路由器可以理解成专用的特化简化型计算机,因此数据包的第一次转发发生在计算机本身。这也是为什么在不用路由器,纯交换机组局域网的时候,IP地址也会被需要的原因,因为当前的互联网实现下,不可能没有路由器,计算机就实现了路由器功能。路由器承担的功能非常多,而且还会担当着不同的角色:路由选择。算法上主要是dijskra算法和D...

2020-02-13 15:46:20 2779

原创 ubuntu 18.04安装NVIDIA驱动失败经历 --- 不能进入图形界面

1.安装方法网上很找到,就不详述了。总结起来有三种:**从ubuntu标准仓安装。**使用ubuntu-drives autoinstall,其实就是apt-get install nvidia-drivers-xxx,不过版本不需要自行指定,直接安装系统推荐的而已。这种方法不需要手动禁止nouveau,不需要退出图形界面;**从PPA源安装。**添加PPA源,然后apt-get inst...

2020-02-04 19:36:49 7307 3

原创 【Mysql必知必会】第15到16章

1.目录联结,大致上类似于指针,就是将数据用地址的方式【压缩】起来,减少数据的冗余,提高可扩展性。联结我觉得就类似指针的解引用,将表中【压缩】的信息展开回原本的形态。2.联结概念冗余数据的弊端浪费存储空间。 比如同一供应商的每个产品的供应商信息都是相同的,每个产品中都重复存储一遍相关信息便造成了空间的浪费;难以改动。 如果供应商信息分布在每个产品中,并且被多次重复,可以想象,改动起来...

2020-02-01 17:36:21 177

原创 【Mysql必知必会】第4到8章

1.目录就mysql而言,在SQL搜索语义从层面上:可以将表中数据看都看作字符串,在写SQL的时候,将数字写成’1’,‘2’仍能被识别成数字;可以不用区分浮点数和整数;可以将子串等字符串操作用在数值类型数据上;可以将大小关系等用在字符串操作上,不过这个本来就可以,毕竟有字典序之类概念;2.查询固定列、所有列所有列的语法,SELECT * FROM table;格式化问题,...

2020-01-31 16:57:56 163

原创 【Mysql必知必会】第10到12章 内置函数

1.基础概念虽然不知道引擎内部如何存储,但是就DBMS的行为,可以大致认为Mysql表中的数据都是字符串。因为就算是int类型的结果,也可以使用字符串操作函数;处理函数的用途是处理数据,可以处理结果数据,也可以处理用作查找条件的数据;处理函数的类型:文本处理;数值运算;日期运算;数据汇总;2.文本处理函数文本具有两种性质,线性结构、字符,因此具体有以下行为和对应函数:...

2020-01-27 02:31:25 130

原创 ubuntu18.0下VSCode配置C++环境

1.三个比较主要的json文件c_cpp_properties.json,用于指定各个头文件的路径,ubuntu18.0下不需要改动;launch.json,用于指定调试方面的信息,比如用什么调试器(如gdb),相应的调试信息对应于哪个task(就是下面的tasks.json描述的task,采用preLaunchTask参数指定);tasks.json,用于指定任务,不只最常见的build...

2020-01-24 18:56:14 872

原创 正则表达式

1.正则表达式用途2.基础2.1 单元单字符普通字符,例如a、b、c;字符集,写法为[ctx],例如[abc]、[a-z];取反字符集,写法为[^ctx],例如[^{}]表示大括号的字符集;简写集,写法为\ctx,例如\w表示字母数字下划线集合;特殊符号,写法为\ctx,例如\.表示字符.,\t表示制表符;POSIX字符类,写法为[:name:],和简写集部分重叠,例如[:a...

2020-01-22 22:10:54 421

原创 关于关掉ubuntu 18系统音的问题

这个系统音真的非常烦,鬼才设计。上次改配置文件关掉了终端的,最近在学习mysql,在mysql命令行里又来了,吐血。总结一下如何去关掉,列举一下网上找到的两种关法:第一种只能关掉终端的,可能下个命令行工具,又冒出来了;第二种很简单,而且彻底静音了。1.修改/etc/inputrc文件sudo打开该文件,找到这一段# do not bell on tab-completion#set be...

2020-01-19 20:27:48 496

原创 关于修改/etc/inputrc引起的,终端不能输入字符d的问题

ubuntu 18那个破系统音实在太烦了,于是想关掉,找到这篇博客。https://blog.csdn.net/xuezhimeng2010/article/details/8192921博客本身说的也没什么问题,正确操作之后确实关掉了。关键在于,我非常的手贱和眼瞎。文中是说:执行命令:#sudo vi /etc/inputrc找到21行,把#set bell-style no...

2019-12-28 14:44:54 707 2

原创 ubuntu 16.0升级18.0的一点小问题

最后卡在installing snap gnome xxx上了。卡了两小时,估计凉了,于是直接结束掉。但是之后并没有什么错误,可以正常使用,毕竟真正的系统更新已经完事了。反正很迷吧,推测那条未完成指令的意思是,用snap来安装gnome全家桶,为防有什么错误,我特意用apt-get又装了一遍gnome全家桶,感觉应该没问题了吧?特意记下来,以后真炸了能知道这个事,就这样。...

2019-12-27 21:40:02 2429 10

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除