操作系统
Lailikes
这个作者很懒,什么都没留下…
展开
-
使用watch来监控内存
众所周知,在所有的逻辑Bug中,野指针或者数组越界引起的Bug最难调,因为暴露问题的地方与真正产生问题的地方往往不是在同一个地方,而且这种Bug往往具有随机性,让人头痛。调上述Bug的标准做法就是使用GDB的watch命令来监控内存变化,当watch的内存发生变化时,调试程序会停住,我们就知道是哪一步动了“奶酪”。watch的使用也很简单,如果有一个指针pTest指向一块内存,则:wa...原创 2020-04-20 11:14:28 · 3433 阅读 · 0 评论 -
Linux依赖管理详解
https://www.jianshu.com/p/c6936efe5b58apt是Debian系列的Linux操作系统的包管理工具,Ubuntu是使用apt来进行包管理的。现在以apt为例讲解Linux包管理原理。apt工作原理我们可以直接在Linux主机上进行apt采用集中式的软件仓库机制,将各式各样的软件分门别类的放在软件仓库之中,从而进行有效的组织和管理。然后,将软件仓库放...转载 2020-02-16 11:11:47 · 2056 阅读 · 0 评论 -
一篇文章讲清楚内存模型
https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/概述我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止进程之间内存泄漏的问题。为了更加有效地管理内存并减少出错,现代操作系统提供了一种对主存的抽象概念,即是虚拟内存(Virtual Memory)...转载 2019-12-20 10:43:35 · 266 阅读 · 0 评论 -
最好用的Linux——Manjaro配置
http://panqiincs.me/2019/06/05/after-installing-manjaro/https://www.jianshu.com/p/4fce765a306b基本设置更换国内源使用国内的源有更快的下载速度,pacman能够测试不同源的速度并给它们排名,从中选择一个快的即可。我选择的是上海交大sjtu的源,下载速度能够达到10兆每秒。 1...转载 2019-12-01 23:30:07 · 901 阅读 · 0 评论 -
MPP and SMP in TiDB
MPP and SMP in TiDB本篇文章整理自第 21 期 PingCAP NewSQL Meetup 上申砾分享的《MPP and SMP in TiDB》内容。干货很多,全文阅读预计需要 20 分钟 :)今天主要是想把我们 TiDB 做 SQL 性能优化的一些经验和一些思考,就此跟大家探讨一下。题目写的比较大,但是内容还是比较简单。我们做 TiDB 的 SQL 层时,一开始做的很...转载 2019-06-10 07:56:25 · 996 阅读 · 0 评论 -
write和read返回值详解
write返回值1、返回值>0a、等于给定字节数b、小于给定字节数,有如下几种可能:底层物理介质上没有足够的空间 创建的文件指定了RLIMIT_FSIZE,也就是指定了文件允许的最大字节数,不能再往其中添加数据 已经写了部分数据,但是被中断信号打断,返回中断打断前写入的字节数2、返回值=0如果相应的errno被设定,说明有相应失败情况。如果errno没有被设定,没有...原创 2019-05-29 10:50:34 · 26137 阅读 · 0 评论 -
操作系统(三)
● 请你来说一说协程参考回答:1、概念:协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。例如:def A() :print '1'print '2'print '3'def B() :print 'x'print 'y'print 'z'由协程运行...转载 2019-05-31 11:11:48 · 833 阅读 · 0 评论 -
操作系统(二)
● 请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别参考回答:1、互斥锁和读写锁区别:互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。读写锁:rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状...转载 2019-05-31 10:36:41 · 944 阅读 · 0 评论 -
操作系统(一)
请你说一下进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的参考回答:基本概念:进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令...转载 2019-05-27 09:28:57 · 981 阅读 · 0 评论 -
无锁队列
https://www.cnblogs.com/alantu2018/p/8469168.html本文总体是转载的,但是更正了部分错误、增添了批注目录1、前言2、队列操作模型3、队列数据定长与变长4、并发无锁处理5、无锁队列的实现6、CAS的ABA问题7、用数组实现无锁队列1、前言 队列在计算机中非常重要的一种数据结构,尤其在操作系统中。队列典型的特征...转载 2019-05-13 16:56:26 · 368 阅读 · 0 评论 -
主线程退出对子线程的影响
http://originlee.com/2015/04/08/influence-of-main-threads-exiting-to-child-thread/目录主线程先退出主线程随进程一起退出Linux线程模型对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该...转载 2019-05-17 14:51:43 · 1346 阅读 · 0 评论 -
linux多线程信号总结
同一个进程中的所有线程共享一份信号处理函数(注:一个信号对应于一个信号函数,没有则调用默认的),任何线程注册信号函数都会覆写之前的信号函数。所以最终进程中的信号函数是由最后一次注册信号函数的线程决定的。 可以给任何线程发送信号,收到信号的线程执行相应的信号函数。由于一个进程中所有的线程共用一份信号函数(当然,一个信号对应一个信号处理函数),即使对应于当前信号的信号处理函数不是当前线程注册的,也可...原创 2019-05-17 11:13:24 · 1084 阅读 · 0 评论 -
进程与线程ID
https://www.cnblogs.com/jingyg/p/5684377.html摘自《Linux 环境编程:从应用到内核》 在 Linux 中,目前的线程实现是 Native POSIX Thread Library,简称 NPTL。在这种实现下,线程又被称为轻量级进程(Light Weighted Process),每一个用户态的线程,在内核中都有一个调度实体,也拥有自己的进...转载 2019-05-17 10:40:54 · 526 阅读 · 0 评论 -
进程--内存描述符(mm_struct)
https://blog.csdn.net/qq_26768741/article/details/54375524前言上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员包含了很多与进程相关的信息,今天我们来看一下其中一个被叫做内存描述符的结构体——mm_struct,抽象的来描述linux下进程的地址空间的所有的信息。一、概述一个进程的虚拟地址空间主要...转载 2019-06-25 16:07:11 · 498 阅读 · 0 评论 -
Linux内存管理
http://www.kerneltravel.net/journal/v/mem.htm目录一、前言进程与内存1、进程如何使用内存?2、进程如何组织这些区域?三、进程内存空间1、进程内存管理2、进程内存的分配与回收3、如何由虚变实!四、系统物理内存管理1、物理内存管理(页管理)2、内核内存使用a、Slabb、Kmallocc、内核非连...转载 2019-06-25 16:18:47 · 158 阅读 · 0 评论 -
深度辨析wait函数和信号机机制
我们都知道父进程通过wati系统调用等待子进程结束,处理僵死的子进程,但是其其内部机制到底如何?这篇博客将带你深度探索wait机制,并顺便解释了有关Linux信号的相关问题。首先明确wait的作用:遍历所有子进程,处理一个处于僵死状态的子进程,如果没有僵死子进程,阻塞等待。如果根本就没有子进程,立刻返回-1,并设定相应的errno。综上不难看出,有wait的调用次数应该至少是子进程数,不然有僵...原创 2019-08-13 16:47:49 · 1011 阅读 · 0 评论 -
信号
https://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html一、信号及信号来源信号本质信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信...转载 2019-07-16 10:24:30 · 175 阅读 · 0 评论 -
Linux下删除正在进行读写操作的文件
http://www.forthxu.com/blog/article/40.html多进程环境下,打开同一个文件,进行读写操作过程中,如果其中一个进程删除这个文件,那么,另外正在读写这个文件会发生什么呢?因为文件被删除了,正在读写的进程发生异常? 正在读写的进程仍然正常读写,好像没有发现发生了什么?Linux 是通过 link 的数量来控制文件删除,只有当一个文件不存在任何 link...转载 2019-07-15 17:41:49 · 7265 阅读 · 4 评论 -
Linux的公平调度
Linux的公平调度(CFS)原理https://www.jianshu.com/p/673c9e4817a81、CFS的基本思路在CFS算法引入之前,Linux使用过几种不同的调度算法,一开始的调度器是复杂度为O(n)的始调度算法(实际上每次会遍历所有任务,所以复杂度为O(n)), 这个算法的缺点是当内核中有很多任务时,调度器本身就会耗费不少时间,所以,从linux2.5开始引入赫赫...转载 2019-07-11 11:46:29 · 816 阅读 · 0 评论 -
Linux 中task_struct和文件系统的关系
原文:https://blog.csdn.net/wuheshi/article/details/52872463在内核进程运行的时候,有current 宏对应目前进程task_struct结构Linux进程主要数据结构之间的关系。如图:一个进程文件位置是有fs_struct描述的,进程打开的文件是有files_struct描述的,具体打开的文件描述符是有file控制的。...转载 2019-07-03 19:38:32 · 645 阅读 · 0 评论 -
一个FORK的面试题
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(...转载 2019-07-08 14:27:04 · 192 阅读 · 0 评论 -
如何实现一个malloc
https://kb.cnblogs.com/page/512454/ 任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现m...转载 2019-06-25 20:03:36 · 338 阅读 · 0 评论 -
buddy系统
https://blog.csdn.net/XD_hebuters/article/details/79519406一、linux物理内存划分管理 为了有效的管理物理内存(分配、回收),Linux将整个物理内存划分为若干页,对每一个页,都有相关的数据结构来记录该页的状态和使用信息。在Linux中,每个页的大小是4KB。对于一个512MB的物理内存一共有(512 * 1024)/ 4 = ...转载 2019-06-25 16:57:35 · 1234 阅读 · 0 评论 -
buddy伙伴系统以及与kmalloc、vmalloc、malloc的联系
https://zhuanlan.zhihu.com/p/36140017Buddy分配算法假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Bud...转载 2019-06-25 16:46:25 · 2475 阅读 · 3 评论 -
ptmalloc的实现细节
如果对ptmalloc的基本设计还不熟悉,请先看:https://blog.csdn.net/songchuwang1868/article/details/89951543一、bin数组bin数组大体分成三个部分:1、unsored bin数组暂存一些没有排序的数据 unsored bin数组中的块马上就会分配给用户或者放到small/large bin数组中2、smal...原创 2019-05-12 19:52:04 · 1015 阅读 · 0 评论 -
线程局部存储
目录一、数据类型二、一次性初始化三、线程局部数据API四、总结在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的...转载 2019-05-12 19:02:35 · 873 阅读 · 0 评论 -
计算机体系结构一点基础知识
https://blog.csdn.net/jnu_simba/article/details/8806501下面这张图来自《深入理解计算机系统》:IO桥部分一般还分为北桥和南桥,北桥当然是靠上的了。•CPU–主频:CPU的时钟频率,内核工作的时钟频率–外频:系统总线的工作频率–倍频:CPU外频与主频相差的倍数–前端总线:将CPU连接到北桥芯片的总线...转载 2019-04-30 11:37:51 · 414 阅读 · 0 评论 -
一篇文章彻底讲懂malloc的实现(ptmalloc)
https://blog.csdn.net/z_ryan/article/details/79950737https://blog.csdn.net/phenics/article/details/777053实现细节请看:https://blog.csdn.net/songchuwang1868/article/details/90144080目录一、前言二、内存布局三、...转载 2019-05-08 14:40:51 · 14468 阅读 · 2 评论 -
32位系统能使用的内存大小以及PAE机制
以两个问题开始:32位系统中,堆上能分配的最大内存是多大? 32位系统下,如果有两个程序,每个程序new一个2g的空间可以吗?32位系统的地址空间最大为4G,也就是虚拟内存为4G,除去1G系统,用户能使用的内存最多为3G左右(windows内核较大,一般用户只剩下2G可用)。从另一个角度思考,在32位系统中的一个指针大小为4个字节,32位,最多可以寻址4G的空间,其中有1G的虚拟空间映射为...原创 2019-04-24 20:20:52 · 1913 阅读 · 0 评论 -
文件描述符file descriptor与inode的相关知识
https://blog.csdn.net/jnu_simba/article/details/8806654每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block)。task_struct中有一个指针(struc...转载 2019-04-27 09:33:03 · 844 阅读 · 0 评论 -
线程共享资源
1. 线程共享资源 如果说pthread_create函数跟fork函数是对应的,一个创建线程,一个创建进程。 但是进程调用fork创建进程的代价较高,调用的过程实际上非常复杂,即便是依靠写时复制机制,仍然需要复制诸如内存页表和文件描述符表之类的多种进程属性,这意味着fork调用在时间上的开销比pthread_create函数更多(关于fork函数参考:18-用fork函数创建新进程...转载 2019-04-17 14:52:43 · 1019 阅读 · 0 评论 -
Linux Slab机制
https://www.cnblogs.com/wangzahngjun/p/4977425.html1.内部碎片和外部碎片外部碎片什么是外部碎片呢?我们通过一个图来解释:假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。...转载 2019-04-17 10:06:48 · 403 阅读 · 0 评论 -
Linux时钟简析
http://blog.chinaunix.net/uid-14214482-id-2150038.html时钟的作用尽管与CPU指令执行没有什么直接关系,时钟对于操作系统来说还是有着很重要的意义:1、记录系统时间。很多应用程序需要知道日期和时间、由日期和时间构成的时间戳也会被打在文件上面、等等;2、统计功能。如top之类的用户程序可以查看一段时间内的系统负载、以及各个进程占用CPU...转载 2019-04-16 09:28:54 · 471 阅读 · 0 评论 -
内存映射文件原理探索
https://blog.csdn.net/mg0832058/article/details/5890688一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。原理首先,“映射”这个词,就和数学课上说的“一一映...转载 2019-04-12 11:11:20 · 166 阅读 · 0 评论 -
深入解析条件变量
https://www.cnblogs.com/harlanc/p/8596211.html深入解析条件变量(condition variables)目录深入解析条件变量(condition variables)深入解析条件变量什么是条件变量(condition variables)一个例子关于上面例子的几个疑问为什么pthread_cond_wait需要加锁?...转载 2019-03-28 15:38:13 · 198 阅读 · 0 评论 -
read和write系统调用
read和write系统调用的使用是简单的,但实际上其封装了及其复杂的操作。因为Linux视一切的设备为文件,读写设备也被抽象成了读写文件。所以read和write系统调用下封装了复杂的对各种设备的读写操作。以read为例大体原理如下:read系统调用中,会根据用户传入的fd进行查表,发现相应的fd对应的到底是什么设备,再进入相应设备专有的read逻辑。比如fd是open file返回的磁...原创 2019-03-18 11:38:50 · 834 阅读 · 0 评论 -
Linux是如何避免内存碎片的?
https://blog.csdn.net/aurorayqz/article/details/79671785Linux是如何避免内存碎片的?在网上看到这个面试题,参考答案是这样的:伙伴算法,用于管理物理内存,避免内存碎片; 高速缓存Slab层用于管理内核分配内存,避免碎片。故继而去深入了解了一波,做了一个粗略的整理:内存碎片问题频繁地请求和释放不同大小的内存,必然导致...转载 2019-04-25 16:43:12 · 848 阅读 · 0 评论 -
C 标准IO 库函数与Unbuffered IO函数
原文:https://blog.csdn.net/jnu_simba/article/details/8806613先来看看C标准I/O库函数是如何用系统调用实现的。fopen(3)调用open(2)打开指定的文件,返回一个文件描述符(就是一个int 类型的编号),分配一个FILE 结构体,通常里面包含了:FILE结构体{ 文件fd 缓冲区指针 ...转载 2019-04-30 14:38:50 · 478 阅读 · 0 评论 -
C 标准库IO缓冲区和内核缓冲区的区别
https://blog.csdn.net/jnu_simba/article/details/8806712目录1.C标准库的I/O缓冲区2. 用户程序的缓冲区3.内核缓冲区1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也...转载 2019-04-30 14:51:07 · 710 阅读 · 0 评论 -
多线程内存布局
关键在于区分与进程的内存布局。1、由一个栈切分出多个栈分配给不同的线程2、共用一份代码,但是各个线程的pc(指令寄存器)指向的代码不同原创 2019-05-12 18:52:54 · 1841 阅读 · 3 评论