自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 C++基础知识大全

秋招基本尘埃落定了,打算总结一下C++学习路线的相关知识,今天是第一篇:C++基础知识总结。面向对象的三大特性:1、封装:把客观事物抽象为类,包含自己的属性和方法。2、继承:使用现有类的所有功能,在无需重新编写原有类的情况下对类的功能进行拓展。被继承的类成为父类或基类,继承的类成为子类或派生类。3、多态:一种形式,多种状态,分为静态多态和动态多态。静态多态指编译时多态,如函数重载、模板;动态多态指运行时多态,特指virtual虚函数机制形成的多态。类的访问权限:private、protected

2021-10-31 16:48:41 12806 6

原创 RocketMQ知识点总结

为什么需要消息队列1、削峰高并发情况下,服务器通过集群模式(即多机部署),可以抗住几万的并发,但数据库能承受的并发量是有限的,若服务器将所有请求直接打向数据库,会直接把数据库打垮。如图所示:2、异步对于实时性不是很高的业务,例如给用户发送短信、邮件通知,以及下单后的创建订单、削减库存等操作都可以放到消息队列里去。因为相对于核心订单流程来说,短信、邮件晚一些发送,对用户来说影响不是很大。同时还可以提升整个链路的响应时间。1、解耦多个服务通过消息队列关联在一起,相互之间不会产生耦合,一个服务挂了不

2021-08-12 00:45:38 880 3

原创 Redis知识点总结

一、什么是Redisredis是一个使用C语言编写的、基于内存的且可持久化的key-value数据库。redis有以下特点:1、性能高。 Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。2、数据结构丰富。Redis支持string、 list,set,zset,hash等数据结构的存储。3、原子性。Redis的所有操作是支持原子性的,要么成功,要么失败。4、持久化存储。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候再次加载进行使用。二、

2021-08-11 16:40:31 1306

原创 windows系统上git安装及使用教程

一、git安装进入git官网:git官网,下载windows版本并安装。具体安装教程参考:安装教程。二、git连接gitlab个人远程仓库本地git仓库和gitlab网络仓库之间的传输是通过ssh加密的,必须要让gitlab仓库认证你ssh key,因此需要通过ssh key建立连接。其教程为:1、打开gitbash终端,新建一个.ssh文件夹: mkdir ~/.ssh2、进入文件夹: cd ~/.ssh3、执行生成ssh key的命令,并按三次回车:ssh -keygen -t

2021-05-23 16:49:32 3718 1

原创 vs2013无法启动程序,因为计算机中丢失SpaACISd.dll。尝试重新安装该程序以解决此问题

vs2013运行项目出现以下问题开始时以为就是动态链接库找不到的原因,就在项目属性的链接器中更改附加库目录,但是发现不管怎样就是无法解决。搜索了各种方法,最后的解决办法如下:将相应的动态链接库文件放置到指定的目录下,若为64位系统,则32位的DLL文件放在“C:\Windows\SysWOW64”,64位的DLL文件放在“C:\Windows\System32”。vs2013真是一个令人头疼的软件,经常各种运行bug能让你搞一天!...

2021-05-10 17:19:51 1369 1

原创 C++后端开发学习路线及推荐学习时间

先说一下实习面试的结果吧,本人申请岗位为C++后端开发,通过面试的公司有CVTE、搜狐、字节跳动,然后腾讯明天三面,准备去字节了(不要问我为啥去字节,钱多福利好)。

2021-04-11 20:35:00 25539 32

原创 HTTP知识点总结

HTTP是应用层的协议,规定了应用程序在万维网中通信时应遵循的协议,是万维网能可靠地交换文件的重要基础。HTTP报文首部(Header)1、HTTP请求报文首部:方法、URL、HTTP版本、首部字段方法(method):(1)GET:请求读取由URL所标志的信息(2)HEAD:请求读取由URL所标志的信息首部(3)POST:给服务器添加信息(4)PUT:在指明的URL下存储一个文档(5)DELETE:删除指明的URL所标志的资源2、HTTP请求报文首部:状态码、HTTP版本、首部字段

2021-03-17 21:25:42 1167 1

原创 MySQL知识点总结

SQL基本操作数据库索引类型及原理锁数据存储引擎MCVV(多版本并发控制)实现机制数据库事务隔离级别事务就是访问数据库进行的一组数据操作,所有操作必须成功,否则就会回滚所有操作导致失败。一、事务的四大特性(ACID)1、原子性(Atomicity): 事务开始后的所有操作要么全部完成,要么全部不完成,不能只完成一部分。事务执行过程中发生错误,会回滚已有操作并恢复到事务开始前的状态。2、一致性(Consistency): 事务开始前和结束后,数据库的完整性没有被破坏。比如:A向B转账1000

2021-03-07 20:55:26 2230 1

原创 快速排序总结

快速排序是冒泡排序的升级,都属于交换排序类,即通过不断比较和移动交换来实现排序。冒泡排序的实现是两两比较相邻的关键字,然后交换反序的记录,而快速排序的实现增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面移动到前面,从而减小了比较次数和移动交换次数。首先,我们看一下冒泡排序的实现1、冒泡排序基本思想:两两比较相邻记录的关键字,如果反序就交换记录,直到没有反序记录为止。实现代码为:void BubbleSort(vector<int>* L){

2021-02-25 14:58:59 703

原创 海量数据的处理问题

在实际中,经常会碰到对大量数据的处理问题,这就需要合理地应用数据结构和算法,从而提升数据处理效率。以下归纳总结几种海量数据处理的常见问题。1、如何在1亿个数据中找到最大的100个数错误想法:对数据进行快速排序,最佳时间复杂度为O(nlogn),但需要一次性将所有数据读入内存,导致内存占用过多且全部排序没必要。正确方法:分冶法+最小堆排序原理:将数据划分为100块,将数据块分配给多台服务器,每个cpu处理一块数据,采用最小堆排序,读入前100个数来建立大小为100的最小堆(建堆的时间复杂度为O(mlo

2021-02-24 16:41:54 688

原创 哈希表总结

为什么要有哈希表(1)顺序表中,要查找某个值value的记录,需要遍历顺序表,直到找到该值的位置,该方法的时间复杂度为O(k),0<k<=n。(2)有序表中采用二分法查找、红黑树中数据查找的时间复杂度均为O(logn)。这些常见的方法中,查找一个数都要通过比较得出,那么,是否能够直接通过关键字key找到元素存储的位置,令其时间复杂度为O(1)?为了满足快速查找的需求,哈希表就诞生了。哈希表定义在了解哈希表之前,我们需要先知道哈希函数。所谓哈希函数(也成为散列函数),就是关键字与存储位置

2021-02-04 20:31:46 451 1

原创 进程间通信总结

1、管道(pipe)概念:一种用于有亲缘关系的两个或多个进程之间的通信手段,可以提供单向的数据流,又称为无名管道。由于管道没有名字,只能用于有共同祖先进程的各个进程之间通信。特点:(1)半双工通信(即单向数据流),有固定的读入端和写出端;(2)只能用于有亲缘关系的进程之间通信;(3)本质上是一个内核缓冲区,也可以看作是一个特殊的文件。创建方式:#include<unistd.h>int pipe(int fd[2]);pipe函数返回两个文件描述符:fd[0]用于读数据,fd

2021-01-21 15:02:40 999

原创 死锁总结

什么是死锁通常是指多个线程在运行过程中因争夺资源而造成的一种僵局,当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进,就形成了死锁。但是单线程对同一资源多次加同一个锁也会造成死锁。产生死锁的情况1、**单线程死锁:**一个线程用一把互斥锁对某一资源加锁两次,自身就会陷入死锁状态。因为同一把互斥锁不能同时使用,一次使用需要加锁再解锁,才能进行下一次使用该锁,对某一资源加锁两次时,因为第一次的锁尚未释放,就开始第二次加锁,就会导致第一次的锁无法解开,第二次的锁也无法使用,就会产生死锁。2、*

2021-01-20 14:46:45 700

原创 C++面试易错知识点总结(持续更新中)

1、虚函数指针、虚函数表存放位置同一个类只有一个虚函数表,类的所有对象共享该类的虚函数表。每个对象内部都有一个指向该类虚函数表的指针vptr,每个vptr的存放地址与该对象的所在位置相同,但指向同一虚函数表vtable。windows系统中,虚函数表存放在可执行文件的常量段中,http://blog.csdn.net/vicness/article/details/3962767;linux系统中,虚函数表存放在可执行文件的只读数据段中(rodata),https://blog.csdn.net/w

2021-01-18 20:14:40 720 1

原创 心跳包

为啥要用心跳包呢?我觉得有两点,一是保证不活跃的客户端与服务端保持数据连接,二是检测客户端的异常断开。这两点是相关的,可以阐述为:长连接下,客户端可能很长一段时间都与服务端没有数据往来,理论上这个连接是正常的,但是若客户端异常断开(像网线拔掉),实际上连接就被强制断开,客户端无法发出断开连接的请求,服务端也就接收不到客户端断开连接的请求,就需要通过心跳包来实现定时检测。概念心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。心跳检

2021-01-12 21:32:01 526

原创 浅谈epoll的边沿触发与水平触发

使用epoll多路复用编程时,会用epoll_wait阻塞等待事件的发生,对应有边沿触发和水平触发两种工作模式。一、水平触发(EPOLLLT)水平触发:只要缓冲区有数据,epoll_wait就会一直被触发,直到缓冲区为空;水平触发(EPOLLLT)是epoll默认的工作模式,其优缺点如下:优点:保证了数据的完整输出;缺点:当数据较大时,需要不断从用户态和内核态切换,消耗了大量的系统资源,影响服务器性能;应用场景:应用较少,一般用于连接请求较少及客户端发送的数据量较少的服务器,可一次性接收所有数据

2021-01-06 23:31:12 4208 3

原创 linux下几个常用的命令

记录本人在写服务器项目时,调试过程中用到的几个命令。1、ping用于检测一个主机网络功能的可用性,以及网络的连接速度。其原理为:使用ICMP协议,向指定的网络地址发送一定数据长度的数据包,若网络地址存在且网络功能没有问题,就会返回同样大小的数据包,若在超时时间内没有返回,也会返回对应的错误信息。格式:ping 主机IP例如:在终端输入ping 127.0.0.1(127.0.0.1为本地环回地址,常用于本机模拟通信测试),结果无误,如下:ping命令的详解可参考博客:https://bl

2021-01-03 15:57:46 500 1

原创 线程同步(互斥锁、条件变量、读写锁、自旋锁)

线程同步所谓线程同步,就是有多个线程共享相同的内存时,需要确保共享数据在每个线程中都是一致的。若同一个共享变量在两个及以上线程中所显示的结果是不一样的,就表明线程不同步。什么情况下需要使用线程同步?当一个线程可以修改的变量,其它线程也可以读取或修改的时候,必须进行线程同步,否则可能导致错误。假设有两个线程A和B,需要对整型全局变量i进行递增操作,过程如下所示:递增操作不是原子操作,编译器完成递增操作实际上需要3条机器指令:(1)将变量从内存单元读入寄存器;(2)在寄存器中对变量进行增量操作;

2020-12-22 15:33:07 578

原创 muduo异步日志总结

muduo中的日志是指诊断日志,即通常用于故障诊断和追踪的日志,便于服务器发生故障时的线索追踪,是网络库中很重要的一个部分。在总结异步日志之前,首先应该清楚什么是异步日志?与同步日志又有什么区别?同步日志与异步日志同步日志:网络IO线程或业务线程直接向磁盘文件中写日志信息,只有等一条日志消息写完之后才能执行后续的程序。同步日志容易阻塞在磁盘IO上,效率较低且影响服务器性能,应尽量避免在服务器中多次使用磁盘IO。异步日志:网络IO线程或业务线程产生日志消息时,用一个缓冲区储存起来,等到合适的时机,用一

2020-12-20 23:05:04 1000 1

原创 TCP拥塞控制总结

网络中的资源包括链路容量(带宽)、交换结点的缓存和处理机等。拥塞控制的原理拥塞:接收方对某资源的需求超过了资源能提供的可用部分,即:对资源的需求>可用资源。拥塞的原因:(1)某个交换结点缓存的容量太小时,到达该结点的分组因无存储空间暂存而不得不被丢弃;(2)处理机的处理速率太慢,导致网络资源堆积无法及时处理;(3)链路容量小,输入网络中的负载过大。因此,拥塞控制的含义就是:防止过多的数据传入网络中,从而避免网络中的路由器或链路过载。负载:单位时间内输入给网络的数据量;吞吐量:单位时间

2020-12-15 18:31:23 1438

转载 struct结构体内存对齐解析

为什么要内存对齐虽然所有的变量最后都会保存到特定的地址内存中去,但是相应的内存空间必须满足内存对齐的要求,主要基于存在以下两个原因:硬件平台原因: 并不是所有的平台都能够访问任意地址上的任意数据,某些硬件平台只能够访问对齐的地址,否则就会出现硬件异常错误。性能原因: 如果数据存放在未对齐的内存空间中,则处理器在访问变量时要做两次次内存访问,而对齐的内存访问只需要一次。上述两个原因,第一个原因从字面意思上就能够理解,那第二个原因是什么意思呢?假定现在有一个 32 位微处理器,那这个处理器访问内存都是按

2020-12-14 12:57:50 1384

原创 sizeof与strlen的区别

strlen的源码为:_Check_return_ size_t __cdecl strlen(_In_z_ const char * _Str);sizeof与strlen的区别1、sizeof计算的是分配的内存空间实际占用的字节数; strlen计算的是内存空间中字符的个数(不包括"\0")。 2、sizeof是运算符,参数可以是指针、数组、类型、对象和函数; strlen是函数,参数必须是字符型指针(char*)。 3、sizeof是在编译时计算,故参数为数组名时计算的是整个数组

2020-12-13 23:29:17 207

原创 智能指针原理剖析(一):auto_ptr、unique_ptr

通过常规指针管理动态内存的难点及缺点:(1)忘记释放动态内存: 使用new/malloc分配动态内存时,需要使用delete/free手动释放内存,但程序员容易忘记释放内存,从而产生内存泄露;(2)动态内存释放时机不对: 在尚有指针引用内存的情况下,程序员释放了内存,从而产生空悬指针。典型的案例就是:假设在多线程编程中,线程A、B中分别有指针p1、p2指向对象object,若某个时刻线程A通过p1将object销毁了(释放了object占有的内存),那么线程B中的p2引用object就会产生内存错误。

2020-12-13 13:58:16 721

原创 linux中进程pid,线程tid以及线程pid

进程pid进程pid(进程ID),每个进程在系统中都有一个唯一·的非负整数表示的进程ID,用getpid() 获取进程ID。线程tid线程tid(线程ID),每个线程在所属进程中都有一个唯一的线程ID,用pthread_self() 获取自身现成ID。有多个进程时,可能会出现多个线程ID相同的线程,故线程tid只在其所属的进程上下文中有意义,不能作为系统中某个线程的唯一标识符。线程pid线程pid,每个线程在系统中都有一个唯一的pid标识符,用系统调用sys_call(SYS_gettid())

2020-12-08 16:10:32 3544

原创 C++中用open读取含文字注释的实验数据

有一个实验数据文件,需要读取前三行数据,实验数据格式如下:C++代码:#include<iostream>#include<fstream>#include<vector>#include<string>using namespace std;vector<vector<double>> vMeasure_;//打开文件数据void openfile(string filename, vSuper& v1

2020-12-04 15:03:26 270

原创 浅谈深拷贝与浅拷贝

浅拷贝:利用类提供的默认拷贝构造函数,将一个对象的成员所在内存的数据复制给另一个对象的成员。对于简单的类来说,使用浅拷贝就可以满足正常需求了,但是当类中有指向动态内存的指针时,浅拷贝的使用很容易造成内存错误,就需要显式定义拷贝构造函数。浅拷贝错误案例一起看一个浅拷贝的案例:#include<iostream>using namespace std;#include<memory>class Base{public: Base(int A, int B) {

2020-11-28 21:31:58 284

原创 总结:不同继承模式下,派生类及派生类对象对基类成员的访问权限

类中的成员可以分为三种类型,分别为public成员、protected成员、public成员。类中可以直接访问自己类的public、protected、private成员,但类对象只能访问自己类的public成员。public继承派生类可以访问基类的public、protected成员,不可以访问基类的private成员;派生类对象可以访问基类的public成员,不可以访问基类的protected、private成员。protected继承派生类可以访问基类的public、protected成员,

2020-11-28 17:05:50 4946

转载 c++是否应避免使用普通指针,而使用智能指针(包括shared,unique,weak)?

转自:详解 C++ 11 中的智能指针先说结论,是的,你应该尽量使用这些智能指针。C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念。这里不置贬褒,手动分配内存与手动释放内存有利也有弊,自动分配内存和自动释放内存亦如此,这是两种不同的设计哲学。有人认为,内存如此重要的东西怎么能放心交给用户去管理呢?而另外一些人则认为,内存如此重要的东西怎么能放心交给系统去管理呢?在 C/C++ 语言中,内存泄露

2020-11-27 11:11:37 1229

原创 matlab自动读取目录下的所有文件数据,并保存为.mat文件

工科生利用matlab读取实验数据应该是一个必备技能了,最常见的做法就是直接用load命令加载对应的文件,但是使用load命令是非常不方便的,原因有二:一、load命令只能读取数据规格相同的文件,但是实验数据前面往往有一些文字描述,读取会发生错误,要想读取数据就要先手动删除这些文字描述再读取,这是很不方便的。如下图,(前23行是本次数据的相关字符信息)二、当读取文件数量较多时,load命令不能设置自动读取所有文件,需要手动输入每个文件名,效率较低。如下图所示,以上图文件为例,为了提高数据分析效率,直

2020-11-26 21:58:08 4002

原创 智能指针原理剖析(二):shared_ptr、weak_ptr

通过常规指针管理动态内存的难点及缺点:(1)忘记释放动态内存: 使用new/malloc分配动态内存时,需要使用delete/free手动释放内存,但程序员容易忘记释放内存,从而产生内存泄露;(2)动态内存释放时机不对: 在尚有指针引用内存的情况下,程序员释放了内存,从而产生空悬指针。典型的案例就是:假设在多线程编程中,线程A、B中分别有指针p1、p2指向对象object,若某个时刻线程A通过p1将object销毁了(释放了object占有的内存),那么线程B中的p2引用object就会产生内存错误。

2020-11-24 20:56:31 2191

原创 面试题:什么是右值引用?右值引用与左值引用的区别

上一篇博客剖析了引用的底层实现原理,文中所述的“引用”默认表示为左值引用。一、左值与左值引用什么是左值引用呢?左值引用,就是绑定到左值的引用,通过&来获得左值引用。那么,什么是左值呢?左值,就是在内存有确定存储地址、有变量名,表达式结束依然存在的值。左值可以分为两类:非常量左值和常量左值;同理,右值也可以分为两类:非常量右值和常量左值。左值引用举例说明:int a=10; //非常量左值(有确定存储地址,也有变量名)const int a1=10;

2020-11-20 23:12:37 14107 11

原创 底层剖析引用实现原理(引用是占有内存空间的)

正如《C++ primer》中所述,“引用即别名,它并非对象,相反地,它只是一个已经存在的对象所起的另外一个名字。”刚学习C++的时候,觉得引用就是一个别名,并不会占有内存。剖析了引用的底层实现原理之后,才发现这是错误的,引用也是会占有内存的,且底层是通过指针来实现的。一、底层剖析引用实现原理以下是一段对引用和源变量取地址的代码,一起看一下#include<iostream>using namespace std;int main(){ int a = 10; int &

2020-11-20 16:35:39 2901 4

原创 有继承关系时,基类的析构函数是否要定义为虚函数?(这一篇就够了)

析构函数是类中一个重要的函数,用于释放类对象使用的资源,并销毁对象的非static数据成员。**当类对象被销毁时,会自动调用其析构函数,销毁对象的所有非静态的数据成员,从而避免内存泄露。**对于C++初学者,当有继承关系时,由于析构函数掌握不够,容易在销毁对象时造成内存泄露。以下从销毁对象时发生内存泄露的情况、解决内存泄露的两种方法及原理来帮助读者掌握析构函数。首先,写一个Child类继承Base类:#include<iostream>using namespace std;class

2020-11-19 19:39:02 1094

原创 从C++运算符重载到类模板(以复数类为例)

这几天在用C++写一个本专业相关的项目时,涉及到的频域信号是复数(s=a+bi),不是C++内置的数据类型,无法直接调用运算符进行计算,于是就自己写了一个复数类来实现了复数运算的相关功能。虽然C++标准库std中已经实现了complex类,包含头文件(#include < complex >)就可以直接调用,但是小编觉得复数类是学习C++运算符重载一个很好的案例,因为会涉及加、减、乘、除、相等、赋值等这些常见的运算符重载。接下来我们一起来学习一下运算符重载。一、运算符重载概念引入像上图的传

2020-11-12 18:26:46 1117

原创 从内存角度剖析虚函数实现多态的原理

刚开始学习C++虚函数的时候,只知道虚函数就是用来构成动态多态的,以及如何使用虚函数。但是我发现当碰到稍微复杂的多态问题的时候,就很难以理解其实现原理,导致使用出错,比如:一个派生类继承基类,生成对象有两种方式:调用基类生成对象、调用派生类生成对象,调用完毕后释放对象,哪种方式必须要用虚函数实现基类和派生类的析构函数,如果不用会出现什么问题?(这个问题后面我会单独写一个博客再解释)。而《C++ Primer》中更多的是对虚函数使用的讲解,查阅有关虚函数的博客也仅仅是在结论层次对虚函数、纯虚函数进行分析和比较

2020-11-04 22:43:04 1037

原创 I/O多路复用模型—select、poll、epoll的原型详解及优缺点对比

一、select1、select函数原型详解int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);参数解释: maxfdp——传入参数,集合中所有文件描述符的范围,即最大文件描述符值+1 readfds——传入传出参数,select调用时传入要监听的可读文件描述符集合,select返回时传出发生可读事件的文件描述符集合 writefds——传入传出参数,s

2020-10-29 14:32:42 788

转载 面试题:vector迭代器什么时候会失效?

在vector中,我们经常会使用迭代器iterator对vector中的元素进行索引,也经常需要将迭代器作为参数传递到vector的成员函数中,迭代器使用非常方便,但使用不当也会给我们带来巨大的麻烦,下面就深入分析vector迭代器失效的场景。一、 push_back导致迭代器失效vector在push_back的时候当容量不足时会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,这自然是会导致迭代器失效的,因为迭代器所指的内存都已经被释放。举例如下:#

2020-10-24 20:44:29 5051 2

原创 linux进程的调度方式(面试题)

linux进程分为实时进程(有实时需求的进程)和普通进程两种,实时进程的优先级高于普通进程,故优先执行实时进程。实时进程的调度方式: 静态优先级策略+先进先出策略/轮转策略系统调度时,首先执行静态优先级策略,会根据用户设定的静态优先级对实时进程进行排序,先执行优先级高的进程直到完毕,再执行优先级低的进程。当有数个实时进程的优先级相同时,有先进先出策略(SCHED_FIFO)和轮转策略(SCHED_RR)供用户选择。若为先进先出策略,系统会根据进程出现在队列上的位置选择执行的顺序;若为轮转策略,系统会为实

2020-10-22 22:00:10 1241

原创 进程、线程及协程的区别

一、概念**进程:**进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位;**线程:**线程是进程的一个执行单元,是任务调度和系统执行的基本单位;二、区别**1、根本区别:**进程是操作系统资源分配和独立运行的最小单位;线程是任务调度和系统执行的最小单位。**2、地址空间区别:**每个进程都有独立的地址空间,一个进程崩溃不影响其它进程;一个线程组中多个线程共享一个进程的地址空间,一个线程的非法操作会使整个进程崩溃。**3、上下文切换开销区别:**

2020-10-21 22:53:06 15049 1

原创 select函数详解及使用案例

1、select函数原型int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);参数解释: maxfdp——传入参数,集合中所有文件描述符的范围,即最大文件描述符值+1 readfds——传入传出参数,select调用时传入要监听的可读文件描述符集合,select返回时传出发生可读事件的文件描述符集合 writefds——传入传出参数,select调用时传入要

2020-10-21 16:06:42 16177 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除