
002-操作系统
文章平均质量分 73
操作系统
牛不才
c/c++ linux 后端 架构 搜索引擎
展开
-
数据高可用之双机架构
在https://blog.youkuaiyun.com/niu91/article/details/112330339 中所提及的mysql双机热备份,本文算是此篇文章的一个延申。1. 什么是高可用高可用或者说容灾,就是说当系统遇到突发情况或者故障的时候,能够保重业务不中断。一般的实现方案都是将数据(可以文件、数据库甚至是操作系统)冗余备份到多个存储设备上,出现故障时,备胎转正。下面介绍几种常见的双机方案。2. 主备这可能是最简单最容易让人想到的方案,备机备份主机数据,当发生故障时备机改为主机,...原创 2021-06-23 00:15:30 · 404 阅读 · 0 评论 -
Linux中的IO体系结构
Linux内核一个的主要作用就是管理硬件,而像键盘、鼠标、显示器、网卡、硬盘、打印机、CD/DVD等等这么多设备,形状、用法、处理速度、功能都不一样,该怎么统一管理起来呢?1. 一切皆文件在linux中一切皆文件,设备也不例外,设备文件放在dev目录下。应用程序可以像访问普通文件一样访问设备,内核vfs下面的驱动程序层和硬件实现具体的功能。ubuntu@VM-0-16-ubuntu:~$ ls -l /dev/total 0crw-r--r-- 1 root root原创 2021-05-20 01:05:17 · 548 阅读 · 0 评论 -
Linux 巨型页(HugePages)
1. 什么是巨型页页面是Linux管理内存的基本单位,一般为4KB。如果程序运行时,需要大量的内存,就会产生非常多的TLB未命中和缺页异常,4KB的尺寸显然称为程序的瓶颈。如果直接修改系统默认页面大小,那么系统中其他程序运行时,很可能又会造成内存浪费。所以,Linux引入了巨型页,这种巨型页允许管理远大于4k的大页面,默认是2M,相当于512个普通页面。简而言之,通过启用大页面,系统可以处理更少的页面表,因此访问/维护它们的开销也更少!巨型页的应用集中在对内存需求大的领域,比如数据库、虚拟机等系统中原创 2021-05-05 19:59:54 · 3356 阅读 · 0 评论 -
物理内存组织结构
内存管理在内核中占据着举足轻重的地位,毕竟它是用来处理处理器和内存之间的协作的,而后两者都是计算机中最为重要的资源。内存管理的目标就是高效合理的使用物理内存,不造成浪费。1. 体系结构在计算机发展初期,如上图,CPU通过总线访问整个地址空间,这是一种简单经济的方式,可以尽可能使用内存。但是这个系统本身也存在伸缩性的问题,因为总线的宽度是有限的,这也限制了处理器的数量。如果添加CPU,会引起以下两个问题CPU增加,每个节点的可用带宽会减少 CPU增加,总线长度会增加,进而增加了延迟于.原创 2021-05-04 15:44:13 · 1578 阅读 · 2 评论 -
反碎片技术和虚拟可移动区域
Linux在内存管理上,存在一个问题,那就是在系统运行很长一段时间后,物理内存中的碎片会越来越多。1. 内存碎片整理1.1 什么是内存碎片呢?内存碎片分为两种,一种是内存页中的碎片,被称为内部碎片;另一种是空闲分散的内存页,凑不齐一个组物理地址连续的空闲内存页,就没办法分配了,这些散落的内存页被称为外部碎片。1.2 内核引入的反碎片技术2.6.23 引入成块回收,3.5版本后废除,被碎片整理程序取而代之 2.6.33 引入虚拟可移动区域其中,不管是成块回收还是碎片整理,它们.原创 2021-05-03 23:35:00 · 1220 阅读 · 8 评论 -
进程
1. 什么是进程在 《面对多任务处理、程序员是怎样榨干计算机资源的》提到,不管是进程、线程、协程都是用来处理用户任务的。从内核角度来看,进程就是用来分配CPU、内存等资源的。后来觉得进程分配CPU时间片太重了,于是轻量级进程、线程就出现了,成了CPU调度的基本单位,但是资源分配的基本单位还是进程。通俗的讲,进程被定义为程序运行的一个实例。为了管理进程,内核引入了一个进程描述符的数据结构。2. 进程的生命周期(状态)进程描述符中的state字段描述了进程所处的状态。粗略的看,进程要...原创 2021-05-03 21:07:09 · 183 阅读 · 0 评论 -
页表
1. 虚拟和物理地址空间每个进程的内存地址空间在大多数情况下要比系统中可用的物理内存要大。内核要考虑将实际内存划分给进程需要的地址空间,最可取的一个方法就是加一个页表。页表来为物理地址分配虚拟地址,进程的地址空间则用虚拟地址表示。如下图所示,不同进程的同一个虚拟地址可能会映射到同一个物理内存页(通常称为页帧)上,它们的含义是不同的。2. 页表页表的作用就是将虚拟地址空间映射到物理地址空间。那么最容易让人想到的办法就是使用一个数组,但在实际应用中最普遍的是多级分页。2.1 数组页表.原创 2021-05-03 11:12:08 · 2538 阅读 · 0 评论 -
指令重排和优化屏障
1. 优化带来的烦恼用过GCC编译的同学应该知道GCC有O0、O1、O2、O3等优化选项,启用这些选项往往可以提高程序的运行效率,但它并不是万无一失的,尤其是在多线程场景下。而这些优化背后的技术正是指令重排。因为编译器或处理器也很难确定代码逻辑的原本意图。锁能够保持原子性,但是经过编译器优化之后的代码,并不是绝对时序正确的,况且处理器还有可能进一步优化。这里面最经典的一个例子就是单例模式,Double-Checked Locking is Fixed In C++11 。2. 内核提供的解决方案原创 2021-04-30 19:14:44 · 918 阅读 · 3 评论 -
RCU
1. 什么是RCURCU(Read-Copy-Update),是一种同步机制,它虽然对内存有一定的开销,但是它的性能非常好。在Linux内核中随处可见它的身影。2. RCU的工作机制RCU下,会记录指向共享结构体指针的所用使用者。这个结构体将要被修改时,首相将会创建一个副本,然后把改动写入副本当中。当所有的读操作使用者访问结束之后,指针指向新的修改后副本的指针,副本就这么上位了,修改也就是最新的了。基本原理是很简单的,一个备胎而已,空闲时上位而已。要是支持多任务读写并发,就复杂些了。3. 适原创 2021-04-30 19:09:09 · 1316 阅读 · 1 评论 -
eventfd
1. 简介eventfd - create a file descriptor for event notificationeventfd是通过事件通知机制。int eventfd(unsigned int initval, int flags);eventfd创建一个“eventfd对象”,可以用作事件等待/通知机制由用户空间应用程序和通知用户空间应用程序事件的内核。这个对象包含由内核维护的无符号64位整数计数器。此计数器已初始化使用参数initval中指定的值。eventfd()返回一原创 2021-04-27 19:49:06 · 1922 阅读 · 0 评论 -
epoll IO事件通知机制
下面是官方的手册,直译的话,太拗口,我就按照自己的理解翻译了。DESCRIPTION The epoll API performs a similar task to poll(2): monitoring multiple file descriptors to see if I/O is possible on any of them. The epoll API can be used either as an edge-trig...翻译 2021-04-22 23:15:05 · 613 阅读 · 0 评论 -
select和epoll的实现机制
1. TCP三次握手和监听套接字的两个队列1. 未完成队列(SYN_RCVD状态)当第一次握手之后,在未完成队列上建立条目2. 已完成队列(ESTABLISHED状态)三次握手成功之后,该条目转移到已完成队列,accept能够返回。int listen(int sockfd, int backlog);其中backlog这个参数大概为这两个队列总和的最大值,最大值可能是1.5*backlog,这是一个模糊因子。每次握手之间的时间RTT通常为187ms左右。accept由.原创 2021-04-18 23:10:31 · 747 阅读 · 0 评论 -
网络IO模型
1. 什么是网络IO网络IO和磁盘IO一样,也是IO的一种。磁盘IO是磁盘-->内核-->应用程序,同样网络IO是网卡-->内核-->应用程序。简单理解,就是操作系统收到网卡的数据,然后缓存到一个缓冲区buffer中,然后应用程序调用系统函数,从buffer中取数据。访问IO的方式,也就是通常所说的IO模型,大致有五种,分别是阻塞IO、非阻塞IO、多路复用IO(selecet\poll\epoll等)、信号驱动IO以及异步IO。《Unix网络编程》一书中都有提及,本.原创 2021-04-18 07:05:05 · 184 阅读 · 0 评论 -
io多路复用 select/poll/epoll 简介
一个服务器,有多个客户端访问。可以每个请求都开启一个线程处理。缺点:多线程的弊端,CPU需要不停的切换上下文,过程繁琐,消耗资源多单线程IO多路复用在linux中每一个网络连接都可以看成是一个文件描述符,一切皆文件。1.selectfdset是一个bitmap,每一位标志了对应fd是否有数据变化。select监听fdset,当有数据变化时,返回fdset。四个常用宏:FD_ZERO(&set);//将套接字集合清空FD_SET(s, &set);//将给定的套接字添加到原创 2021-04-15 09:34:12 · 120 阅读 · 0 评论 -
面对多任务处理、程序员是怎样榨干计算机资源的
你是否经常遇到这样的问题?“进程和线程有什么区别?请简述下对协程的认识?”等等。当然这些问题可谓是老生常谈。但是我想,如果我们从计算机发展史的角度,回答这些问题,会不会更容易让人理解呢?1. 批处理操作系统故名思意,这个时期的操作系统非常简单,同一时间只能处理一个任务/作业。把作业载入到内存中,这个处理完了,再处理下一个,一批一批的串行执行。这个时候,就没有什么进程、线程的概念了。因为IO设备比CPU慢太多了,所以它的缺点也很明显,CPU使用率不高,很多时候都是处于空闲状态。比如有两...原创 2021-04-12 20:46:51 · 388 阅读 · 1 评论 -
从“new和malloc的不同”出发看CC++的内存分配
1. 问题的引入new和malloc有什么不同?这是一个很经典的问题。他们共同点是,都是用进行动态内存分配的,但实现的方式不同。其中最根本的不同是,new是一个C++的操作符/关键字,而malloc是C/C++中一个函数。基于这个原因,它们又有以下的不同1. 参数,malloc需要指定申请内存的大小,new不需要,它会自己计算类中成员变量所占内存的大小2. 返回值,new返回类对象类型的指针,malloc返回void*3. 如果内存分配失败,new抛出std::bad_all...原创 2021-04-11 22:43:08 · 340 阅读 · 0 评论 -
服务器出现大量TIME_WAIT状态怎么解决
1. TIME_WAIT产生的原因1.1 四次挥手假设主动关闭连接的一方为A,被动关闭连接的一方为BA调用close();协议层发送FIN包B收到FIN包后,回复ACK,进入CLOSE_WAIT状态,A等待对方关闭,进入FIN_WAIT_2状态,此时,A会等待B的应用程序调用close操作B在完成所有数据发送后,调用close()操作;此时,协议层会发送FIN包给A,然后等待对方的ACK,进入LAST_ACK状态;A收到FIN包,回复ACK,进入TIME_WAIT状态;B收到ACK后,进入原创 2021-04-10 18:51:03 · 5017 阅读 · 0 评论 -
缓存置换算法
在缓存设计中,一个非常重要的问题就是,当缓存空间满了的时候,新的条目要加进来,要置换出哪个的旧条目呢, 这就是缓存置换算法。缓存置换算法的目标是,每次都将将来使用频率最低的数据置换出去。最朴素的置换算法,随机置换。即当有新条目要写入时,随机置换出一个就条目。另外一种策略是先进后出(First In Last Out),这种看似要比随机强,实际都差不多,只是不是随机而是把最久的条目置换掉了。一般会使用栈这种数据结构来实现。 最近未使用(Not Recently Used),这也是一种简单有效的算法。它所原创 2021-04-01 23:11:06 · 632 阅读 · 0 评论 -
操作系统中线程的调度
1. 先到先服务FCFS和去银行办业务一样,大家站队或者取号,先来的先办业务。这是我们能够理解的很朴素的公平主义。对应到代码实现,可以使用有先进先出特性的队列来实现。但对于操作系统而言,有一种情况下这种实现就很差劲。比如,有一个任务A需要执行一个小时,另外N个任务B执行几十秒就能完成。如果任务A先执行,那么N个任务B必须等到A执行完毕之后,才能依次执行。这对于用户来讲,体验显然是非常差的。于是就有了下面的方案。2. 短作业优先SJF短作业优先,可以是平均等待时间最短。用户体验一般和等待时间成正比,越久原创 2021-03-30 22:24:38 · 1135 阅读 · 0 评论 -
RPC
RPC(Remote Procedure Call),远程过程调用。通俗的讲,就是本地的应用调用远程服务的方法。从这个广义的角度讲restful也属于一种rpc,但通俗的来它们是不同的实现。我们在选择技术方案的时候,可以根据不同的场景做出选择。1. Restful .Pk. RPCRestful的优势:可读性,一般时json格式。基于http,可以获得防火墙的支持,比如屏蔽某些访问。这两点保证了它能供轻松的支持跨语言的通信。Restful的劣势:成也HTTP,败也HTTP。REST中有效信息占比少原创 2021-03-20 15:03:34 · 150 阅读 · 0 评论 -
linux 读写锁
概述在某些场景下,读数据操作比写数据操作要频繁,那么可以使用读写锁替代互斥锁来提高应用程序的性能。读写锁的访问规则如下:多个线程共享读操作权限没有读或者写操作时,才可以执行写操作主要操作#include <pthread.h>int pthread_rwclock_rdclock(pthread_rwlock_t *rwptr);//加读出锁,如果读写锁被一个写入者持有则堵塞int pthread_rwclock_wrclock(pthread_rwlock_t *r.原创 2021-02-08 19:06:18 · 243 阅读 · 0 评论 -
docker基本原理和安装使用
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的yum install -y yum-utils device-mapper-persistent-data lvm2设置源, 优先国内,速度快yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum-config-manager \ .原创 2021-01-21 22:23:24 · 118 阅读 · 0 评论 -
HDFS分布式文件系统简介
分布式文件系统(Distributed File System,DFS),通过网络连接大量主机,将不同的磁盘、不同逻辑分区的数据组织在一起,提供海里的数据存储, 一般是PB级别(1PB=1024TB,1TB=1024GB),这是单机存储所无法比拟的。Google File System 是谷歌三大论文之一,而HDFS(Hadoop Distributed File System)是它的一种重要实现。另外一篇论文BigTable 则为这个文件系统提供了搜索支撑。谷歌确实是很牛的一家公司。G..原创 2021-01-20 20:48:39 · 244 阅读 · 0 评论 -
cpu亲和性
1. 概述CPU亲和性,是指进程在指定的CPU长时间运行,而尽量不向其他CPU迁移。在多核CPU的机器上,每个CPU都有自己的缓存,如果进程不显式的绑定CPU,那么有可能在操作系统的调度下,在不同的CPU之间切换,那么原先CPU上的缓存数据就没什么用了,新CPU上的缓存又没有之前的数据,这就造成了缓存命中率降低。如果设置了CPU亲和性,一个进程绑定了CPU之后,那么缓存的命中率就能保持在一个较高的水平,从而提高程序性能,这就是为什么要设置CPU亲和性的原因。另一个好处是提高特定进程调度的优先级,比如原创 2021-01-14 18:31:46 · 3495 阅读 · 2 评论 -
linux常见的性能分析工具和方法
查看系统负载 uptime[root@localhost ~]# uptime 10:18:27 up 6 days, 17:24, 3 users, load average: 0.00, 0.01, 0.05当前时间、系统已经运行了多长时间、有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。平均负载的最佳值是1,这意味着每个进程都可以立即执行不会错过CPU周期。单核CPU,1-2是正常的,多核CPU,核心数为n,那么n-2n之间也是正常的。free 查看空闲内存和已使.原创 2021-01-11 21:52:58 · 359 阅读 · 0 评论 -
MySQL双机热备
主机: 192.168.1.22[root@localhost ~]# mysql -Vmysql Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1从机: 192.168.1.148[root@kafka3 opt]# mysql -Vmysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.10. 准备,原创 2021-01-07 19:05:31 · 731 阅读 · 6 评论 -
数据库的存储结构
B树和B+树主要用于构建磁盘中的高速索引,比如文件系统和数据库。数据库中数据的储存主要有两种方式,一种是行存储,一种是列存储。行存储,就是数据库中的一行数据存储在一段连续的磁盘块上。同理,列存储,就是一列数据存储在一起。行存储的优点就是,单挑记录集中,适合事务。缺点是,聚合查询慢。因为聚合涉及多条行记录,那么就要从磁盘的多个非连续的块中读取数据。多次IO访问,导致查询慢。列存储的有点是,聚合查询快,聚合计算快。因为它的列数据是放在一起的,IO读取一次或几次,就能把数据加载到内存。缺点也很明显原创 2021-01-06 21:52:44 · 4978 阅读 · 0 评论 -
centos安装vmware
下载vmware 如下选一个版本即可http://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-15.0.0-10134415.x86_64.bundlehttps://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-16.0.0-16894299.x86_64.bundle安装,秘钥仅供参考,命令如下[root@local..原创 2020-11-11 01:20:06 · 483 阅读 · 1 评论 -
centos安装配置vnc
目的, windows主机可以远程访问centos主机。当然,只要安装了vnc客户端之后,都能访问。在centos上查看是否安装vnc[root@localhost ~]# rpm -qa |grep vnctigervnc-icons-1.8.0-19.el7.noarchtigervnc-server-minimal-1.8.0-13.el7.x86_64gtk-vnc2-0.7.0-3.el7.x86_64gvnc-0.7.0-3.el7.x86_64tigervnc-1.8.0-原创 2020-11-06 11:32:15 · 550 阅读 · 0 评论 -
虚拟机从workstation上载到vSphere(Exsi)的注意事项
1. 版本兼容问题现在虚拟机使用的版本是15,而虚拟化平台是5.0版本相对较老。在迁移虚拟机之前,要做更改下版本,使之兼容。具体做法如下在vmware中关闭需要迁移的虚拟机,右键【管理】->【更改硬件兼容性】,选择对应的版本。版本之间的差异在于硬件的支持,从[限制]一栏中能看到具体差异。进行【下一步】, 创建克隆会保证原有虚拟机不变,可留作历史备份,如果确定要迁移而不是复制可选第二项【更改此虚拟机】,试具体情况而定。转换完成之后,右键【管理】->【上...原创 2020-10-28 22:43:28 · 2334 阅读 · 0 评论 -
C++内存管理之Linux进程的内存布局
C++开发中会遇到各种内存问题,进程在内存中布局是必备的知识。如下图所示,这是最经典的内存布局图。Linux中的虚拟地址空间系统中运行这各种不同的进程,但是内存就那么多,他们是怎么共享内存地址空间的呢?难道不会发生内存的践踏和争夺吗?如果系统中只运行一个进程,那么就不会发生这种情况了。虚拟内存技术就解决了这个问题,它可以使得每个进程独占内存空间。当然所有进程还是共享物理内存的,操作系统会...原创 2019-05-29 19:44:28 · 412 阅读 · 0 评论 -
leetcode 词频统计
写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和 ' ' 。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。示例:假设 words.txt 内容如下:the day is sunny the thethe sunny is is思路:1. tr 把空格全部转换成换行2. sed把空行全部过滤...原创 2018-07-08 21:20:24 · 905 阅读 · 0 评论 -
Linux重定向到文本文件遇到的诡异问题
想把 service iptables status 的信息重定向到文本文件info.txt中,我尝试了1. service iptables status 2>&1 > info.txt 结果在info.txt只有第一行的内容2.service iptables status 2>&1 >> info.txt 结果能把信息重定向到info.txt中,...原创 2018-04-09 17:19:10 · 2668 阅读 · 0 评论 -
制作centos-livecd
安装livecd-tools#yum -y install livecd-tools如果安装过程中报错,镜像网站不可用。要重新配置yum源, 替换成中科大的mirror,可以参考https://lug.ustc.edu.cn/wiki/mirrors/help/centos 替换/etc/yum.repos.d/CentOS-Base.repo之前,记得备份。 如果这样还是安装失败原创 2017-03-29 18:10:37 · 8227 阅读 · 0 评论 -
yum基本知识
使用yum,可以在线安装或者升级linux(redhat、centos,fedora)上的软件。使用yum,首先需要配置到合适的yum server上。有些镜像网站,可能不能访问或者距离太远升级软件包时太慢,我们就可以重新设置新的镜像网站。[base]name=CentOS-$releasever - Basemirrorlist=http://mirrorlist.centos.原创 2017-03-28 10:23:13 · 457 阅读 · 0 评论 -
centos配置--常用命令
2017年3月6日 11:43:07chkconfig 管理程序的运行级别如:设置防火墙默认不开启chkconfig --level 35 iptables off运行级别 3(命令行),5(界面)不开启iptables2. 配置网卡虚拟机网卡模式 桥接自己手动设定IP配置网卡cd /etc/sysconfig/network-scrip原创 2017-03-06 11:48:53 · 326 阅读 · 0 评论 -
C++和C运行库
1.linux C 运行库 libc.so/libc.aC++ 运行库 libstdc++.so/libstdc++.awindows C运行库libcmt.lib/msvcr90.dll 90指的是版本,新版本可能是100或者110后缀C++运行库libcpmt.lib/msvcp90.dllC++的运行库依赖C的运行库[root@localhost home]#原创 2017-03-02 14:39:00 · 1555 阅读 · 0 评论 -
主机条目结构
#include#include#include int main(int argc,char *argv[]){ char **pp; struct in_addr addr; struct hostent *hostp; if(argc != 2) { fprintf(stderr,"usage:%s \n",argv[0翻译 2016-01-28 22:00:28 · 675 阅读 · 0 评论 -
点分十进制转换
#include #include #include /*int inet_aton(const char *cp, struct in_addr *inp);in_addr_t inet_addr(const char *cp);in_addr_t inet_network(const char *cp);char *inet_ntoa(struct in_addr in);st原创 2016-01-28 20:32:04 · 2517 阅读 · 0 评论 -
unix大小端转换函数
//互联网上可以有不同主机字节顺序,Unix提供了四个函数进行转换#include#include#include int main(){ //网络字节顺序 network byte order 大端字节顺序 //主机字节顺序 host byte order 小端字节顺序 //ntohl htonl 32bytes //ntohs htons 1原创 2016-01-28 18:07:30 · 1886 阅读 · 0 评论