- 博客(69)
- 收藏
- 关注
原创 什么是内存屏障?,为什么需要内存屏障?
原文链接1.什么是内存屏障?,为什么需要内存屏障?首先,为了性能编译器和处理器都会对指令进行重排序。什么是内存屏障:内存屏障是一条指令,该指令可以对编译器(软件)和处理器(硬件)的指令重排做出一定的限制,比如,一条内存屏障指令可以禁止编译器和处理器将其后面的指令移到内存屏障指令之前。为什么需要内存屏障:编译器和处理器指令重排只能保证在单线程执行下逻辑正确,在多个线程同时读写多个变量的情况下,如果不对指令重排作出一定限制,代码的执行结果会根据指令重排后的顺序产生不同的结果。指令重排后的顺序每次
2021-06-20 22:53:58 3270
原创 volatile关键字总结
volatile起源volatile是用来处理memory-mapped I/O(MMIO),带来的问题,在引入MMIO之后,一个内存地址既可能是真正的内存,也可能是被映射到一个I/O端口。相对于读写一个内存地址,即有可能是读写真正的内存,又有可能是读写的是一个I/O设备。考虑如下情形,int *p = some address;int a, b;a = *p;//读操作b = *p...
2019-09-11 09:44:47 174
原创 reinterpret_cast的一种用法
1.代码展示 // FreeList uses Node array to store Node* struct FreeList { typedef T* pointer; typedef pointer* ppointer; FreeList() = default; void push(pointer ptr) { ...
2019-08-28 17:26:40 320
原创 进程间通信
1.管道创建一个管道,一端关闭读,一端关闭写。只能在有血缘关系的进程之间使用,例如父子进程和兄弟进程。2.信号量信号量用于进程间同步,分为P,V操作。P:如果信号量的值大于0,就将其减1;如果信号量的值等于0就将进程挂起。V:将信号量的值加一,如果有进程是因为等待该信号量而挂起就将其唤醒。3.共享内存共享内存是将两个进程的地址空间映射到同一块内存上。共享内存没有提供同步操...
2019-08-24 10:46:13 140
原创 单例模式
1.概述单例模式用来保证某一个类只可以产生一个实例化对象。单例模式不把拷贝构造和赋值运算符置空,就没有完全保证单例,用户可能会不小心用了赋值。2.示例代码double check减少锁竞争。class Singleton{private: Singleton() = default; Singleton(const Singleton&) = delet...
2019-08-23 11:25:15 105
原创 工厂模式-简单工厂、工厂方法
1.预备知识单一原则:类的职责单一,一个类只有一个让其修改的原因。开放封闭原则:对扩展开放,对修改关闭。表现为增加需求,是增加代码而不是修改原来的代码。依赖倒置原则:面向接口编程,而不是面向实现编程。高层模块不依赖于具体底层的实现,只依赖于底层提供的接口,换一个提供相同接口的底层模块,高层模块可以不用改变代码。2.简单工厂模式一般通过工厂类的静态方法得到运算符对象,所以也成为静态工...
2019-08-22 21:59:31 215 1
原创 epoll分析
本文主要从epoll的三个主要调用epoll_create, epoll_ctl, epoll_wait进行分析1.epoll_create1.1 使用方式 int epoll_create(int size)创建一个epoll的文件描述符。1.2 源码分析//epoll_create的源码,主要做的事情是创建一个eventpoll和file结构体。//eventpoll结构体中主...
2019-08-21 11:53:27 126
原创 系统调用的实现
1.系统调用过程概述系统调用主要通过int指令和iret指令实现,用户态代码与内核态代码的切换。int指令,产生一个软中断,进入内核态,cpu去中断向量表中查找中断处理例程。ret指令,从内核态返回到用户态。过程:系统调用通过把参数放入寄存器,通过int指令产生一个软中断,保护现场,将寄存器的值压入堆栈,cpu去执行中断处理例程,然后根据系统调用表,找到相应的系统调用,进行系统调用,...
2019-08-19 22:19:48 397
原创 UDP与TCP
1.UDP1.1 UDP概述用户数据报协议首部只有源端口、目的端口和校验和;也就是说UDP只提供了进程之间的通信和差错校验。UDP是无连接的,发送数据之前不需要建立连接,减少了发送数据之前的时延。UDP是不可靠的,尽最大努力交付的。UDP是面向报文的,它直接把应用程序交下来的报文加上UDP首部之后,直接交给ip层。所以应用程序必须选择合适大小的报文,避免ip分片,降低IP层效率。U...
2019-08-18 11:40:48 120
原创 线程间同步
1.互斥量1.1 实现原理为了实现互斥锁操作,大多数体系结构提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令所以是原子操作,同时在多处理器平台,一个处理器的交换指令在执行时,另一个处理器的交换指令只能处于等待状态。伪代码如下,mutex变量为1表示为空闲状态,为0表示为上锁状态。lock: movb $0, %al swap(mu...
2019-08-16 17:19:32 108
原创 leetcode题解-在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置1.题目分析1.很典型的二分查找,二分查找的主要是要找到一种策略,舍弃掉另一半不可能的数据。2.在本题中出现了一种情况,eg: low = 1, high = 2, mid = 1; 而且 nums[low] = nums[high] = target;在寻找上界的时候,由于mid可能会是上界,所以只能令low = mid; 结果陷入死循环;...
2019-08-15 20:41:38 163
原创 僵尸进程与孤儿进程
1.预备知识wait函数wait函数主要有两个作用;父子进程间的同步和父进程得到子进程的退出状态并对子进程进行清理工作init进程它是第一个用户级进程,负责启动其他系统进程和清理孤儿进程等2.僵尸进程2.1 产生原因系统为了让父进程可以得到子进程的退出状态,当子进程退出时,系统回收子进程占用的内存和打开的文件等资源,但是子进程的结构体task_struct仍然存在,...
2019-08-15 17:50:22 103
原创 leetcode题解-最长有效括号
最长有效括号1.题目分析1.这种最长子串一般用dp实现,是以某个位置结尾,以某个位置开始;也可能会从后往前推。2. 括号匹配,经常会使用栈;运算符中有括号也会使用栈。2.示例代码dp实现class Solution {public: int longestValidParentheses(string s) { //以某个位置结尾的长度 ...
2019-08-14 22:04:41 101
原创 Linux文件系统-VFS(Virtual Filesystem)
linux支持各种各样的文件系统格式,如ext2,etx3等;不同的磁盘分区可以采用不同的磁盘格式。然而这个文件系统都可以mount到某个目录下,我们可以看到统一的文件目录,使用ls和对文件的读写操作看起来都是一样的。这是因为Linux内核在各种不同的文件系统之上做了一个抽象层,使得各种文件系统用起来都一样,这个抽象层称为虚拟文件系统(Virtual Filesystem)1.内核数据结构...
2019-08-14 21:05:55 243
原创 linux文件系统-ext2文件系统
文件系统的作用就是怎么管理磁盘上存储的文件,包括增删改查等,本文主要介绍ext2文件系统1.ext2文件系统的整体布局文件系统管理的单元是数据块,每个块的大小是一样的;上图中的启动块 Boot Block中存储的是磁盘分区信息和启动信息,不属于ext2文件系统,启动块之后才是文件系统的开始;ext2文件系统将整个磁盘分区划分成若干个同样大小的块组。超级块(Super Block)描...
2019-08-14 19:59:17 452
原创 HTTP与HTTPS的区别-SSL协议
1.HTTP与HTTPS的区别HTTP与HTTPS都是应用层的协议,HTTPS在HTTP层下面加了一个SSl子层。HTTPS = HTTP + SSL要使用HTTPS,就要使用SSL(安全套接字)进行编程。例如:SSL子层的作用:在发送方,将来自应用程序的数据进行加密,然后交给TCP套接字。在接受方,将来自TCP套接字的数据进行解密,然后交给应用程序。2.SSLSSL提供...
2019-08-13 20:19:50 148
原创 数字签名与数字证书
1.数字签名数字签名并不是写下发送者的签名,而是数字签名可以起到类似于签名的作用,数字签名是一个抽象的概念,作用如下接受者能够确保接受到的报文是某个发送者发送的。接受者能够确信报文没有被修改过。发送者事后不能抵赖对报文的签名。公钥算法不等于数字签名,它只是一种实现数字签名的方式。如上图所示,A使用自己的私钥对报文进行加密的过程就是对报文进行签名的过程。在接受者能确保自己拿...
2019-08-13 17:06:57 154
原创 leetcode题解-24.两两交换链表中的节点
题目连接:两两交换链表中的节点1.方法一a. 题目分析交换最开始的两个节点,后面的逻辑应该是一样的,所以可以用递归来实现。b. 示例代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) ...
2019-08-07 22:54:30 100
原创 leetcode题解-23.合并k个排序链表
合并k个排序链表1.题目分析1.应该要想起之前合并过两条链表,那么我们就可以采用分而治之的方法。2.可以使用一个最小堆,把所有的节点都压入其中,依次取出。2.示例代码思路一,分而治之/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *nex...
2019-08-06 22:37:57 118
原创 function类模板
1.使用场合C++语言有多种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用符的类。这些可调用对象具有不同的类型,可能具有相同的调用形式,有时候我们希望把它们看做具有相同的类型。eg:int add(int i, int j){ return i + j;}auto mod = [](int i, int j){ return i % j; }...
2019-08-04 17:29:01 332
原创 标准库bind函数
1.作用bind可以看做一个函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表。2.语法 auto newCallable = bind(callable, arg_list);arg_list是一个逗号分割的参数列表,对应给定的callable参数。当我们调用newCallable时,newCallable会调用callable并传递给它arg_list中的...
2019-08-04 16:59:13 199
原创 C++运行时类型设别(run-time type identification, RTTI)
1.dynamic_cast运算符作用将基类的指针、引用安全地转化为派生类的指针和引用。(下行转换)使用场合我们拿到了一个基类的指针或引用,我们想执行某个派生类的操作但是该操作不是虚函数。语法示例 Derived* dp = dynamic_cast<Derived*>(bp); //转换失败得到一个空指针 Derived& d = dynamic_cast&...
2019-08-04 15:55:16 194
原创 C++11 auto类型推断和decltype
1.auto类型推断a.引入原因编程时,经常需要将表达式的值赋给变量,这就要求我们在申明变量的时候,明确知道表达式的类型,然而要做到这一点并不容易,于是引入auto让编译器帮我们去做类型分析。b.使用注意事项 const int const_i = 1, &const_ref = const_i;auto在做类型推断时,顶层const被忽略掉。 auto b = cons...
2019-08-04 11:35:18 160
原创 C++ lambda表达式
1.引入原因我们可以对算法传递可调用对象,例如find_if,但是算法只能接受一元谓词或者二元谓词,但是有时候我们希望可调用对象的参数个数会超过算法的要求,这个时候我们可以使用lambda表达式的捕获列表来添加我们的参数。eg:find_if接受的是一元谓词,我们可以通过lambda的捕获列表多操作一个参数。如下代码,通过捕获列表,多操作了一个sz参数。 int sz = 5; vecto...
2019-08-02 23:22:37 99
原创 C++的右值引用
1. 语法 int& left_ref; int &&right_ref;2. 引入目的右值引用引入了两个语义,移动语义(move sementice)和精确传递(perfect forward).右值是即将销毁的对象,在某些场合例如拷贝的时候,我们想直接使用它的资源而重新申请资源。所以我们要区别对待左值和右值,实现函数重载,所以引入。精确传递是函数参数传递...
2019-08-02 13:24:05 180
原创 C++中static_cast、const_cast、reinterpret_cast和dynamaic_cast
1.static_cast主要使用场合当把一个较大的算术类型转化为一个较小的算术类型时,使用告诉编译器,我们不在乎精度损失,从而关闭编译器的警告 double d = 9.3; int i = d; //warning:可能丢失数据。有的编译器也不提示。 int i = static_cast<int>(d);//no warning对于编译器无法自动进行的类型转换...
2019-08-01 23:45:26 237
原创 C++程序_main函数之前与之后
一. main函数之前程序执行之前装载器会把环境变量和用户的命令行参数压入栈中。环境变量:系统的公用数据,例如系统搜索路径和当前OS版本等。初始化堆向系统申请内存,构建malloc的底层内存管理结构。初始化IO在用户空间建立stdin,stdout,stderr等对应的FILE结构,使得程序进入main函数之后就可以执行printf,scanf等函数。全局对...
2019-08-01 11:33:06 374
原创 leetcode题解-18.四数之和
四数之和:link1.题目分析类似于三数之和,在本题中我么要固定两个数,去寻找满足条件的另外两个数,注意去除重复的组合。2.示例代码class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin()...
2019-07-30 22:51:03 105
原创 leetcode题解-17.电话号码的数字组合
电话号码的数字组合:link1.题目分析组合方式随着数字的增多是呈现为树状发散的方式,主要就是代码实现了。2.示例代码class Solution {public: vector<string> letterCombinations(string digits) { map<char, string> num2characters = { {'1', "...
2019-07-30 21:58:27 244
原创 leetcode题解-16.最接近的三数之和
最接近的三数之和:link1.题目分析这个题和leetcode15题三数之和一样的思路,固定一个数,然后去寻找另外两个数,找到满足要求的的更新解。2.示例代码class Solution {public: int threeSumClosest(vector<int>& nums, int target) { //固定一个,另外两个是活动的...
2019-07-29 23:10:45 123
原创 常用Linux命令总结
1.文件查找在指定目录查找文件find 命令 : find path -name <filename>2.网络相关查看网络是否连通ping命令: ping ip地址查看系统网络状态netstat 命令: netstat -up/tp ,通常配合grep使用u : udp t: tcp p:program name...
2019-07-29 16:51:17 150
原创 leetcode题解-15三数之和
三数之和:link1.题目分析首先想到的是固定两个数最后去确定第三个数,时间复杂度为O(n2logn),最好的方法是固定一个然后使用twoSum的方法去寻找那两个,时间复杂度为O(n2),注意事项为要跳过重复的。2.示例代码class Solution {public: vector<vector<int>> threeSum(vector<int&g...
2019-07-28 22:38:06 97
原创 leetcode题解-13.罗马数字转整数
罗马数字转整数:link1.方法一从正向可以观察到,每一个独立的匹配都是贪心的匹配,为了避免使用大量的if 嵌套结构使用查表的方式。class Solution {public: int romanToInt(string s) { map<string, int> roman2int = { {"I", 1},{ "II", 2 },{ "III"...
2019-07-27 21:07:14 129
原创 leetcode题解-12.整数转罗马数字
整数转罗马数字:link1. 题目分析1,会第一时间想到查表。2.还有一种减少表大小的方法。reference2.示例代码class Solution {public: string intToRoman(int num) { // bit decade hundred thousand vector<string> bit = ...
2019-07-24 23:09:40 134
原创 leetcode题解-11.盛最多水的容器
盛最多水的容器:link1.题目分析1.找两个柱子使体积最大,双指针策略,指针移动的方式不人容易想到,参考link2.示例代码class Solution {public: int maxArea(vector<int>& height) { int ret = 0; int left = 0, right = height...
2019-07-23 23:03:39 214
原创 leetcode题解-10.正则表达式
正则表达式:link1.题目分析1.题目中是要s与p匹配,应该会想到动态规划,然后就是确定初始条件和怎样从前往后推。初始条件,前一个对一个不好处理的话,可以想下零个对零个的情况。递推分析case1if(s[i] == p[j] || p[j]) == '.') dp[i][j] = dp[i - 1][j - 1]; case2//有两种子情况if(p[j - 1] !...
2019-07-22 23:31:50 118
原创 leetcode题解-8.字符串转化为整数
字符串转化为整数:link1.题目分析1.题目不难,主要分三步;找到第一个非空字符,解析出符号,解析数字部分,使用long long防止溢出。2.示例代码class Solution {public: int myAtoi(string str) { //找到第一个非空字符 int i = 0; while(i ...
2019-07-20 22:39:47 85
原创 leetcode题解-9.回文数
回文数:link1.题目分析1.首先按照题意,负数是不可能是回文数的。2.反转一个数字可能会出现的是溢出,在本题中有三种方法处理溢出;法一:将数字转化为字符串tostr()函数。法二:使用long long类型作为转化后的数可以避免溢出。法三:只转化数的一半,reference2.示例代码class Solution {public: bool isPalindrom...
2019-07-20 22:05:20 655
原创 leetcode题解-7.整数反转
整数反转;link1.题目分析1.这个题主要的是溢出处理2.因为负数范围大1,所以全部转化为负数来处理。2.示例代码class Solution {public: int reverse(int x) { bool negative = (x < 0); x = negative ? x : -x; ...
2019-07-19 23:37:33 90
原创 leetcode题解-6.Z字型变换
Z字型变换:link1.题目分析1.思路比较简单,按题意将字符串分成几排,然后连接起来。2.主要的是怎样让代码清晰生成这样几个字符。2.示例代码class Solution {public: string convert(string s, int numRows) { vector<string> row_strings(numRows, ""...
2019-07-19 22:49:32 104
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人