自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 openstack 之 nova调度过程及源码分析

我们在创建云主机的时候,openstack肯定需要选择在哪个计算节点上面创建云主机,然而选择的标准就是用户定义的flavor,flavor包括磁盘大小,内存大小,vCPU个数以及metadata等等,openstack会根据这些参数选择一个合适的计算节点来创建云主机。

2022-08-23 16:39:50 2421 1

原创 openstack 之 novnc流程分析

noVNC是一个支持HTML5的VNC客户端,主要作用就是与远端的vnc server进行互通,从而实现对于远端主机的控制。说白了,我们可以通过VNC客户端或者支持HTML5的浏览器访问远端安装了vnc server的服务器桌面从而进行控制。......

2022-08-12 17:24:15 2404

原创 【求助】openstack中的spice如何实现复制粘贴

请问一下大家知不知道用spice打开的instance页面如何实现复制粘贴呢?有没有大佬可以指教一下着。下图是我打开的基于spice的控制台页面以及使用remote-viewer打开的页面。图2 remote viewer打开的控制台页面。图1 dashboard打开的控制台页面。...

2022-08-12 10:18:02 506 2

原创 求助:openstack里面自带的novnc该如何进行复制粘贴呢

虽然界面上有剪切板但是却不起作用。之前百度了很多帖子都未解决该问题,难道是因为novnc的版本原因还是openstack本身就不支持复制粘贴剪切板功能呢?openstack里面自带的novnc该如何进行复制粘贴呢?...

2022-08-05 15:51:31 2158 1

原创 openstack 之 nova架构,源码剖析

nova是openstack最核心的服务,负责维护和管理云环境的计算资源。因此,云主机的整个生命周期都是由nova负责的。

2022-08-04 17:25:52 1411

原创 条件变量和互斥锁的使用

一 条件变量前面的文章已经讲过互斥锁的使用规则,接下来,我们再来讲一下条件变量。条件变量其实就是一种通知机制,当某个共享数据到达某个值的时候,通知等待该共享数据到达该值的线程来处理该共享数据。条件变量一般是用于让生产者线程和消费者线程之间以及消费者线程之间互斥的访问临界资源(临界资源指的是同时只允许一个线程访问的共享资源)。条件变量的使用一般是需要结合互斥锁来进行(条件变量相关函数的输入参数就是互斥锁),从而使得各个线程能够互斥的访问该临界资源。二 条件变量的使用条件变量在pthread

2022-05-24 11:52:31 1964

原创 POSIX信号量

一 介绍由于线程和进程一样,也需要考虑同步操作,线程的同步操作主要有POSIX信号量,互斥锁以及条件变量。其中,POSIX信号量和之前介绍的IPC信号量一样,具有相同的功能。接下来,我们直入主题,具体来看看POSIX信号量如何使用吧!二 POSIX信号量的相关函数POSIX信号量相关函数在semaphore.h头文件当中。2.1 信号量的初始化int sem_init(sem_t*sem,int pshared,unsigned int value);函数功能:初始化一个信号量,并

2022-05-24 00:58:25 287

原创 互斥锁的含义及其使用

一 互斥锁的含义互斥锁其实就相当于一个初值为1的二元信号量,互斥锁只有两种状态,要么解锁,要么上锁。互斥锁一般用于保护关键代码,从而实现互斥访问。二 互斥锁的使用互斥锁相关函数在pthread.h头文件中声明。2.1 互斥锁的创建int pthread_mutex_init(pthread_mutex_t*mutex,const pthread_mutexattr_t*mutexattr);函数功能:用于初始化一个互斥锁。函数参数:mutexattr指针用于设置互斥锁的属性,不

2022-05-24 00:26:49 2894

原创 进程的IPC操作 之 消息队列

一 消息队列消息队列是一种进程间的通讯的消息队列,能够独立于读端和写段,如果发送或者接收进程终止了,其中的消息也不会消失,并且进程可以按照类型对消息队列进行读写。二 消息队列的相关函数消息队列的函数定义在sys/msg.h头文件中。2.1 消息队列的创建int msgget(key_t key, int msgflg);函数功能:主要是在内核创建一个消息队列。函数参数:1.key:主要是用于全局表示这个IPC资源:消息队列的唯一性;2.msgflg:和信号量semget

2022-05-17 21:20:28 691

原创 进程的IPC操作 之 共享内存

一 共享内存的作用共享内存主要是用来实现进程间通讯的一种机制,只不过,需要进程间互斥的访问这段内存,因此需要使用信号量等锁机制来对共享内存进行访问。二 共享内存的实现共享内存的实现主要由两种方式:一种是shm系统调用;一种是mmap实现共享(因为mmap也可以实现私有映射)的页面映射。2.1 shm系统调用shm系统调用主要是在sys/shm.h头文件中。2.1.1 共享内存的创建int shmget(key_t key, size_t size, int shmflg);

2022-05-15 15:57:57 838

原创 进程的IPC操作 之 信号量

一 信号量的定义信号量的出现,主要是为了解决进程之间对于临界资源的独占式访问。信号量可以满足对于改临界资源的访问只能有一个进程。二 信号量的操作LINUX的信号量API都定义在sys/sem.h头文件中:2.1 信号量的创建int semget(key_t key, int num_sems, int sem_flags);函数功能:创建或者获取由键值key标识的信号量集合。函数参数:key:主要是用于在全局唯一的表示一个信号量集合,相当于全局的文件名一样。num_se

2022-05-14 21:29:16 811

原创 TCP聊天室:一个acceptor线程,多个工作线程

一.简介该聊天室相对于之前的聊天室进行了相应的升级:之前的聊天室进程中只有一个线程,因此该聊天室程序对于监听描述符上的连接请求以及多个聊天室成员的连接描述符上的读写操作只能完成一个;该聊天室进程中采取了多线程模式,类似于线程池的思想,一个聊天室进程中可以并发的利用主线程处理监听描述符上的连接请求,同时对于每一个聊天室成员的连接描述符分配一个工作线程,完成与该聊天室成员的读写操作.具体的思想是(创建多个线程,每个线程运行一个独立的...

2022-04-19 12:05:52 2405 2

原创 TCP聊天室

一.服务器代码#include "hv/hloop.h"#include "hv/hsocket.h"#include "hv/hbase.h"#include "list.h"struct chatroom_s { hloop_t* loop;//事件循环结构体指针 hio_t* listenio;//监听io结构体 int roomid;//房间号 struct list_head conns;//链表存储房间中的连接};struct chatroom_s chatroom;

2022-04-07 15:43:48 369

原创 libhv学习路线 之 HTTP服务器

HTTP服务器的内部实现原理主要用到了进程和线程的概念,利用多个进程或者线程同时监听 监听socket上的连接事件.一 HTTP服务的建立 1. HTTP服务器的建立首先需要建立HTTP所需要的HTTP服务(HttpService变量),该变量中主要存储了各种客户端发来的get,post等请求的响应内容(以GET方法为例),建立方法如下所示:HttpService router;router.GET("/ping", [](HttpRequest* req, HttpRespon...

2022-03-27 09:45:38 2946

原创 libhv学习路线 之 TCP客户端

TCP客户端的代码实现由于基本思路和服务器差不多,所以我就不进行代码讲解了,只是展示以下我的具体实现过程:A.调用hloop_new()函数建立事件脚本;hloop_t *loop = hloop_new(0);B.调用hloop_create_tcp_client()函数与服务器建立连接,并且返回连接socket,在连接socket对应上的I/O事件上创建connect事件,绑定on_connect()用户回调函数;hio_t *conn...

2022-03-21 23:03:50 776

原创 libhv学习路线 之 TCP服务器

对于libhv TCP端的服务器实现,基本上也已经被libhv封装完成了,所以我们只需要研究以下libhv内部是如何实现TCP连接建立,以及收发数据的.一 基于libhv的TCP服务器内部实现原理 A..我们需要建立一个事件回环loop变量,具体代码如下所示:hloop_t* loop = hloop_new(0); B.调用hloop_create_tcp_server()函数建立TCP连接,具体代码如下所示,IP地址设置的是0.0.0.0的主...

2022-03-21 17:41:17 5617 2

原创 libhv学习路线 之 I/O复用

目录一 I/O事件的创建二 I/O事件的执行三 I/O事件执行顺序以epoll为例,libhv在LINUX操作系统使用的是基于epoll的I/O复用.对于高性能服务器中,I/O复用事件的出现使得服务器能够同时监听多个端口,同时处理多个TCP,UDP请求;客户端也可以同时处理多个用户输入和网络连接,甚至可以处理非阻塞connect()(如果第一次调用非阻塞connect连接没有立即建立返回,则调用select()监听socket上面的写事件,如果存在写事件...

2022-03-21 14:40:46 3065

原创 libhv学习路线 之 定时器

定时器事件,顾名思义就是定时事件到了,于是开始执行的事件.一 定时器事件的创建

2022-03-20 23:09:12 1048

原创 libhv学习路线 之 idle事件

目录一 idle事件的创建:二 idle事件的处理三.idle事件的销毁四.idle事件执行顺序libhv提供的事件除了支持定时器事件和I/O事件之外,还额外提供了idle事件.初看idle事件,根据字面意思:"空闲的"可得,这个事件指的是当libhv事件回环中没有其他事件(定时器或者I/O事件)可以执行时才会去执行的事件.一 idle事件的创建: hidle_add函数的用途是:1.在堆区创建一个idle类型的节点(赋予事件类...

2022-03-20 16:32:23 471

原创 libhv学习路线 之 list.h

在libhiv库函数中,有一个双向链表的实现,这个双向链表不同于我们一般认知的双向链表,它是没有数据的,只有前趋后继指针,具体代码如下所示(函数位置在base文件夹下面的list.h头文件中):struct list_head { struct list_head *next, *prev;};#define list_node list_head从以上我们可以看出,每一个list_node节点只有指向之前list_node节点和之后list_node节点...

2022-03-20 11:25:30 349

原创 动态规划 之 数形DP

对于动态规划二叉树问题,与之前的动态规划的问题有明显不同:以往的动规问题遍历的一般都是一维或者二维数组,但是对于这种树形DP问题,需要遍历的就是一颗二叉树。一般对于二叉树的遍历有前/中/后 序遍历(深度优先搜索)和层序遍历(广度优先搜索)。一 典型问题小偷⼜发现了⼀个新的可⾏窃的地区。这个地区只有⼀个入口,我们称之为“根”。 除了“根”之外,每栋房⼦有且只有⼀个“父“房子与之相连。⼀番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于⼀棵⼆叉树”。 如果两个直...

2022-03-17 11:34:24 300

原创 动态规划 之 完全背包

动态规划完全背包问题主要指的是:1.给定一个容量为max_weight的背包,每一种物品的质量为weight[i],价值为value[i],且每一种物品的个数有无限个,问:如何放置可以使得背包价值最大?2.可以转换为此类问题的题目。一 典型问题假设有一个质量为5的背包和3种物品,且每个物品的质量都不一样,这组物品的质量和价值为weights=[1,2,3],values=[2,4,6],且每种物品数量有无数个。问:如何放入物品可以使得背包中的总价值最大?1.1 分...

2022-03-15 11:37:29 1333

原创 动态规划 之 零一背包

动态规划中的零一背包问题是动规问题中十分典型且常见的一类问题,该类问题指的是:1.有一个容量为max_weight的背包和n个类型物品,每一种物品的质量为weight[i],价值为value[i](i为物品的编号),且每种类型的物品个数只有一个,问如何放置可以使得背包中的价值最大;2.可以转换为此类问题的问题。一 典型问题假设有一个质量为5的背包和3个物品,且每个物品的质量都不一样,这组物品的质量和价值为weights=[1,2,3],values=[2,4,6]。问...

2022-03-14 14:07:36 1855 1

原创 序列式容器 之 list容器

相比于vector容器,list容器要更加得复杂,但是好处是对于每次插入和删除一个元素,就配置或释放一个元素空间,因此,list对于空间得运用更加地精准,一点也不浪费。一.list的节点list的节点主要由指向上一个节点的指针,指向下一个节点的指针和数据组成。其中,指针的变量类型是void* 类型,这样在调用时需要在指针前面加上类型强制转换。template <class T>struct _list_node{ typedef void*...

2022-02-14 15:24:20 279

原创 几种数据结构与算法 之 线索二叉树

目录一.线索二叉树的定义和由来二.线索二叉树的构建三.循环遍历线索二叉树四.运行结果一.线索二叉树的定义和由来我们都知道,二叉树的数据结构一般由节点数据,左孩子和右孩子组成:typedef struct BiNode{ char data; BiThrNode *lchild, *rchild;} BiThrNode, *BiThrTree;因为叶子节点的左孩子和右孩子为空(NULL),会造成内存的浪费,因此前辈发明了线索二叉树,它...

2022-02-13 12:22:53 676 1

原创 序列式容器 之 vector详解

vector容器是c++模板库中十分重要且有用的容器,它的存储结构属于线性表,不过究其根本,vector容器的存储地址是在堆区开辟的,以下本文将简单介绍vector容器的使用方法以及内部实现原理。一.vector的迭代器 由于vector维护的是一个连续的线性空间(通过SGI提供的配置器alloc申请的连续内存),所以vector的迭代器(迭代器说白了就相当于指针的作用,由于容器是一种特殊的数据结构,需要迭代器这种特殊的指针进行维护,从而实现像普通指针那样对容器内存的访...

2022-02-12 16:48:25 1469

原创 空间配置器 之 内存的配置与释放

目录一.SGI的配置器二.第一级配置器(malloc_alloc)三.第二级配置器3.1 几点说明3.2 空间配置器allocate()3.3 重新填充(refill(size_t n))3.4 对第一级和第二级配置器进行封装一.SGI的配置器SGI设计了双层级配置器:1.当配置区块超过128字节,调用第一级配置器,即间接调用malloc()和free();2.当配置区快小于128字节,视之为“过小”,采用第二级配置器。二.第一级配置器(mallo...

2022-02-06 22:09:17 386

原创 空间配置器 之 空间的析构与构造

目录一.简述二.对象的构造与析构:2.1 内存的构造:2.2 内存的析构:一.简述 声明:本文主要是对侯捷老师的STL源码剖析这本书的整理与自我思考。以STL的角度来说,空间配置器不是最重要要介绍的东西,但是一切容器中元素的创建与删除,都与空间配置器有着紧密的联系。 SCI中包含有两种空间配置器:std::allocator与std::alloc。allocator只是对(::operator new与::operator del...

2021-09-15 11:20:10 147 2

空空如也

空空如也

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

TA关注的人

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