- 博客(103)
- 收藏
- 关注
原创 五种典型IO模型学习笔记
五种典型IO阻塞IO非阻塞IO信号驱动IO异步IO前四种IO模型对比多路转接IO多路转接IO的实现模型select模型:阻塞IO阻塞IO: 发起IO调用后,若当前不具备IO条件则阻塞等待。流程非常简单,一次只能进行一个IO,多个IO的情况下,过程是串行的。进程对cpu利用率不高(因为可能有大量的时间在等待IO就绪)非阻塞IO非阻塞IO : 发起IO调用后,若当前不具备IO 条件,则立即...
2020-05-09 13:22:55 328 3
原创 c++头文件作用及前向声明作用
c++中.cpp的文件为源文件,.h的文件为头文件。c++支持分离式编译,即一个程序可以划分为几个部分,每个分别放在一个.cpp文件内,.cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件a.cpp中定义了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译,编译成目标文
2021-10-23 13:31:27 1090
原创 二分查找模版
基本二分查找,找到目标值int binary_search(vector<int>&nums,int target){ int left =0; int right = nums.size()-1; while(left<=right){ int mid = (right-left)/2+left; if(nums[mid]==target){ return mid; } else if(nums[mid]<target){ left =
2021-10-04 15:13:01 176
原创 python中__name__的属性
python 模块在创建之初会自动加载一些内建变量,name__就是其中之一。当模块被导入到别的文件中 name 可以标识模块的名字,可以显示一个模块的某功能是被自己执行还是被别的文件调用执行,如果运行本模块则是__main. 在别的模块内就是模块名。https://www.cnblogs.com/lyh233/p/12753423.html...
2021-09-16 13:42:24 196
原创 Python内存回收原理
概述引用计数为主,标记清除和分代回收为辅构成了python的内存回收机制.1. 引用计数1.1 环状双向链表 refchainpython中创建的任何对象都会加到refchain链表中.每个对象都会有一个结构体typedef struct _object { struct _object * ob_next; strcut _object * ob_prev; int ob_refcnt; struct_typeobject *ob_type; } PyObject;这个结构体里有上一个对象
2021-04-30 21:42:13 269 1
原创 zlib安装
zib底层时deflate算法. 详讲https://blog.csdn.net/ghevinn/article/details/45747465sudo yum install zlib-develgzFile gzopen(const char* path,const char* mode)path:要打开的gzip文件名mode:rb读/wb写返回值 : 返回一个gzFile指针,失败返回NULL .int gzread(gzFile file,void buf,unsigned le
2021-04-08 16:38:49 636
原创 同余定理
我们假设 2个不同的整数x、y,被一个整数k相除时,得到相同的余数,那么我就可以称x、y同余。x、y同余, 当他们相减时,余数就抵消掉了,剩下的那部分就是能被k整除。x=kv1+r1,y=kv2+r1x-y = k(v1-v2)在x-y = k(v1-v2) 即 (x-y能被k整除) 成立时,就能说明x、y对于k同余因为 x-y = k(v1-v2)所以x、y同余可以表示为x≡y(mod k)...
2020-12-03 12:26:00 490
原创 位运算技巧
x & (-x) 可以获取到二进制中最右边的 1,且其它位设置为 0。换句话说,此操作将 x 所有位取反,但是最右边的 1 除外。如何将二进制中最右边的 1 设置为 0:x & (x - 1)。
2020-11-23 10:15:24 111
原创 负整数的取模与取整的问题
a,b为两个整数,则 他们的商是 c= [a/b] 向下取整, 比如10/3 =3 对负数来说也是一样 10/-3 = -4 -3 /10 =-1 都是向下取整。而取模运算就是 r = a-(cb) 。比如 10 % -3 先算 c = [10/-3] =-4 然后 r= 10-(-4-3) =-2 ....
2020-11-23 09:20:02 1406
原创 vim打造成python开发工具
将vim打造成python开发工具1、创建vim插件工作目录[root@ray ~]# mkdir -p ~/.vim/bundle2、下载插件[root@ray ~]# cd ~/.vim/bundle[root@ray bundle]# git clone https://github.com/rkulla/pydiction.git3、将pydiction目录中的after目录拷贝到 /.vim/目录。当vim执行时,会自动执行/.vim/目录中的内容[root@ray bundle]
2020-07-17 16:47:44 297
原创 Python中的正则表达式用法
1.什么是正则表达式正则表达式可以使我们通过编程的方式让计算机具备在文本中检索某种模式的能力,是由一些字符和特殊符号组成的字符串,他们能够匹配多个字符串。这些特殊符号和字符就是元字符,正式它给予了 正则表达式灵活性。例如 . 匹配除\n的任意一个字符匹配0次或则多次前面出现的正则表达式这些元字符就不在这里过多赘述,百度一下正则表达式会有元字符大全,写的很详细,小伙伴们可以先科普一下,再看博文这样更好理解。我们主要介绍python中如何使用正则表达式。2.Python中如何支持正
2020-07-15 17:12:46 320
原创 web学习之-JavaScript笔记
JavaScriptb笔记JavaScipt是什么JavaScipt基础JavaScipt嵌入页面的方式JavaScipt变量命名JavaScipt数据类型及类型转换JavaScipt是什么JavaScipt是运行在浏览器上的脚本语言,主要用于解决的是前端与用户交互的问题,包括使用交互与数据交互,JavaScipt是由浏览器来执行的。JavaScipt基础JavaScipt嵌入页面的方式<!DOCTYPE html><html> <head> <m
2020-06-19 09:21:01 420
原创 web学习之-html
从今天起就要正式学习web相关知识了,写博客来记录我的心得。第一章当从html开始,超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。网页有三大内容 :1.标签 承载内容2.层叠样式表 渲染页面3.JavaScript 交互式行为。html基本格式:<!DOCTYPE html> 声明为 HTML5 文档 告诉浏览器我用html5的规范。<html> 开始标签 <head>
2020-06-10 20:45:42 229
原创 nginx启动报错问题
nginx: [alert] could not open error log file: open() “/var/log/nginx/error.log” failed (13: Permission denied)2020/06/05 14:19:42 [warn] 27204#0: the “user” directive makes sense only if the master process runs with super-user privileges, ignored in /etc/
2020-06-05 14:27:44 689
原创 Centos7.x系统下重置用户登录密码方法
1、开机后进入以下界面,然后按Esc或者E键编辑选项:2.添加相关命令行。3.按下Ctrl+X,以单用户模式启动,输入相关命令修改用户密码,mount -o remount,rw /sysroot 修改文挂载文件系统为可写入。chroot /sysroot 改变文件系统的root:参考文章链接:https://blog.csdn.net/userpass_word/article/details/81807316...
2020-05-15 16:48:09 726
原创 string的模拟实现
#pragma once#include<iostream>#include<cstring>using namespace std;#include<assert.h>//不用用free释放一段堆空间两次。因为可能释放完第一次后,操作系统把这块内存分配出去了,立即有释放会导致问题//创建一个类,编译器会默认生成六个函数//对空指针的解引用会照成异...
2020-04-30 14:07:46 127
原创 C++的类型转换
文章目录C语言中的类型转换缺点C++中的类型转换四种转换操作符详讲C语言中的类型转换缺点c语言中的类型转换的可视性比较差,所有的转换都是相同的写法,难以跟踪错误的准换C++中的类型转换标准C++为了加强类型转换的可视性,引用四种命名的强制类型转换操作符:static_cast . reinterpret_cast ,const_cast,dynamic_cast.四种转换操作符...
2020-04-28 18:32:55 143
原创 Shell里sort详讲
Linux里的sort是一个可执行程序,位于/usr/bin/sort,它的功能就是将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。sort -u 文件名在输出行中去除重复行sort -r 文件名sort默认的排序方式是升序,如果想改成降序,就加个-r。sort -o 文件名由于sort默认是把结果输出到标准输出,所...
2020-04-13 09:25:42 582
原创 淘宝网店一变相日期计算器
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。现在给你一段时间区间,请你帮他计算总收益有多少。链接:https://www.nowcoder.com/questionTerminal/754921e9c98b43d1b2d70c227b844101来源:牛客网输入描述:输入包含多组数据。每组数据包含两个日期from和to (...
2020-04-08 10:11:38 276
原创 [C++] 算数运算(取余、取商)
主要分析除法运算符和求余运算符。除法运算符/主要用于对两个整数进行求商。并且商一律向0取整(即直接切除小数部分)求余运算符就比较复杂了如果m和n是整数且n非0,则表达式(m / n)* n + m % n 的求值结果与m相等如果m%n不等于0,则它的符号与m相同。除了-m导致溢出的特殊情况,其他时候(-m) / n = - (m / n)m / (-n) = -(m / n)m %...
2020-04-07 09:15:27 6462
原创 面试题之度度熊回家
一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?输入描述:输入一个正整数N, N <= 50。接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于1...
2020-03-28 15:52:40 246
原创 C++文件操作读与写
文件操作程序运行时的产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化,c++中对文件操作需要包括头文件文件类型分为两种:1.文本文件 文件以文本的ASCII码形式存储在计算机2. 二进制文件 文件以文本的二进制形式储存在计算机中,用户一般不能直接读懂他们操作文件的三大类:. ofstream : 写文件. ifstre...
2020-03-26 16:59:44 217
原创 C++模板总结
模板的概念模板就是建立通用的模具,大大提高复用性。模板的特点. 模板不可以直接使用,它只是一个框架。. 模板的通用并不是万能。C++提供两种模板机制: 函数模板和类模板<一> 函数模板建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。template<typename T>函数声明或定义template 声明创建模...
2020-03-26 10:59:13 197
原创 位图源码实现
位图:就是用每一位存放某种状态,适用于海量数据,数据无重复场景,通常是用来判断某个数据存在不存在。#include<iostream>using namespace std;#include<vector>namespace leb { class bitmap { public: bitmap(size_t bitc) :m_bitc(bitc / 3...
2020-03-25 15:08:16 505
原创 Linux下线程池源码实现
线程池:初始化阶段创建有最大数量限制的线程,以及一个线程安全的任务队列,若有任务需要处理,则将任务抛入线程池中,线程池中的的线程就会去处理这个任务。优点1.避免峰值压力下,资源耗尽的风险;2.节省线程创建、销毁带来的时间成本为什么需要线程池?针对请求处理,单个线程处理,效率过低,采用多线程处理。但是每个请求都创建一个线程,有可能线程创建过多,效率没有增加反而降低/瞬间资源消耗过度,程...
2020-03-22 09:51:42 142
原创 面试题(一)死锁
死锁概念多个执行流在对多个锁资源进行争夺操作,但是因为推出顺序不当,而导致互相等待,流程无法继续推进的情况(就是程序卡死这了)。死锁产生的四个必要条件:1.互斥条件: 一个锁只能有一个人能加,我加了锁,别人就不能加了。2.不可剥夺条件:我家的锁,别人不能替我释放3.请求与保持条件: 我加A锁,然后去请求B锁,但是请求不到B锁,我也不释放A锁。4.环路等待条件: 我拿着A锁请求B锁,对方...
2020-03-21 20:22:29 269
原创 生产者与消费者模型实现
生产者与消费者模型特点:解耦和,生产者模块与消费者模块并不直接交互,都是仅操作线程安全的队列支持忙闲不均,队列中有对个节点可以起缓冲作用支持并发生产者与消费者模型的实现:一个场所,两种角色,三种关系。生产者与生产者应该具备互斥关系消费者与消费者应该具备互斥关系。生产者与消费者应该具备同步 + 互斥关系。实现一个线程安全的队列 +多个角色的执行流#include<io...
2020-03-21 18:22:15 163
原创 多线程(二)线程安全
线程安全在多个执行流中对同一个临界资源进行操作访问,而不会造成数据二义,这就是线程安全。如何实现线程安全: 同步于互斥互斥:通过保证同一时间只有一个执行流可以对临界资源进行访问(一个执行流访问期间,其它执行流不能访问),来保证对临界资源访问的安全性。同步:通过一些条件判断来实现多个执行流对临界资源访问的合理性(有资源则访问,没有资源则等待,等有了资源再被唤醒)如何实现互斥: 互斥锁如何...
2020-03-21 15:16:12 147
原创 多线程(一)线程控制
线程概念在Linux下使用pcb描述实现了程序调度,并且这些pcb共用同一个地址空间,相较于传统的pcb更加轻量化一点,因此也把Linux下的pcb称之为轻量级进程。进程是系统资源分配的基本单位线程是cpu调度的基本单位线程间的独有与共享独有: 栈,寄存器,信号屏蔽字,errno,标识符**共享:**虚拟地址空间(代码段,数据段),文件描述符表,信号处理方式,工作路径,用户ID ...
2020-03-20 20:57:16 335
原创 进程信号
进程信号信号概念信号就是一个软件中断,通知进程发生了某个事件,打断进程当前的操作,去处理这个事件。信号是多种多样的,并且一个信号对应一个事件,这样才能做到收到一个信号后,知道到底是一个什么样的事件,应该如何处理(但是要保证必须识别这个信号)信号种类 kill -l 可以查看所有的信号。 一共62种信号,1~31 是非可靠信号,34~64是可靠信号。信号的生命周期整个流程可以...
2020-03-20 10:05:25 127
原创 进程间通信(三)信号量
信号量信号量用于实现进程间的同步与互斥互斥: 保证同一时间只有一个进程访问临界资源实现临界资源的互斥访问保证安全性。同步: 通过一种条件判断,不能访问则等待,能访问再唤醒,实现对临界资源访问的合理性。本质: 内核中的一个计数器+pcb等待队列(对资源进行计数);互斥的实现: 通过只有0/1的计数器,实现对临界资源访问状态的标记;在临界资源访问之前获取信号量,计数减一,若计数小于<...
2020-03-19 19:16:27 169
原创 进程间通信(一)管道
进程间通信 (IPC)(一)操作系统为用户提供进程间通信的目的进程间因为每一个进程都有一个虚拟地址空间,在保证了进程独立性的同时,(都是操作自己虚拟地址空间,无法访问别人的地址,无法直接通信)却使得进程间无法直接通信,因此需要操作系统给用户提供一些公共的媒介让多个进程都能够通过访问这个媒介进行通信,所以操作系统来提供进程间通信方式,并且因为通信场景不同,提供的方式也有多种。(二)进程间通信...
2020-03-19 16:14:26 131
原创 文件描述符详讲
文件描述符文件描述符是一个正整数,是内核中文件描述信息结构体的下标。pcb里面有一个指针,指向了struct files_struct 结构体,里面还有一个struct file fd_array[]结构体数组,这个结构体数组里的每个元素指向一个struct file的结构体,这个结构体里是对一个文件的描述,也就是通过这个结构体来对文件进行管理。而这个数组元素的下标就是fd(文件描述符)。...
2020-03-18 16:39:48 357
原创 系统调用IO接口
open/write/read/lseek/closeint open(const char * pathname,int flags,mode_t mode)功能:打开文件 pathname :指定要打开的文件名称flages: 选项参数 必选参数: O_RDONLY (读) O_WRNOLY (写) O_RDWR(只能选一)(读写) 可选参数: O_CREAT ...
2020-03-18 15:33:27 140
原创 Linux下进程控制
进程创建创建一个进程的流程 : 创建一个pcb,复制父进程中的信息。Linux创建进程有两个函数1. pid_t fork()返回值: 父进程返回子进程的pid,子进程返回0,创建错误返回-1父进程创建子进程后,代码共享,数据独有 (利用了写实拷贝技术,)用fork()函数建立的子进程几乎与父进程完全一样,子进程中的所有变量均保持他们在父进程中的值(当然fork的返回值除外),因为...
2020-03-18 13:23:34 155
原创 Linux下进程地址空间
进程地址空间每个进程都有一个自己的进程地址空间。而我们在进程中所访问到的地址实际 都是一个虚拟地址。虚拟地址空间:为什么不直接使用物理内存?因为直接使用内存利用率低,缺乏内存访问控制,所以才采用虚拟地址空间Linux下是通过一个mm_struct结构体描述 出一块完整的连续的线性的地址空间。因此有时候也叫作内存描述符struct mm_struct 内存描述符{ulong me...
2020-03-17 22:02:18 105
原创 进程概念
1.进程是什么?在Linux下 进程就是一个pcb,是一个运行中程序的描述,通过描述信息中的内存指针可以找到内存中运行的程序代码以及数据,并且通过上下文数据可以保存程序调度切换时正在处理的数据,以及通过程序计数器保存进程切换时程序即将执行的下一步指令,通过这些描述信息来实现控制一个程序的运行,因此对操作系统来说进程就是pcb。pcb在Linux下是struct task_struct结构体pc...
2020-03-17 21:18:23 273
原创 Linux下静态库与动态库总结
1.什么是库文件?库文件实际上就是封装了一大堆已经编译完成的代码文件通过连接这个库进而获取到响应函数实现.举个例子: 就是当我们要把自己的代码给别人用的时候,又不想给别人源代码,就需要封装成库文件。**** 注意: 库文件里不能有main函数 ****2.Linux下库的种类?Linux下的库文件一般分为静态库和动态库两种。3.静态库的制作与使用 静态库是指编译链接时,把库文...
2020-03-17 18:43:38 199
原创 gcc编译器
gcc是一个编译器,可以将高级语言c语言编译成机器可以识别的语言。首先,我们先说一下gcc工作流程预处理: 去掉注释,展开代码编译: 语法语义纠错,将c语言解释成为汇编代码汇编: 将汇编代码解释成为机器语言.链接: 链接库文件中的代码.gcc常用选项-E 只进行预处理 生成.i-S 只进行编译 生成.s-c 自进行汇编 生成...
2020-03-17 16:18:56 143
原创 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.**解题思路:1.吸收第一行,并将第一行从矩阵中去掉,2.将矩阵“变相转置”(这里的转置可以理解为将矩阵从地上立起来,比如矩阵...
2020-03-15 11:17:48 84
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人