- 博客(52)
- 收藏
- 关注
原创 多进程、多线程
编程思想多进程编程父进程负责监听,并接收客户端链接(accept),fork创建子进程,子进程处理与客户端通讯注意事项:(1)父进程无需将接收链接的文件描述符传递给子进程;(2)父进程要关闭链接的文件描述符其原因是,如果父进程不关闭文件描述符,则后续创建的子进程会将所有的文件描述符继承,并且后续的链接文件描述符不断增大,链接的客户端的数量就会受到一个进程最多打开的文件数量限制多线程编...
2019-09-01 16:11:01
230
原创 进程创建——fork()
函数原型pid_t fork(void);pid_t实质是int类型,Linux内核2.4.0定义:typedef int _kernel_pid_t;typedef _kernel_t pid_t;函数功能fork()函数会新生成一个进程,调用fork()函数的进程为父进程,新生成的进程为子进程。fork()函数调用一次,返回两次,在父进程返回子进程的pid,在子进程返...
2019-09-01 15:22:19
343
原创 库函数和系统调用函数
库函数在函数库文件中实现,执行时在用户态执行。系统调用函数是系统内核向用户用户空间提供的接口,系统调用函数有用户态调用,实现在内核态。系统调用函数实现原理系统调用函数出发0x80中断,并且将系统调用号存储在eax寄存器中,然后陷入内核,内核开始执行中断处理程序,在系统调用表中查找系统调用号对应的系统内核函数,调用执行完成后又将返回值通过eax寄存器传递回用户空间。库函数和系统调用函数的区别...
2019-09-01 11:40:08
555
1
原创 Linux库文件
库文件是预先编译好的方法的集合,库文件分为静态库和共享库,在Linux操作系统中,静态库的扩展名为.a,共享库的扩展名为.so。静态库(1)特点在程序链接阶段被复制到程序中(2)创建静态库 源文件 fun.c main.cgcc -c main.c fun.c //生成相应的.o文件//使用ar将目标文件归档ar crv libxxx.a main.o fun....
2019-09-01 11:22:32
200
原创 C++中const与static的区别
在C++中const和static因为用法比较类似,所以很多人认为两只之间存在什么关系,其实他们两个之间没有半毛钱的关系!但是这个问题却是面试过程中经常会被问到的问题之一,下面我们就来看一下他们的区别吧。constC++中const用来定义常量常量不能做左值被修改,而且常量必须初始化const常量初始化值为明确的值在程序编译阶段被初始值替换,无法通过间接访问修改。代码如下:int ...
2019-08-31 12:34:38
580
原创 TCP可靠性的保障
TCP连接保证可靠性的机制有确认机制、超时重传、拥塞控制。1.确认机制选择确认SACK 如果接收方收到了和前面的字节流不连续的字节快,如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。2.超时重传超时重传TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。时间计算 报文段的往返时间RTT,加...
2019-08-22 23:53:54
190
原创 MySQL触发器
触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL。当触发器被触发后,MySQL会自动调用。MySQL中能够触发触发器的语句有 insert、delete、update、load、replace触发器分为三类 insert、update、delete、replace触发器触发事件:insert触发器可以被insert、load、replace事件触发...
2019-08-22 13:24:28
178
原创 MySQL事务、事务日志
除了存储引擎和索引,面试中经常还会问道MySQL事务,事务到底是什么呢?今天我们来看一下事务到底是神马东西。1.什么是事务事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个SQL语句是互相依赖的2.事务的特点事务的特点,也就是事务的ACID特性:A (Atomicity)原子性:一个事务的执行被视为一个不可分割的最小单元C(Consistency)一致性:一个事务的执行不应该...
2019-08-22 13:20:15
157
原创 MySQL索引
小伙伴们在使用MySQL数据库的时候经常会使用到索引,而且索引也是面试过程中经常被问到的知识点,今天我们来一起总结一下索引的相关知识点。1.什么是索引索引是一种特殊的文件,包含着对数据表里所有记录的引用指针,打个比方,如果数据库是一本书的话,那索引就是书的目录,使用索引可以加快数据库的查询效率,就好比用目录可以快速找到书里想找的内容。一般数据库默认会为每一张表的主键生成索引。索引分为聚集索引...
2019-08-22 12:54:16
119
原创 MySQL存储引擎
MySQL常见的存储引擎有MyISAM、INNoDB、Memory、Archive,他们各自的特性如下:1.MyISAM特点:不支持事务、支持全文索引、在线处理速度快文件组成:myd存放数据 myi存放索引2.INNODB支持事务,在线处理能力优秀,行锁、支持外键,采用聚集索引。没有主键、没有唯一键,为每一行生成一个6字节的id作为主键。3.Memory将数据存储到内存中,当数据库重...
2019-08-22 12:32:58
98
原创 MySQL数据库基础
MySQL中SQL的含义是机构化查询语言,在MySQL数据库中,SQL分为DDL、DML、DCL三类,分别是数据定义语言、数据管理语句、数据控制语句。1.DDL 数据定义语言DDL用来定义不同数据段、数据库、表、列、索引等数据库对象常用命令:create drop alter showshow databases 显示出来的默认数据库的存储内容information_schema:...
2019-08-22 12:28:58
148
1
原创 从网络体系结构的角度分析网址访问具体做了哪些事
之前从客户端与服务器的角度分析了网址访问,今天我们从计算机网络体系结构的角度分析一下,当你在浏览器的网址栏输入一个网址并按下Enter键之后,具体发生了哪些事?当用户输入一个网址并按下Enter键之后:1.首先,应用层协议对该请求做了格式的定义;2.紧接着传输层协议在传输的数据上加了通信双方的端口号,确定了通信的应用程序;3.然后网络层协议在数据上附加了通信双方的IP地址,确认了通信双方的...
2019-08-21 20:23:25
271
原创 当你在浏览的地址栏输入一个网址并按Enter键之后具体发生了什么?
在浏览器上输入一个网址之后,就可以访问相应的网站,如同打开了新世界的大门一样。那么你有没有想过,当你输入网址按下Enter键之后,在你看不见的地方,都发生了哪些事?从C/S结构的角度去看,主要发生了以下这些事情:1.DNS解析DNS解析的过程就是一个寻找客户端访问的资源所在机器的过程,本质是对用户输入的网址是否合法,以及将合法的网址“翻译”成IP地址。DNS解析的过程其实是一个递归查询的过...
2019-08-20 18:41:43
1967
3
原创 STL容器与迭代器
C++提供了功能强大的标准模板库STL,STL的六大组件分别是容器、配接器、迭代器、泛型算法、仿函式、空间配置器。今天我们来看一下容器。STL容器STL容器分为三类,顺序容器、关联容器和容器适配器。顺序容器有vector、list、deque。vector是矢量容器,底层是一个动态开辟的一维数组,每次扩容为原来的2倍。vector容器对象常用方法有push_back、pop_back、i...
2019-08-20 17:41:03
311
原创 有名管道和无名管道
管道是进程间通讯的一种方式,分为有名管道和无名管道两种。有名管道的实现原理是在磁盘上有一个文件标识,创建一个管道文件,但交互的数据存储在磁盘中,管道文件并不会占据磁盘空间。无名管道是借助父子进程共享文件描述符来完成进程间的通讯,不会创建管道文件。有名管道和无名管道的区别:有名管道适用于所有进程间通讯,无名管道只适用于父子进程。...
2019-08-19 17:48:44
999
原创 IP协议的特点及报头
IP协议的特点:无连接、不可靠、无状态。无连接:指的是IP通信的双方都不会长期维护对方的任何信息不可靠:IP协议不保证数据报能准确地到达接收端,只是尽最大努力交付无状态:指的是通信双方不同步传输数据的状态信息,IP数据报的发送、传输、接收都是互相独立的,没有上下文关系,因此接收端可能收到重复、乱序的报文段。IP数据报报头:...
2019-08-19 17:09:13
2418
原创 计算机网络体系结构
一般计算机网络体系结构有三种,分别是OSI体系结构、TCP/IP体系结构、五层协议体系结构。(一)OSI体系结构OSI体系结构下,整个计算机网络分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层七层。分层功能7.应用层为网络服务与最终用户提供一个接口6.表示层提供数据的表示、安全、压缩等服务5.会话层建立、管理、终止回话4.传输层定义...
2019-08-19 16:30:28
6060
原创 HTTP状态码
HTTP状态码是表示HTTP相应的特殊三位数字,按照第一位数字可分为5大类,共计33种。状态码含义1xx表示通知信息的,一般表示收到请求或正在处理请求2xx表示成功,一般表示接收到请求3xx表示重定向,一般表示完成请求还必须采取进一步的行动4xx表示客户端的错误,一般是请求中语法有错误,或权限不足5xx表示服务器的错误,一般是服务器失效无法完...
2019-08-19 15:35:54
794
原创 HTTP与HTTPS协议的区别
**HTTP的中文名称是超文本传输协议,主要应用于浏览器和服务器之间传递数据。**HTTP协议以明文方式发送内容,并不提供数据加密,存在一定的风险。**HTTPS是安全的超文本传输协议,是在HTTP协议的基础上加入了SSL协议保证数据的安全传输。**SSL是安全套接字,是一种保证信息交换安全的协议,提供基本的鉴别与保密服务。SSL协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信提供...
2019-08-19 15:16:43
120
原创 模拟扑克牌游戏的洗牌
大家都很喜欢玩扑克牌,那么如果面试官让你用计算机模拟一个扑克游戏的发牌或者洗牌,你会怎么做呢?代码如下:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>#define POKER_NUM 52//s:黑桃,h:红桃,c:梅花,d:方块char p...
2019-08-18 18:25:28
1016
原创 C++用两个栈实现一个队列
之前总结面经,看到了这样一个面试题:C++用两个栈模拟实现一个队列。看到这个问题,相信很多人都是在心里鄙视面试官,这是人问的问题吗?不但要写栈,还要用栈实现一个队列,这代码量也忒大了吧!如果你第一反应也和上面一样,那说明你的C++功底还是有些薄弱,为什么一定要自己写呢,人家面试官有没有强调说要让你写一个栈,为什么不用STL呢?话不多说,上代码:#include<iostream>...
2019-08-17 18:27:11
314
原创 指针和引用的区别
指针和引用的区别:指针可以不用初始化,通过赋值可以指向任意同类型的内存,引用必须做初始化,而且一旦引用绑定一块内存后,就不可以在修改了sizeof运算符下,指针的大小永远是4(x64为8),引用的大小是引用所绑定内存的大小指针可以为空,引用一定不为空使用指针时编译器一定会对其检测是否为空,空指针访问,而引用则不需要检测是否为空,因为不存在空的引用其实指针和引用在底层汇编山是相同的,定...
2019-08-08 12:04:49
261
1
原创 测试开发——单元测试和集成测试
前面向大家介绍了黑盒测试和白盒测试,但是软件测试的方法不单单只有这两种方法,还有单元测试、系统测试、用户验收测试、集成测试、回归测试、冒烟测试、α、β、γ测试、性能测试、安全性测试等。今天要向大家介绍的是单元测试和集成测试。先来看看单元测试单元测试单元测试按照字面意思的理解就是对软件最基本组成单元的测试,一般属于软件测试中最低级的测试方法。一般被测单元都是在被隔离的情况下进行单元测试的。思...
2019-07-30 18:06:48
1771
原创 线程同步
先来看看线程同步的概念,线程同步是指同一个进程中的所有线程都是并发执行的,当线程需要访问临界区资源时,必须按照一定的先后顺序访问执行。控制线程同步的方式有线程级信号量、互斥锁(读写锁、自旋锁)、条件变量。...
2019-07-29 19:12:16
112
原创 epoll的LT和ET模式
Linux下实现I/O复用的三种系统调用有select、poll、epoll。相比于select和poll,epoll的效率更高。其原因有两点:一是epoll使用一组函数来为完成系统调用;二是epoll把用户关注的文件描述符上的事件放在内核内的一个事件表中,而无需每次调用向内核重复传入。其实还有一点原因在epoll的内核剖析中,我们会发现,epoll是通过红黑树维护文件描述符,而poll是通过链表...
2019-07-28 18:24:51
457
原创 操作系统内存管理方案
在介绍内容之前之前,首先问一个问题:什么是内存管理,或者说为什么需要内存管理?如果你半天想不出一些内容,那就来看看我写的这个文章。一般,计算机的内存大小大约是64M,而我们的操作系统运行时会有很多的进程,如何合理的“安置”这些进程是一个很复杂的问题。大家都知道内存的造价要比磁盘贵很多,而且内存过大相应CPU的性能也要提升,否则计算机将不能正常运行。因此,扩大内存的方法并不符合实际。这样人们提出了...
2019-07-28 16:50:52
600
原创 TCP状态转移——三次握手和四次挥手
前面介绍了计算机网络的基础知识,今天我们来看一下TCP状态转移的“三次握手”和“四次挥手”。状态转移指的是TCP的连接建立到关闭整个过程中通信两端状态的变化。首先,我们思考一下,为什么TCP会有“三次握手四次挥手”这么一个过程?我们说TCP协议的特点是面向连接的、可靠传输的、字节流服务(相比于UDP无连接、不可靠传输、数据报服务)。这里主要原因是前面两个,因为TCP提供面向连接的和可靠传输的特点...
2019-07-28 12:04:36
389
原创 软件测试的一般方法
一般说到程序猿大家能想到的就是一线的开发人员,觉得他们的日程就是“敲敲敲”,殊不知在产品一线还有另外一群人,他们做着和开发人员一样的事情,他们就是测试人员。测试人员的工作跟开发人员差不多,人称“点点点”。至于二者孰轻孰重,有人形象的比喻开发和测试就好比人的两条腿,时而交替时而并行地推动者项目前进。这里,给大家介绍一些关于软件测试的概念性知识。说到软件测试,大家耳熟能详的就是传说中的“黑盒测试”和...
2019-07-27 21:31:26
344
原创 I/O复用——poll和epoll
I/O复用的出现,使得程序能够同时监听多个文件描述符,并在提高程序性能方面发挥了重要作用,其中I/O复用使用最多的情景是TCP服务器要同时处理监听socket和连接socket。虽然I/O复用具有监听多个文件描述符的功能,但是其本质上是阻塞的,因为当多个文件描述符就绪时,程序自身只能按顺序依次处理每一个文件描述符,这看起来像是程序在串行执行,并不能实现并发(实现并发只能依靠多进程和多线程编程)。...
2019-07-25 21:39:05
1930
原创 进程、线程、协程和管程的区别
大家都知道,计算机是为了模拟现实世界,其中计算机领域最伟大的发明之一就是操作系统。操作系统对于计算机来说是其核心的存在,可以说操作系统的地位就像计算机的灵魂一样。操作系统的诞生是为了运行用户程序,事实上程序运行在操作系统上就变成了进程,现在就来让我们一起了解一下进程相关的内容。进程根据理解,我们可以对进程下个定义——进程是运行中的程序。注意,进程是一个动态的概念,这一点很重要。但是进程并不是那...
2019-07-25 19:53:54
3580
原创 进程间通讯
之前再跟同学交流面试经验的时候,有小伙伴在讲述自己面试经历的时候,多次被问到了进程间通讯这个问题,由此可见这个知识点的重要程度可想而知了。首先,在脑海里试想一下面试官如果问你“进程间通讯的方式有哪些?”你会怎么去回答。有的小伙伴就说了,这个还不简单了,不就是那几个吗,这个有什么难的!进程间通讯方式有管道、消息队列、信号量、共享内存如果你只能想到这些,那么我建议你回去还是好好看看这个模块的内容吧,...
2019-07-25 13:19:16
903
原创 排序算法总结——算法比较
前面介绍了常用到的一些排序算法,今天我们就把这些算法放在一起比较一下这些算法的优缺点。俗话说没有最好的排序算法,只有最合适的算法,不同的算法各有各的优点,所以选择排序算法的时候,要尽可能的的“扬长避短”,当然也要“具体问题具体分析”。比较一下常见的排序算法如下:...
2019-07-22 23:55:06
158
原创 排序算法总结——选择排序和基数排序
前面介绍了很多排序算法,今天我们来介绍一下基数排序算法。基数排序算法也称“桶排序”算法,因为它真的是用10个“桶”来排序的,所以因此而得名。基数排序的基本思想是,对一组数据元素,创建十个队列,每一个队列代表0~9十个数字,然后对数据按个位入相应的队列,然后再按顺序出队,接着再以十位重复之前的操作,再以百位…其中数位不够的数据入“0号队列”,最终使得数据全部有序。代码如下:#define SI...
2019-07-21 23:59:40
444
原创 排序算法总结——冒泡排序和快速排序
提到排序算法,大家首先想到的肯定是冒泡和快排了,因为冒泡排序最简单,快速排序速度最快。今天就来介绍一下这两个排序算法。冒泡排序首先来看冒泡排序,其基本思想是一组数据,两两两个对其进行比较,将大的数据元素置于右边,小的数据元素置于左边,这样最大的元素将会置于最右边,接着重复进行之前的操作,以此类推,直至最左边的元素都有序,此时所有数据元素都变得有序。如下图:代码如下:void Bubble...
2019-07-21 18:39:51
1038
原创 排序算法总结——堆排序和归并排序
前面介绍了插入排序和shell排序,今天我们来看看堆排序和归并排序。堆排序说起堆排序,先来说一下堆。堆分为大根堆和小根堆,大根堆就是一颗双亲节点元素大于孩子节点元素的二叉树,小根堆正好相反,是一颗双亲节点的元素小于孩子节点元素的二叉树。**堆排序的思想是先利用数据建立大根堆,然后再将根元素放置最后保存起来,然后不断调整大根堆,将新的跟插入到旧根的前面,直至将最后一个元素保存,这样保存的元素将...
2019-07-21 12:30:39
421
原创 排序算法的总结——插入排序与shell排序
在我们的日常生活中,很多地方都会直接或者间接的使用排序这种操作,比如中午去学校食堂买饭的时候需要排队,将同学的的资料按学号排列等等,排序与我们的生活息息相关。在计算机语言中,很多时候我们对一些数据进行处理的时候,也会用到排序,特别是处理大数据的时候,经常会用到一些排序的算法,下面就来介绍一些常用的算法吧。这里我们默认所有排序都是升序排序。插入排序将一组数据从后往前遍历,遇到第一个小于自己的...
2019-07-21 11:52:29
224
原创 引用总结
首先看下面代码: int main() { int a = 10; int &b =a; b = 20; std::cout << a << std::endl; std::cout << b << std::endl; ...
2019-07-20 19:36:56
137
原创 内联函数——inline关键字总结
内联函数是C++为了提高程序运行速度而作出的一种改进。在函数定义前加上inline关键字,就可以使用内联函数的特性。强调一下,必须是函数定义的地方,原因后面解释。普通函数和内联函数的主要区别是函数与程序的组合形式的不同。首先,inline关键字在函数编译阶段生效,其作用是在函数的调用点直接展开函数的代码,若本文件没有调用内联函数的地方,编译器将不对其函数生成符号,此时内联函数只是对本文件可见。...
2019-07-20 13:14:31
988
原创 变量和内存总结
大家都知道变量分为全局变量、局部变量和static修饰的变量这三类,其中全局变量是定义在函数外部的,只有程序销毁时才会失效。局部变量是指定义在函数内部的变量,同时形参也属于局部变量。static属于静态关键字,可以修饰全局变量,也可以修饰局部变量,但是局部变量中的形参不能用static修饰,同时函数也不可以用static修饰。根据存放数据的不同可以将内存主要分为代码段、全局(静态)变量区、栈区和...
2019-07-20 08:58:36
178
原创 程序的编译链接原理
对于计算机语言的初学者来说,通常程序都是在集成开发环境(IDE)下开发的,而很少有人去了解程序的编译、链接原理,今天就让我们来揭开程序编译链接原理的神秘面纱。话不多说先上代码:#include <stdio.h>int Sum(int a,int b,int c){ return a+b+c;}int main(){ Sum(10,20,30); printf(...
2019-07-17 20:53:35
275
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人