- 博客(97)
- 收藏
- 关注
原创 消息队列
消息队列提供了一个从一个进程向另一个进程发送数据块的方法 每个数据库都被认为是一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的,每个消息队列的总的字节数也是有上限的,系统上消息队列的总数也有一个上限消息队列的特点:消息队列是基于消息的,而管道是基于字节流的 消息队列的读取不一定是先入先出 消息队列的生命周期随内核,所以...
2018-08-16 20:43:46
377
原创 进程间通信——管道
进程间通信进程间通信的目的:数据传输:一个进程需要将它的数据发生给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发生消息,通知他发生了某种事件(如进程终止时要通知父进程) 进程控制:有些进程行为完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时找到人的状态变化相关名词解释:数据不一致:读写双方共同...
2018-08-16 18:23:12
374
原创 浅析软,硬链接
硬链接:通过文件系统,我们知道,真正找到磁盘上文件的并不是文件名,而是inode。但是我们的Linux可以使多个文件名对应于同一个inode创建一个硬链接:ln 源文件名 链接名我们发现abc和bcd指向了同一个inode,inode中记录了文件的所有信息,改动其中一个使,另一个也会被改变 abc和bcd的链接状态完全相同,他们被称为硬链接,内核记录了这个链接数,inode 10...
2018-08-15 11:53:12
371
原创 浅析文件系统
文件系统:Linux提供了层次结构的目录和文件,文件系统将磁盘划分为每1024(或512)个字节为一组的块。编号从0到整个磁盘空间的最大块数当我们使用ls -来查看时,我们发现,除了看到文件名,还能看到文件元数据每行包含7列:模式,硬链接数,文件所有者,组,大小,最后修改事件,文件名 ls -l读取存储咋磁盘上的文件信息,任何显示出来 除了用这个方式来读取,还可以用一个st...
2018-08-15 11:09:06
321
原创 文件相关系统调用,文件描述符
1.open函数:函数原型:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int open(const char *pathname,int flaos);int open(const char *pathname,int flaos,mode_t mode);...
2018-08-15 10:19:06
355
原创 线程的同步与互斥
mutex(互斥量)大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内。这种情况,变量对数单个线程,其他线程无法获得这种变量 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互 多线程并发的操作共享变量,会带来一些问题,因为毕竟不是所有的操作都是原子性的(要么不做,要么全做完,不存在中间时刻)下面写一个程序来说明:...
2018-08-13 17:37:14
255
1
原创 线程控制
线程控制:线程的控制与进程控制不同,由于内核中根本没有写出的概念,因此也就不存在线程相关的“系统调用”,于是大佬在用户层封装了一个线程库,我们就可以在用户层来完成线程的创建,销毁以及其他控制posix线程库:与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都以“pthread_”开头 要使用这些函数库,要提高引入头文件<pthread.h> 链接这些线程函数库时...
2018-08-12 20:32:57
191
原创 线程初识
线程初识: 什么是线程?线程是操作系统能够进行运算调度的最小单位 线程包含在进程之中,是进程中的实际运行单位,一切进程至少都有一个执行线程 线程是指进程中的一个单一顺序的控制流 一个进程中可以并发多个线程,每条线程并行执行不同的任务一个程序中的一个执行路线就叫做线程。线程就是一个在进程内部运行的比进程更细致的执行流。其实在Linux下没有真正的线程,所以我们用进程来模拟线程。在CP...
2018-08-12 18:37:05
179
原创 进程终止,进程等待
进程终止:进程退出的场景:代码运行完毕,结果正常 代码运行完毕,结果不正常 代码异常终止进程常见的退出方式:1.正常终止:从main()函数返回 调用exit _exit正常终止,可以通过echo $?来查看进程的退出码2.异常退出:ctrl+c,信号终止 代码执行完后,如何得到代码退出的场景?根据程序的退出码,不能根据函数的返回值exit函数...
2018-08-12 10:30:49
319
原创 进程创建——fork,vfork
fork()函数:在Linux中fork函数是一个非常重要的函数,它从已存在的进程中创建一个新的进程,而新进程位子进程,原进程位父进程函数原型:#include<unistd.h>pid_t fork(viod);返回值:成功子进程中返回0,父进程返回子进程的id,出错返回-1调用fork函数:进程调用fork,当控制转移到内核中的fork代码后,内核会做...
2018-08-11 11:27:25
219
原创 程序的地址空间
研究背景:32位平台计算机物理内存的大小是固定的,就是计算机主板内存槽上的实际物理内存,cpu可以直接进行寻址,物理内存的容量是固定的,但是寻址的空间取决于cpu地址线的数量。在32位系统上,线性地址空间可达4G(2^32);这4G一般是按照3:1的比例进行分配,用户进程享有3G的空间,而内核独自享有剩下的1G内存早期的内存分派方式:最早的时候,计算机还没有虚拟机制,程序指令所...
2018-08-10 20:18:08
10859
原创 僵尸进程,孤儿进程
Z(zombie)——僵尸进程僵尸状态是一个比较特殊的状态,当进程退出并且父进程没有读取到子进程退出的返回代码时,就会产生僵尸进程 僵尸进程会以终止状态保持在进程表中,并且一致在等待父进程读取退出状态代码 所以,子进程退出,但是父进程没有读取子进程状态,子进程加入Z状态 系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁一个僵尸进程...
2018-08-10 12:09:37
220
原创 进程初始(二)——进程优先级,环境变量
程序优先级:基本概念:进程在被cpu分配到资源优化才能运行,但是资源是有限的,cpu分配资源的先后顺序,就是进程的优先权 优先权(优先执行的权利)和优先级值不一样,优先权高的进程有优先执行的权力,配置进程优先权对多任务环境的Linux很有用,可以改善系统性能 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU上,可以大大改善系统整体性能可以使用ps -l查看输...
2018-08-10 10:20:10
310
原创 初识进程(一)——操作系统,进程管理,进程状态
一、冯诺依曼体系结构目前我们认识的计算机都是由一个个硬件组成输入单元:键盘,鼠标,扫描仪等 输出单元:显示器,打印机 中央处理器(cpu):含有运算器和控制器关于冯诺依曼体系,必须强调几点:存储器是指内存 不考虑缓存的情况,cpu只能对内存进行读写,不能访问外设 外设要输入或输出数据,也只能从内存里读取 所有设备都只能和内存打交道二、操作系统(operate syst...
2018-08-09 17:14:59
1232
原创 Mysql——内外连接,事物,索引
表的内外连接:表的连接分为内连和外连内连接:内连接实际上就是利用where语句对俩个表形成的笛卡儿积进行筛选,我们前面学的所有连接都是内链接语法:select 字段名 from 表1 inner join 表2 on 连接条件 and 其他条件例:显示SMITH的名字和部门名称select ename,dname from EMP,DEPT where EMP.deptno...
2018-08-09 12:45:07
450
原创 MySQL——表的约束,数据类型,增删查改
数据类型数值类型:tinyint:1字节,-128~127,0~255 smallint:2字节,-32768~32767,0~65535 mediumint:3字节 ,-8388608~8388607 ,0~16777215 int :4字节,-2147483648~2147483647…… bigint:8字节越界测试:create table tt1(num tinyi...
2018-08-09 10:52:23
274
原创 MySQL对表和库的一些基本操作
启动mysql:service mysqld start关闭mysql:service mysqld stop连接到mysql:mysql -u root -p退出连接:exit库的操作创建数据库:创建数据库company1:create database company1; 创建使用utf8字符集的company2:create database company2 ch...
2018-08-09 10:16:12
229
原创 模板的偏特化,全特化
c++中的模板分为类模板和函数模板模板的特化分为俩种:全特化和偏特化全特化:举一个简单的例子template<class T>class AA{public: AA() :_a(0) {} ~AA() { cout << "原始模板" << endl; }protected: T _a;};template&l...
2018-08-08 18:12:33
358
原创 模板参数,模板分离编译
模板的形参:1.类型形参:template<class T>void h(T a) {//……} 类型形参是指:class T/ typename T中的T,类型形参的名字由用户自己定义,模板的形参(T)表示一个未知的类型。 模板类型形参可以作为类型说明符用在模板中的任何地方,与内置类型/类类型的使用方式完全相同,即可以用于指定返回类型,声明变量等地方 不能...
2018-08-08 17:17:16
227
原创 C++——模板
概念:模板是泛型编程的基础,所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板将类型定义为参数,从而实现了真正的代码可采用性模板分为模板函数和模板类一、模板函数假设现在要实现一个比较俩个数是否相等的重载函数int IsEqual(int a, int b){ return a == b;}bool IsEqual(const string& le...
2018-08-08 16:12:31
154
原创 C++——多态
1.什么是多态?多态简单的讲就是“一个接口,多种方法”,程序在运行时才决定调用的函数,他是面向对象的核心概念。当多态应用形参的数据交,可以接受更多的类型,当多态用于返回值类型的时候,可以返回更多类型的数据,多态可以让你的代码拥有更好的扩展性构成多态的条件继承的存在 子类要重写父类的虚函数 父类的指针/引用调用重写虚函数什么是重写:不在同一作用域内(分别在父类和子类中) 基类...
2018-08-07 13:03:41
384
原创 虚函数,虚函数表
一、虚函数:虚函数——类成员函数前面加virtual关键字,则这个成员函数称为虚函数 虚函数重写:当在子类里定义了一个和父类完全相同的虚函数时,则称子类的这个函数重写(覆盖)了父类的这个虚函数。 重写就是将子类里面虚函数表里的被重写的父类函数地址全都改成了子类函数的地址虚函数覆盖(重写)class person{public: virtual void BuyTickets(...
2018-08-07 10:48:35
280
原创 菱形继承,虚继承
一、单继承和多继承单继承:一个子类只有一个直接父类时,称这个继承为单继承 多继承:一个子类有俩个或以上的直接父类时称这个继承关系为多继承单继承:可以有多个父类,但是只能由一个直接父类多继承:二、菱形继承: 菱形继承的例子:class person{public: string _name;};class student : public per...
2018-08-06 23:21:15
1294
原创 继承关系里的六个默认成员函数
在继承关系里,如果子类里没有显示定义这六个成员函数,编译器会默认合成的函数实现一个继承关系里的默认成员函数class person{public: person(const char* name) :_name(name) { cout << "person()" << endl; } person(const person& p)...
2018-08-06 21:31:35
308
原创 c++继承,隐藏(重定义)
继承是面向对象复用的重要手段,通过继承定义一个类,继承是类型之间的关系模型。共享公有的东西,实现各自本质的不同的东西。一、三种继承关系public:公有继承 protected:保护继承 private:私有继承实现一个简单的继承关系:继承是一种复用的手段,在继承关系里基类(父类)的成员都会成为派生类(子类)的成员,由此达到复用的目的三种继承关系下基类成员在派生类的访问关系...
2018-08-06 20:42:23
538
原创 C++动态内存管理——new/delete
1.c语言的动态内存管理malloc:动态开辟指定大小的空间,返回值是void* ,所以要自己指定返回的数据类型 int *ptr = (int*) malloc (10*sizeof(int)); calloc:动态开辟指定大小的空间,与malloc不同的是它会进行初始化 int* ptr = (int*)calloc(10,sizeof(int)); realloc: 为动...
2018-08-06 18:18:26
238
原创 构造函数,拷贝赋值函数的N种调用情况
一、 class Date{public: Date()//构造函数 { cout << "Date()" << endl; } Date(const Date& d)//拷贝构造 { cout << "Date(const Date& d)" << endl; } Date&
2018-08-06 12:13:40
206
原创 C++——内联,友元
一、内联(inline)以inline修饰的函数叫内联函数,编译时c++编译器会在调用内联函数的地方将其展开,没有函数压栈的开销,内联函数提升程序运行的效率。inline时一种以时间换空间的做法,省去调用函数的开销,所以代码很长或内部有循环,递归的函数不适宜使用内联 inline对编译器只是一个建议,编译器会自动优化。如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉...
2018-08-06 11:00:16
316
原创 测试方法的七种分类
一、按开发阶段分:测试金字塔与业务测试分析1.UI界面层:比较复杂,需要一定的数据库,操作系统方面的基础知识功能验证测试 兼容性测试与用户测试:兼容性测试与平台有关,web(浏览器),APP(操作系统)2.业务逻辑层客户端模拟测试:APP测试 内外接口测试: 内部:n个开发人员,各开发人员之间测试 外部:俩个项目或者俩个公司之间进行测试(参照物不同) SDK接...
2018-08-05 16:24:05
9594
原创 测试——水杯的测试用例
水杯:1.功能:水倒容量的一半 水倒至安全刻度线以上 水倒满且流出来 水杯的容量刻度与其他水杯一致 烫手验证2.性能:使用的最大次数或时间 杯盖拧紧到什么程度水倒不出来 掉到地上不易损坏 保温时长 杯子的耐热性 杯子的耐寒性 长时间置放水不会漏出来 杯子上放置重物到达什么程度杯子会被损坏3.界面:外观是否完整,美观 大小与设计时一样(高,宽,容量,直径)...
2018-08-05 12:46:21
10106
1
原创 函数栈帧(调用过程)
函数栈帧就是在调用函数是为其在栈空间上开辟了一段空间,指向过程调用,一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。栈是向下生长的,从高地址到低地址延伸的 每个函数的每次调用的过程,都有它自己独立的一个栈帧结构,用于变量的保存,现场的保护 要维护这个栈帧必须使用ebp(栈底指针)和esp(栈顶指针)这俩个寄存器 cpu如何知道函数运行到哪里——寄存器...
2018-08-05 11:20:51
517
原创 结构体,枚举,联合
一、结构体:1.结果体是一些值的集合,这些值称为成员变量。结果的每个成员可以是不同类型的变量,可以是数组,指针,甚至其他结构体2.结构体的声明:struct Stu{ char name[20]; int age; char sex[5];};3.特殊的声明:不完全声明struct{ int a; ch...
2018-08-04 19:26:27
284
原创 malloc,calloc,realloc及动态开辟内存常见错误
1.为什么存在动态内存管理?我们已经掌握的内存开辟方式有:int val = 20;//在栈空间上开辟四个字节char arr[10] = {0}; //在栈空间上开辟10个字节的连续空间但是这些开辟空间的方式开辟的空间大小是固定的,数组在声明的时候,也是必须指定大小。他们所需要的内存在编译时分配而有些时候我们需要的空间大小在程序运行的时候才能知道,所以就要有一种动态内存分配的...
2018-08-04 16:46:48
2824
原创 数组指针,指针数组
1.指针数组:指针数组是一个数组,但数组内的每一个元素都是一个指针int *arr[10]char *arr2[4];2.数组指针:数组指针式一个指针,指针有能力指向一个数组int (*p)[10];3.我们如何区别数组指针和指针数组呢?int *a[10]; //指针数组int (*a)[10]; //数组指针注:我们的变量名先和那个运算符集合就是什么...
2018-08-04 13:25:34
161
原创 c语言指针详解
1.什么是指针?指针是一个变量,用来存放地址,存放在指针中的值都被当成地址来处理2.为什么存在指针?从内存说起,计算机中的程序要运行起来首先要将程序加载到内存,那如何合理的分配时使用内存呢?我们将内存分成多个小的单元,每个单元都对应一个独一无二的地址,这样就一个地址标识一块空间经过仔细的计算和权衡我们定义每个小的单元是一个字节,对于32位机器,有32根地址线,那么假设没很地址线...
2018-08-04 13:06:35
224
原创 memcpy,memmove的实现
1.memcpy()的实现内存拷贝函数,指定拷贝count个字节,与类型无关。memcpy按字节拷贝,并不是只能拷贝字符串,所以没有‘\0’结束标志,按指定是字节数大小拷贝str家族函数只能处理字符串类型的数据,而mem可以处理任意类型的数据void* my_memcpy(void * dest, void * src, size_t count){ assert(dest)...
2018-08-04 12:10:02
185
原创 递归函数,可变参数列表
递归1.什么是递归?递归就是函数或过程在其定义或声明的中有直接或间接调用自身的一种方式。他通常将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。2.递归的主要思想:大事化小求第n个斐波那契数(不考虑溢出)int fib(int n){ if (n <= 2) return 1; return fib(n-1) + fib(n - 2);}...
2018-08-04 11:57:33
674
原创 字符串相关函数的实现
1.strlen():求字符串长度函数,遇到'\0'结束函数原型:size_t strlen(const char * str)参数指向的字符串必须以‘\0’结尾返回值size_t是无符号的1)使用一个计数器int my_strlen(const char* str){ int count=0; while (*str) { str++; count++; ...
2018-08-03 22:58:42
290
原创 头文件包含方式,main函数的参数解析
条件编译:在编译一个程序的时候我们如果要将一条(一组)语句编译或放弃是很方便的因为我们有条件编译比如调试性的代码,删除可惜,保留又碍事,我们就可以选择条件编译常见的条件编译语句:1.#if 常量表达式//……#endif//常量表达式由处理器求值,因为变量在运行事才会创建,而这些条件编译在预处理阶段 2.多分支的条件编译#if 常量表达式//……#...
2018-08-03 20:34:19
1260
原创 C程序内存的分配,const ,volatile,static
一个c/c++程序占用的内存分别位以下几个部分1.栈区:由编译器自动分配释放,储存为函数而分配的局部变量,函数参数,返回数据,返回地址等,其操作方式类似于数据结构里的栈2.堆区:一般由程序员手动分配释放,若程序员不释放程序结束时可能由OS回收。3.全局区(静态区):由于存放全局变量,静态变量常量,程序结束后由系统释放4.常量区:用于存储常量字符串5代码区:用于存放函数体(类成员...
2018-08-03 19:53:49
409
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人