什么是进程、线程、协程
进程
进程是计算机的一种基本运行单位,由操作系统管理资源和分配资源的基本单位,进程可以理解为一个正在运行的程序
线程
线程是计算机的一种独立执行单元,是操作系统能够进行运算调度的基本单位,线程之间共享资源,是两个同时进行的管道
协程
协程是一种假多线程,可以将代码分时执行,不卡主线程,把可能让主线程卡顿的耗时逻辑分时分布执行
进程通信方式
- 管道:是一种半双工的通信方式,允许一个进程将数据发送给另一个进程,但只能在具有共同祖先的进程之间使用。
- 信号:是一种即时的、不可靠的进程之间通信方式,不支持数据传输。
- 消息队列:是进程之间的可靠通信方式,用于在不同进程之间传递消息。
- 共享内存:高效,允许多个进程共享一块内存区域,以实现进程的通信,支持大量数据传输
- 套接字(Socket):可靠的通信方式,在两个不同的进程(不同机器)之间建立一个逻辑连接,实现进程之间的通信,支持同步和异步的通信,可以传输大量数据
怎么处理并发
使用锁:在对数据进行操作之前,先对数据加一个锁,在操作完成之后在释放锁
进程和线程的区别
进程拥有独立的内存空间,线程是共享进程的内存空间
一个进程可以包含多个线程,线程不能独立存在,必须依赖于进程
进程独立分配资源,线程之间共享资源
进程之间相互独立,互不影响,线程共享资源,相互之间会有影响
协程与线程的区别
线程是独立运行的管道,和主线程并行执行
协程是再原线程之上开启的,进行逻辑分时分布处理
线程是由操作系统调度执行的,而协程是由程序自身控制执行的
一个线程可以有多个协程
快排的思想
- 首先在数组中选择一个基准元素,通常选择第一个元素或者最后一个元素;
- 分区操作,将比基准元素小的放到左边,将比基准元素大的放到右边;
- 递归地对左右两部分子数组分别重复上述步骤,直到所有分区只剩下一个元素为止,这就意味着排序结束。
给你一个有序的数组,怎么将他打乱
可以使用Fisher–Yates Shuffle算法,它是一种随机洗牌算法。
算法步骤如下:
- 从最后一个元素开始,随机选择一个位置,并将其与最后一个元素交换。
- 重复步骤1,直到把第一个元素也随机交换一次。
以下是实现的C++代码:
- void shuffle(int array[], int n)
- {
- for (int i = n - 1; i > 0; i–)
- {
- int j = rand() % (i + 1);
- swap(array[i], array[j]);
- }
- }
多态的实现
- 静态多态是指编译时多态,它是通过重载实现的,即多个函数名称相同,参数列表不同的函数,编译器在编译时就能根据参数列表的不同来区分调用哪一个函数。
- 动态多态是指运行时多态,它是通过虚函数实现的,即父类中声明一个虚函数,在其子类中重写该函数,在程序运行时,根据实际对象的类型来调用其对应的函数,从而实现多态。
map和set插入删除有啥区别
- map支持插入和删除操作,而set只支持插入操作,不支持删除操作。
- map中插入的数据是键值对,而set插入的是单一的值。
- map插入数据时,key必须是唯一的,而set插入数据时,值也必须是唯一的。
- map支持插入和删除操作,而set只支持插入操作,不支持删除操作。
socket通信,如果客户端崩溃服务器会怎么样
如果服务端发送数据给客户端没有得到任何的反馈,在超时之后服务端会发送一个探测报文,在连续发送十个探测报文都没有得到回应,服务端默认此次连接关闭。