Linux操作系统
文章平均质量分 94
深入理解计算机系统,GDB调试技巧
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
ptmalloc、tcmalloc与jemalloc对比分析
ptmalloc、tcmalloc与jemalloc对比分析。原创 2024-03-10 18:33:05 · 1278 阅读 · 0 评论 -
gdb调试进阶教程
【代码】gdb调试进阶教程。原创 2022-10-26 23:55:33 · 1564 阅读 · 0 评论 -
临时或永久修改cgroup和Cgroup 入门教程:cpuset
Linux 的 init 系统发展到 systemd 之后,systemd 与 cgroups 发生了融合(或者说 systemd 提供了 cgroups 的使用和管理接口)Systemd 默认挂载的 cgroups 系统Cgroup 的默认层级认情况下,systemd 会自动创建 slice、scope 和 service unit 的层级(slice、scope 和 service 都是 systemd 的 unit 类型),来为 cgroup 树提供统一的层级结构。默认情况下,系统会创建四种 slic原创 2022-07-10 16:41:58 · 4658 阅读 · 0 评论 -
Linux Cgroup快速入门:基本概念,CPU,内存
Cgroup 是 Linux kernel 的一项功能:它是在一个系统中运行的层级制进程组,你可对其进行资源分配(如 CPU 时间、系统内存、网络带宽或者这些资源的组合)。cgroup 和 namespace 类似,也是将进程进行分组,但它的目的和 namespace 不一样,namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。........................原创 2022-07-05 09:25:29 · 3236 阅读 · 0 评论 -
Linux进程调度策略
文章目录1.CFS2.实时调度3.CFS性能4.CFS与红黑树1.CFS在内核 V2.6.23 的发布中,完全公平调度程序(CFS)成为默认的 Linux 调度算法。Linux 系统的调度基于调度类。每个类都有一个特定优先级。内核针对不同的调度类,采用不同的调度算法,以便满足系统与进程的需要。例如,用于 Linux 服务器的调度准则,也许不同于移动设备的。为了确定应运行哪个进程,调度程序从最高优先级调度类中选择具有最高优先级的任务。Linux 标准内核实现两个调度类:采用 CFS 调度算法原创 2022-05-03 17:04:39 · 2765 阅读 · 0 评论 -
Linux页缓存、LinuxVFS中文件打开、读、写底层逻辑
文章目录一、页缓存二、LinuxVFS之文件打开、读、写逻辑一、页缓存二、LinuxVFS之文件打开、读、写逻辑参考:一文看懂 | 什么是页缓存(Page Cache)、Linux虚拟文件系统剖析: 文件打开、读、写逻辑...原创 2022-03-30 11:19:07 · 1641 阅读 · 0 评论 -
Linux内存管理机制
文章目录1.虚拟地址2.物理地址3.Linux 内核会将物理内存分为3个管理区4.用户空间5.进程与内存6.内核空间本文讨论技术内容前提,操作系统环境都是 x86架构的 32 位 Linux系统。1.虚拟地址为了充分利用和管理系统内存资源,Linux采用虚拟内存管理技术,利用虚拟内存技术让每个进程都有4GB 互不干涉的虚拟地址空间。进程初始化分配和操作的都是基于这个「虚拟地址」,只有当进程需要实际访问内存资源的时候才会建立虚拟地址和物理地址的映射,调入物理内存页。打个不是很恰当的比原创 2021-10-14 16:54:37 · 2735 阅读 · 0 评论 -
Linux内核的组成部分
文章目录1.进程、进程切换、调度2.UNIX进程3.地址空间与特权级别4.页表5.物理内存的分配6.系统调用1.进程、进程切换、调度系统中同时真正在运行的进程数目最多不超过CPU数目确定哪个进程运行多长时间的过程称之为调度2.UNIX进程init是进程树的根,所有进程都直接或间接起源该进程##@##>pstreeUNIX创建新进程的机制:分别是fork和exec(1)fork技术:写时复制(copy on write),原理:将内存复制操作延迟到父进程或子进程向某内存页面原创 2020-06-22 11:52:18 · 484 阅读 · 0 评论 -
Linux下查看支持的信号列表
文章目录参考:Linux下查看支持的信号列表https://www.cnblogs.com/lr-ting/archive/2012/09/18/2691179.html转载 2020-03-27 15:19:14 · 678 阅读 · 0 评论 -
(4.4)进程管理之临界资源和临界区,锁机制
文章目录1.临界资源和临界区1.临界资源和临界区临界资源Critical Resource:一次只允许一个进程独占访问(使用)的资源eg:例子中的共享变量i临界区Critical Section:进程中访问临界资源的程序段临界区和临界资源的访问特点(1)具有排他性(2)并发进程能同时进入临界区设计临界区访问机制的4个元组(1)忙则等待:当临界区忙时,其它进程...原创 2020-03-08 23:16:46 · 1964 阅读 · 2 评论 -
(4.3)进程管理之线程
文章目录1.线程的概念2.线程技术的典型适用场景3.各平台创建线程的说明4.使用线程的缺点1.线程的概念编写一个程序,并发地画圆和画方(1)步骤1,编写画圆和画方的两个函数//画圆的函数DWORD DrawCircle(LPVOID lpParam);//实现画方的函数DWORD DrawRect(LPVOID lpParam);(2)步骤2:在程序中调用上述2个函数v...原创 2020-03-08 22:29:30 · 537 阅读 · 0 评论 -
线程/携程/异步的编程模型
文章目录1.线程2.协程3.异步1.线程线程是CPU调度的最小单位eg:单核CPU,有3个要执行的线程,先执行线程1,让出时间片,再执行线程2,让出时间片,再执行线程3,直至所有线程执行完毕;左右两边的区别在于:右边不对CPU进行时间分片,右边只执行了两次线程的上下文切换 ,两侧执行的总时间是一样的疑问:右边的执行效率更高?多线程存在的意义?意义:I/O:包括DiskIO(...原创 2020-03-02 12:58:00 · 591 阅读 · 1 评论 -
(5.3)死锁之死锁的预防策略
文章目录1.死锁的必要条件2.解决死锁的策略3.Windows,Linux采用了何种的死锁解决方案?1.死锁的必要条件互斥条件进程互斥使用资源,资源具有独占性不剥夺条件进程在访问资源前不能被其它进程强行剥夺部分分配条件区别于全部分配, 进程边申请资源,临时需要临时分配环路条件多个进程构成环路:环中每个进程已占用的资源被前一进程申请,而自己所申请的资源又被环中后一进...原创 2020-02-27 22:37:22 · 1204 阅读 · 0 评论 -
(5.1)死锁之死锁的概念和死锁的起因
文章目录1.哲学家就餐问题2.死锁的定义1.哲学家就餐问题五个哲学家围坐在圆桌边,有5只筷子。哲学家:思考-休息-吃饭要求:吃饭时,要使用两只筷子那一双筷子才能吃;每次只取一只筷子;只取身边的筷子;吃完放下筷子用线程Philosopher实现哲学家的生活//筷子编号:0-4,哲学家左手边筷子编号与哲学家编号相同int S[5]={1,1,1,1,1};//信号量:i号筷子...原创 2020-02-27 20:24:06 · 241 阅读 · 0 评论 -
(6.3)进程调度之Linux进程调度
文章目录1.Linux进程类型2.Linux进程的优先级3.调度策略(结合task_struct结构)4.进程调度的依据:task_struct1.Linux进程类型普通进程(1)采用动态优先级来调度(2)调度程序周期性地修改优先级(避免饥饿)实时进程(1)采用静态优先级来调度(2)由用户预先指定,以后不再改变2.Linux进程的优先级静态优先级进程创建时指定或者由用户修...原创 2020-02-27 11:07:48 · 355 阅读 · 0 评论 -
(6.1)进程调度之进程调度概念和典型的调度算法
文章目录1.进程调度的目标2.典型的调度算法1.进程调度的目标概述上来讲:(1)在合适的时候以一定的策略选择一个就绪进程运行(2)调度时机?(3)调度策略?(3)调度目标?进程调度的目标(1)相应速度尽可能快(2)进程处理的时间尽可能短(3)系统吞吐量尽可能大,吞吐量:单位时间内运行更多的进程,(3)和(4)的本质是一样的(4)资源利用率尽可能高(5)对所有进程要公...原创 2020-02-26 21:55:50 · 461 阅读 · 0 评论 -
操作系统的内存管理
文章目录1.为什么要有逻辑地址?2.逻辑地址如何与物理地址映射?1.为什么要有逻辑地址?逻辑地址:是直接在程序中看到的地址逻辑内存也叫虚拟内存硬件可用的地址是变化的, 比如增加减少内存条,程序的地址是写死的因为程序无法知道可用的逻辑地址,所以必须要作出映射2.逻辑地址如何与物理地址映射?一种简单的思路:固定偏移量映射缺点:(1)(2)程序3无法使用0-200的内存,称之...原创 2020-02-15 20:46:52 · 210 阅读 · 0 评论 -
(12.0)深入理解计算机系统之并发编程
文章目录1.实现并发的3种方式2.基于进程的并发编程3.基于I/O多路复用的并发编程4.基于线程的并发编程1.实现并发的3种方式如果逻辑控制流在时间上重叠,那么他们就是并发的concurrent,这种常见的现象称之为:并发concurrency。并发可看作是OS内核用来运行多个应用程序的机制,也可以开发应用级的并发程序concurrent program,OS提供的三种构造并发程序的方法:...原创 2020-01-07 11:22:39 · 305 阅读 · 0 评论 -
简单介绍:一致性HASH算法和取余算法
文章目录1.基本场景2.为什么需要一致性hash?3.hash算法和单调性4.Consistent Hashing 一致性hash的原理(1)环形hash空间(2)把需要缓存的内容(对象)映射到hash 空间(3)把服务器(节点)映射到hash 空间(4)把对象映射到cache(5)考察cache 的变动(6)虚拟节点1.基本场景比如你有 N 个 cache 服务器(后面简称 cache )...转载 2019-12-28 17:20:37 · 773 阅读 · 0 评论 -
nohup command>/dev/null 2>&1 &是什么意思?
文章目录1.命令:nohup command>/dev/null 2>&1 &2.为何2>&1要写在后面?1.命令:nohup command>/dev/null 2>&1 &首先就是一个nohup:表示当前用户和系统的会话下的进程忽略响应HUP消息。&是把该命令以后台的job的形式运行。command>...转载 2019-12-28 16:42:41 · 654 阅读 · 0 评论 -
线程池大小设置和CPU核心数的关系
文章目录1.线程池和CPU核心数的关系2.常见概念:CPU的核心数,CPU的线程数3.是否使用线程池就一定比使用单线程高效呢?1.线程池和CPU核心数的关系一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU processors的个数)(1)如果是CPU密集型应用,则线程池大小设置为N+1(或者是N),线程的应用场景:主要是复杂算法(2)如果是IO密集型应用,则线程池大小...原创 2019-12-28 15:57:16 · 8099 阅读 · 0 评论 -
(十二)GDBdebug调试技术——死锁:在函数中再次试图获得同一个锁
文章目录1.死锁eg1.死锁eg下面的程序在获得了锁mutex的状态下,调用了函数cnt_reset(),在该函数中试图获得同一个锁,导致了死锁[astall.c]参考:《GDB/Debug.Hacks中文版:深入调试的技术和工具》...原创 2019-12-26 15:18:12 · 564 阅读 · 0 评论 -
(实验1)开发环境实验
文章目录原创 2019-12-08 20:30:09 · 425 阅读 · 0 评论 -
(十一)GDBdebug调试技术——malloc()和free()发生故障
文章目录1.错误使用内存相关库函数引起的bug2.利用MALLOC_CHECK_进行调试1.错误使用内存相关库函数引起的bugC语言常见的内存相关库函数的bug:内存的双重释放,访问分配空间之外内等等。这些bug的在gdb的具体表现是:在malloc(),free()之后发生SIGSEGV错误使用malloc(),free()导致的SIGSEGV的最危险的情况是:程序不会受到内存破坏依然会...原创 2019-11-25 09:08:56 · 1250 阅读 · 0 评论 -
(十)GDBdebug调试技术——数组非法访问导致的内存破坏
文章目录1.数组的错误操作2.改变程序运行地址的3种方法3.数组的缓冲区溢出导致的栈破坏4.错误的数组下标引起的GOT破坏1.数组的错误操作错误地操作数组导致:缓冲区溢出此外,在计算数组的下标时,如果计算方法有误,就有可能算出负下标,引起缓冲区溢出常见措施:指定缓冲区大小来编写安全的函数,源代码检查工具,编译器在构建时的报警等。2.改变程序运行地址的3种方法3.数组的缓冲区溢出导致...原创 2019-11-18 15:30:26 · 731 阅读 · 0 评论 -
(九)GDBdebug调试技术——backtrace无法正确显示(栈破坏)
文章目录1.问题内容2.解决办法3.查看寄存器和栈1.问题内容以多线程应用程序中由于线程间的冲突导致的栈破坏为例,讲解调试方法。由于存在栈破坏,可以说backtrace信息并不完整问题:某个进行线程间通信的程序中含有bug,生成了coredump文件2.解决办法如果出现了以下的bt信息(gdb)bt#0 0x00000003b4869ac80 in nanossleep ()...原创 2019-11-18 11:42:23 · 7311 阅读 · 0 评论 -
(八)GDBdebug调试技术——由于栈溢出导致segmentation fault的调试
文章目录1.SIGSEGV发生的情况1.SIGSEGV发生的情况NULL指针的访问指针被破坏等原因导致的非法地址访问栈溢出导致访问超出了已分配的地址的空间$ ./某代码参考:《GDB/Debug.Hacks中文版:深入调试的技术和工具》...原创 2019-11-16 15:44:08 · 938 阅读 · 0 评论 -
(七)GDBdebug调试技术——C++程序的参数是如何传递给被调用函数的?
文章目录1.C++语言的函数调用2.在x86_64中查看参数3.在i386中查看参数1.C++语言的函数调用每个class foo的实例中(代码中的f1,f2),其成员变量a和b的值都不相同,有多少实例,就需要多少个存储这些成员的空间。然而,方法func的实体只需要一个。#include<cstdio>class foo{ int a; int b;p...原创 2019-11-16 15:02:37 · 366 阅读 · 0 评论 -
(六)GDBdebug调试技术——i386架构上参数是如何传递给被调用的函数?
文章目录1.函数调用2.i386中的寄存器的调用1.函数调用在i386上,原则上函数的形参全部放在栈中。eg:代码如下#include<stdio.h>#include<stdlib.h>int v1=1;float v2=0.01;void func(int a, long b, short c, char d, long long e, floa...原创 2019-11-16 11:15:47 · 280 阅读 · 0 评论 -
(一)GDBdebug调试技术——coredump
文章目录1.用户空间进程的内核转储:coredump(1)ulimit相关指令(2)在专用目录中生成内核转储(3)自动压缩code dump文件(4)启用Linux系统的内核转储功能(5)code dump排除多余共享内存1.用户空间进程的内核转储:coredump(1)ulimit相关指令查看当前的coredump功能是否有效;-c:表示coredump的大小限制,为0,表示无效$ ul...原创 2019-11-11 11:12:55 · 1448 阅读 · 1 评论 -
(二)GDBdebug调试技术——GDB的使用技巧1
文章目录1.gdb的调试选项2.gdb的使用1.gdb的调试选项构建方法一般写在INSTALL,README中至少要知道, gcc的优化选项可能会让执行顺序与源代码顺序不同,eg:inline内敛函数优化(函数代码在调用的位置展开),该函数名无法设置断点(1)若使用gcc -g$ gcc -Wall -02 -g 源文件(2)若使用Makefile文件,则$ CFLAGS= -...原创 2019-11-11 11:50:04 · 510 阅读 · 0 评论 -
(二)GDBdebug调试技术——GDB的使用技巧2
文章目录1.gdb技巧1.gdb技巧(1)attach到进程要调试守护进程(daemon process)等已经启动的进程,或者调试陷入死循环而无法返回控制台的进程时,可以使用sttach。格式:attach pid$ ps -aux|grep sleep(gdb)attach 17686attach后,就可以使用普通的gdb命令;恢复程序运行,使用continue;参考:...原创 2019-11-12 11:38:52 · 421 阅读 · 0 评论 -
(三)GDBdebug调试技术——GDB的使用技巧3
文章目录1.gdb技巧1.gdb技巧(1)命令历史默认命令历史文件在./.gdb_history(2)初始化文件.gdbinitLinux环境下的初始化文件为.gdbinit。如果存在.gdbinit文件,gdb就会在启动之前,将其作为命令文件运行。初始化文件和命令文件的执行顺序如下:1$HOME/.gdbinit2运行命令行选项3./.gdbinit4通过-X选项给出的命令...原创 2019-11-12 20:29:54 · 281 阅读 · 0 评论 -
(四)GDBdebug调试技术——必须知道的栈知识
文章目录1.内存的平坦模型和分段模型(1)平坦模型(2)分段模型2.栈(1)函数调用和栈的关系1.内存的平坦模型和分段模型CPU通过内存总线访问到的地址称为物理地址。32位下的最大物理地址是64GB,2^36次方;64位下,Intel的最大物理地址是2^40次方的字节,AMD是 2 ^48次方字节(1)平坦模型LInux采用的内存模型: 内存可看做是单一,平坦的连续地址空间,称之...原创 2019-11-13 09:09:47 · 1165 阅读 · 0 评论 -
(五)GDBdebug调试技术——x86_64架构上参数是如何传递给被调用的函数?
文章目录1.函数的参数与调试1.函数的参数与调试可以检查与故障相关的函数的参数,以缩小有问题的函数的范围eg:代码如下#include<stdio.h>#include<stdlib.h>int v1=1;float v2=0.01;void func(int a, long b, short c, char d, long long e, floa...原创 2019-11-16 10:35:29 · 369 阅读 · 0 评论 -
pthread_getspecific和pthread_setspecific使用:同一线程内的各个函数间共享数据
文章目录1.pthread_getspecific和pthread_setspecific简介2.pthread_getspecific和pthread_setspecific使用eg13.pthread_getspecific和pthread_setspecific使用eg1.pthread_getspecific和pthread_setspecific简介函数 pthread_setspe...原创 2019-10-30 14:27:30 · 1918 阅读 · 1 评论 -
find grep more cat tail head
文章目录1.find(1)-name:基于文件名查找(2)-size:基于文件大小(3)-type:基于文件类型(4)-[cma][time|min]基于修改时间(5)-maxdepth:基于文件的层数2.grep(1)-r:递归子路径;-n:显示行号(2)-A:接着输出后面几行,-B接着输出前面几行(3)与find结合使用3.more4.cat5.tail6.head7.df -h:查看磁盘大小...原创 2019-10-27 23:26:55 · 225 阅读 · 1 评论 -
linux常用的与进程相关的命令
1监视进程的命令ps aux :打印用户名是“x”的所有进程可以用管道和more命令来分页查看上述的命令意思是:把所有进行显示出来,并输出到ps001.txt文件,然后通过more来分页查看。1)和grep结合,提取指定程序的进行2)判断父子友好关系用到了参数f,可以查看父子关系2.pgrep查询进程工具用来判断程序是都正在运行用法如下:具体例子如下:3.终止进程的...原创 2018-09-18 21:35:45 · 6360 阅读 · 0 评论 -
操作系统中内存分段与内存分页的区别
参考:内存分段和分页的区别https://blog.csdn.net/u011740322/article/details/10081495分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:...原创 2018-09-16 21:18:32 · 1258 阅读 · 0 评论 -
进程之间的通信
参考《操作系统概念第七版中文版》原创 2018-09-16 22:55:26 · 256 阅读 · 0 评论