自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 操作系统原理与Linux编程——知识合集[长期更新......]

记录一些操作系统的基本概念,没那么详细,就浅浅的认识一下操作系统

2023-04-28 18:19:54 610 5

原创 C++日拱一卒——知识合集[长期更新......]

以下所有的内容都属于我的个人总结与思考,但同时又想作为一种资源供大家学习、参考。文章的水平和质量可能不是很高,也有可能内容有些小错误,希望各位读者能够私信我指出错误。C++的部分分为三个版块:C++基础知识部分、STL部分、C++11特性以及其他。

2023-04-28 09:25:42 186 5

原创 Qt入门日记1

Qt是一个跨平台的C++图形用户界面应用程序框架(就是一个库吧),它是完全面向对象的,允许真正意义上的组件式编程。Qt是Linux桌面环境KDE的基础,它有商业版和开源版。Qt的成功案例有很多,例如Linux桌面环境KDE、WPS等等。跨平台,几乎支持所有平台接口简单一定程度上简化了内存回收机制(对象树)可以进行嵌入式开发在没有接触Qt之前,上面的代码对于C++程序员来说是难受的,因为new了一个QPushButton对象却并没有做delete操作。

2023-11-01 20:32:52 672 1

原创 C++避坑——most vexing parse问题

按照正常的思路分析这段代码应该是这样的:Functor类当中有一个"operator()"成员函数,这就注定Functor类对象是一个可调用对象(当成函数一样使用)。那么在"std::thread t(Functor())"当中,t的构造函数的参数是一个Functor类的匿名对象,也就相当于传递了一个线程的初始函数。这句代码之后,输出结果应该为"我是线程的初始函数"才对。但是这段代码的结果却是:啥玩意???竟然报错!!??后面反复编译了几次,依然是这个结果。这就让我陷入了沉思......

2023-08-25 23:11:09 1070

原创 简单理解Linux中的一切皆文件

Linux管理的硬件可能有键盘、网卡、显示器、磁盘等等,这些硬件呢会有配套的驱动程序,这些驱动程序当中会有让硬件执行某个操作的方法。因为Linux做出了抽象,那么这个抽象层有一个专属的名词,叫做VFS(虚拟文件系统),VFS使得用户可以直接使用read()、write()等系统调用而无需考虑具体的文件系统和实际的物理介质。但是Linux是用C写的,所以说它是多态是不准确的(因为C不是一门面向对象的语言),但是作为Linux的使用者确实感受到了多态这一特性。驱动程序不是有控制硬件行为的方法么?

2023-08-19 21:26:43 463

原创 TCP拥塞控制简单理解

TCP依靠序号、确认应答、滑动窗口、超时重传、流量控制等手段来确保通信过程的可靠性(可靠性就是确保数据的完整、按序、准确)。拥塞窗口主要解决网络的问题,但正是因为TCP提供了拥塞控制的机制,即保证网络是正常工作的,所以拥塞控制也是保证可靠性的手段。

2023-08-18 20:43:59 288

原创 C++——移动构造和完美转发

本篇介绍了右值引用、移动构造和移动赋值,还介绍了完美转发、引用折叠等概念

2023-08-17 21:22:23 329

原创 Linux-C++开发项目:基于主从Reactor模式的高性能并发服务器

本篇文章描述了从0到1实现一个高性能并发服务器,并且支持了HTTP协议。

2023-08-13 15:53:25 1432 2

原创 Linux——信号处理函数与阻塞状态的进程

子进程当中的read()如果返回值为0,就说明连接已经断开了,此时子进程就会退出。同时,在子进程处理I/O的时候,父进程已经在accept()处阻塞了,此时如果子进程处理的I/O连接断开,子进程就会退出,父进程就会收到SIGCHLD信号,然而此时的父进程正处于阻塞状态,所以操作系统会强制唤醒父进程以便调用信号处理函数,而父进程的accept()没有收到任何可用连接并且又从accept()处唤醒,因此accept()的返回值为-1,所以会打印一个"accept error!"确实是比较奇怪的。

2023-07-09 23:49:30 547

原创 C++——多态与虚表

根据继承关系中,派生类向基类赋值没有发生类型转换的特性,可以得出一个结论:基类的指针或引用指向了一个"基类对象",这个"基类对象"有可能是基类本身的对象,也有可能是派生类当中的基类部分,由于编译时确定不了(因为这两种基类对象没有差别),所以多态又称运行时绑定。

2023-06-03 23:14:26 721 7

原创 C++——菱形继承和虚继承

C++作为"第一个吃螃蟹的人",勇敢地设计出了多继承的语法,多继承出现之后,由于一些顶尖程序员的脑洞非常大,就发现了菱形继承所带来数据冗余和二义性的问题,C++标准委员会为了解决这个问题,就设计出了虚继承。从此之后,后面"抄作业的人"就没有多继承的语法,例如java。

2023-05-31 22:32:35 986 2

原创 Linux系统编程——多线程[补充]:懒汉模式&自旋锁&读者写者问题

在一些软件设计场景当中,要求某些类只能具有一个对象,这样的模式我们就称为单例。例如服务器类,程序加载运行后,我们希望服务器类只实例化出一个服务器对象。。以一个通俗的例子来说明饿汉和懒汉:1.饿汉说的就是吃完饭,立刻洗碗,这样做就可以在下一次吃饭的时候不用洗碗2.懒汉指的是吃完饭,先不洗碗,直到下一次吃饭时再洗碗那么放在程序设计的角度,就可这么理解饿汉和懒汉:1.饿汉指的是。

2023-05-20 20:34:20 1202 5

原创 STL——string类的模拟实现

事实上string类严格意义上将它不属于STL,因为它的出现要比STL早,所以它的接口设计与其他STL容器比起来显得"不伦不类",因为这是C++后期对string类的升级,目的是为了向STL靠齐,所以添加了类似于size()、迭代器这样的东西。但是本篇博客着重在于模拟实现而不在于介绍接口,因为接口的介绍实在是太麻烦了(string类的接口有100多个),所以建议读者直接去查阅文档string类接口。现在要介绍的是,string类是什么。string类是一个专门管理字符串的类,与其说是管理字符串,不如说是。

2023-05-19 19:49:56 531 4

原创 Linux网络编程——基于UDP协议的简易聊天室

第一个名为"domain"的参数代表域,即我们想要使用网络套接字、原始套接字还是Unix域间套接字,很显然,这里我们应该选择网络套接字,所以该参数填。

2023-05-19 14:58:51 1691

原创 Linux系统编程——多线程[下]:生产消费模型&信号量&线程池

本篇介绍了基于阻塞队列的生产消费模型和基于环形队列的生产消费模型,并且简要分析了生产消费模型的特点,并讨论了为什么生产消费模型能够带来高效率。最后提到了池化计技术,并实现了线程池。

2023-05-19 11:48:04 987

原创 C++——函数模板与类模板

主要介绍了函数模板、类模板的基本用法以及一些注意事项。还有就是模板的分离编译问题。

2023-05-11 10:47:04 675 15

原创 Linux系统编程——多线程[中]:互斥与同步

2.加锁顺序一致:例如线程A需要加两把锁,分别为1号、2号,那么假设线程A的加锁顺序为1号、2号,那么其他线程也要加这两把锁时,加锁的顺序要与线程A的加锁顺序保持一致。还是以抢票程序为例,我们虽然让四个线程互斥地访问了临界区,但是其输出结果总是一个线程在抢票,这是因为线程之间的竞争结果,因为刚刚访问完临界资源的线程释放锁之后,它离锁是最近的,所以下一次循环上来时,其他线程刚要准备加锁,但是刚刚解锁的线程距离最近,所以直接将锁给抢走了,所以最后的输出结果表现为一个线程一直在抢票。事实上我们不用担心,因为。

2023-05-10 17:21:23 652 5

原创 C++——C/C++内存管理

int main()/*两种用法都是调用默认构造*/delete p1;delete p2;delete p3;return 0;可以看到new对自定义类型操作时会自动调用其构造函数;delete对自定义类型操作时会自动调用其析构函数。而在C语言中的malloc()和free()则不会这么干。

2023-05-09 11:39:00 684 3

原创 操作系统——文件管理

文件是计算机信息存取的一种重要组织形式,文件由若干。

2023-05-07 14:42:36 4248 3

原创 Linux网络编程——套接字网络编程预备知识

其中,我们需要认识到网络通信是相互的,所以客户端给服务端发送数据时,服务端接收到消息后,很有可能会向客户端回复一些消息,既然需要发送数据,那么就必须知道目标主机的IP地址和对应进程的端口号,所以无论是通信双方的哪个进程,只要向对方发送数据了,那么一定会多发一部分数据,这个多出来的数据就是自己进程本身的IP地址和端口号,而。在上面的例子当中,我们不难分析出什么是IP地址,什么是MAC地址,即IP地址就是东土大唐和西天,那么要从东土大唐到西天,东土大唐就是源IP地址,西天就是目的IP地址;

2023-05-07 10:38:31 982

原创 C++——类和对象[下]

C++知识合集目录1.再谈构造函数1.1初始化列表1.2初始化列表的初始化顺序1.3构造函数的隐式类型转换1.4explicit关键字2.static成员2.1static成员变量2.2static成员函数3.友元3.1友元函数3.2友元类4.内部类5.匿名对象6.编译器对拷贝对象的一些优化7.练习题构造函数的功能是在对象定义时初始化其成员,但是我们以前的初始化方式是"错误"的:即使这样做我们依然能够达到我们所谓的初始化效果,但我们需要注意,有些变量是必须在定义时给定初始值的,比如const变量、引用

2023-05-07 10:34:04 519

原创 操作系统——设备管理

输出监控进程模拟脱机输出的卫星机,将用户进程要输出的数据先送到输出井,当输出设备空闲时,将数据送到输出缓冲区,再送到输出设备上。进程申请设备->操作系统分配设备->进程发送使用命令->操作系统将该命令转发到驱动程序,让驱动程序控制设备完成一次I/O传输->进程释放设备->操作系统回收设备。2.设备分配程序按照一定的策略,为申请设备的进程分配设备,并记录设备的使用情况。操作系统需要一定的策略来分配设备,因为设备往往只有一份,如果分配的策略不合理,就会造成进程对设备的资源竞争,导致死锁。申请失败进入阻塞状态。

2023-05-05 18:08:35 1929 3

原创 Linux系统编程——多线程[上]:线程概念和线程控制

目录1.再谈页表2.Linux线程概念2.1pthread原生库的基本使用2.2PID和LWP2.3Linux线程的资源以及优缺点2.4Linux线程健壮性问题2.5可重入函数和线程独立栈3.Linux线程控制3.1Linux线程终止3.2Linux线程等待3.3线程取消3.4线程分离使用线程库的注意事项4.pthread原生线程库的理解4.1从语言的角度理解原生线程库4.2从底层的角度理解原生线程库5.对pthread原生线程库进行封装在通用操作系统和进程的部分当中,介绍了一个容易理解但不正确的有关页表的

2023-05-04 22:57:31 1205 4

原创 操作系统——内存管理

利用页表的访问位属性,页被访问时操作系统将其对应的页表项的访问位的值置为1,并且操作系统周期性地将页表中的所有页的访问位置0,需要淘汰页面时根据访问位来淘汰页面:访问位为1时,说明在周期时间内该页面被访问过,保留,不淘汰;:程序要装入内存运行时,操作系统使用进程描述该程序的一次运行活动,那么进程是资源分配的基本单位,所以进程具有进程地址空间(进程地址空间是一个实在的空间,但是这块空间的地址都是虚拟地址,所以更习惯称它为虚拟地址空间),该空间内存放有代码和数据。具体记录的属性有段号S,表示段的唯一编号;

2023-05-04 22:27:08 1290

原创 Linux网络编程——网络基础[1]

1.OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范2.OSI把网络从逻辑上分为了7层,每一层都有相关的、对应的物理设备,例如路由器、交换机3.OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输4.最大的优点是将服务、接口和协议这三个概念明确的分离开来5.它比较复杂并且不实用,实际上使用的都是TCP/IP四层模型。

2023-05-04 11:39:29 680

原创 操作系统——线程调度

例如1)和2),在操作系统当中存在成百上千个任务,所以他们之间要频繁地发生调度,就算调度的过程再快,它依然会影响线程的单位处理时间,也就是说本来在单位时间内可以处理1000条指令,但因为调度把单位时间给消耗了,此时只能执行400条指令了。,切换的过程与中断很像,但是存在一定的差别:发生中断时,操作系统需要保护CPU当前运行进程(线程)的上下文,然后装入中断处理程序的入口地址;而发生进程(线程)切换时,操作系统不仅需要保护CPU当前运行的进程(线程)的上下文,还要恢复被调度而来的进程(线程)的上下文。

2023-05-03 16:19:36 1989 4

原创 操作系统——死锁

两个或多个执行流无限期地等待永远不会发生的条件,其结果就是导致每个执行流永远阻塞。回到哲学家就餐的话题,每个哲学家都在无限期地等待邻座放下筷子,而邻座没吃完饭之前不会放下筷子,而每个哲学又都只有一支筷子而一直不吃饭,这就是一种死锁状态。

2023-05-02 15:25:39 983 1

原创 C++——类和对象[中]

主要介绍:构造函数、析构函数、拷贝构造、运算符重载、日期类、赋值运算符重载、const成员函数和取地址重载

2023-05-01 16:01:30 1331 3

原创 操作系统——进程管理

进程是程序在某个数据集合上的一次运行活动。注意抠字眼,进程是运行活动,前提是程序在某个数据集合上,这个数据集合就是软、硬件环境,被多个进程共享的环境,

2023-05-01 10:21:07 3185 2

原创 操作系统——操作系统用户界面

计算机有两种模式:  1.实模式:当计算机刚开机、刚上电、还没有加载操作系统的时候,计算器处于实模式(实地址模式,REAL MODE),程序将会按照8086的寻址方式方法直接访问物理地址0h-FFFFFh(1MB)的空间(我们说过没有操作系统的计算机也能运行程序)。其寻址并不是直接拿到物理地址,而是需要一定的转换,也就是说,当程序拿到某个地址,需要将其拆分为段地址:偏移地址,计算之后的结果才是物理地址。此时CPU只能支持单任务运行。  2.保护模式:又称内存保护模式(PROTECT MODE)。当操作系统被

2023-04-30 20:48:08 2236 1

原创 操作系统——操作系统逻辑结构

硬件直接按CPU的态来区分状态;操作系统则是按进程工作在哪种态下来区分的。

2023-04-29 10:19:27 2341

原创 操作系统——概述

操作系统功能之一:进程管理1.进程控制:操作系统能够控制进程的创建、暂停、唤醒、撤销等。2.进程调度:操作系统持有调度策略,为每个进程分配优先级。3.进程通信:操作系统有必要让进程之间产生联系。操作系统功能之二:内存管理1.内存分配:操作系统有必要合理的为每个任务分配内存。2.内存共享:必要时,为了让某些任务产生通信,操作系统必须提供内存共享的机制。3.内存保护:有时候我们希望任务与任务之间互不干扰,操作系统就必须有对应的手段保护每个任务占有的内存。

2023-04-28 18:14:31 1652

原创 C++——类和对象[上]

定义类的时候,我们将在类中定义的变量称为成员变量,定义的函数称为成员函数或者成员方法,这些成员函数都被编译器视为内联函数(即使我们不加inline关键字)。同时,类的定义构建了一个全新的作用域——类域。既然类构成了类域,在类中使用成员时,是否也需要遵循编译器的"向上搜索"呢?char* name;// 函数当中这样使用成员,是否正确?name = "";id = 0;age = 0;char* id;int age;这种使用方法是没有问题的,也就是说类域与常规的作用域不一样。

2023-04-28 09:15:30 808

原创 C++——入门基础知识

在上面的例子中,中有一函数rand,而我们并不知道其中有这个函数,而是直接定义了一个名为rand的整形变量,此时就会造成重定义。这就是一种命名冲突的表现。那么在C++中,为了弥补这方面的不足,诞生出了命名空间这么一个东西。先简单看看命名空间是如何定义的:定义命名空间,需要用到namespace关键字,在其之后要跟上命名空间的名字(随便取),然后再接一对大括号({}),大括号中可以定义命名空间的成员。namespace ly// 在全局域定义一个命名空间。

2023-04-26 22:02:43 738

原创 Linux —— 信号

信号是给进程发送的。如果一个信号到来,进程会做什么?首先进程必须识别信号,识别信号有两个关键点:认识信号;收到此信号后要做的动作。通常,信号的识别由程序员通过代码处理。在Linux下如何查看信号?使用如下命令:kill -l ===>查看信号其中,1~31称为普通信号,34~64称为实时信号。本片文章只谈论普通信号。当某个进程收到一个信号后,它不一定马上处理信号,进程很可能在做其他任务。进程的任务执行和信号的产生是异步的。

2023-03-24 22:49:02 786

原创 C++数据结构 —— 哈希表、unordered_map/set封装

顺序结构以及平衡二叉搜索树结构中,在查找一个元素时需要经过比较。顺序查找时间复杂度为O(N),平衡二叉搜索树查找时间复杂度为O(log_2N)。理想的搜索方法便是不经过任何比较,通过常数次的操作从表中得到搜索的元素。如果构造一种存储结构,如果某种函数使元素的存储位置与它存储的元素之间形成一种映射关系,那么在查找中可以通过该函数很快找到搜索元素。该方式称为哈希(散列)方法,哈希方法使用的转换函数称为哈希函数, 构造出来的数据结构称为哈希表。

2023-03-17 21:02:33 1384

原创 Linux —— 进程间通信

1.数据传输:一个进程需要将它的数据发送给另一个进程2.资源共享:多个进程之间共享同样的资源3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情(例如子进程退出时要通知父进程)4.进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时指导它的状态改变。

2023-03-16 23:14:04 732

原创 STL —— map、set模拟实现

map和set的使用通过查找相关文档即可熟悉。使用map解题使用map解题使用set解题使用map解题。

2023-03-15 20:02:00 394

原创 C++数据结构 —— 红黑树

enum Corlor //枚举颜色RED,BLACKtemplate //为了方便,使用K模型K _key;{}

2023-03-03 23:08:29 4478 1

原创 C++数据结构 —— AVL树

AVL树是map/set/multimap/multi/set等容器的一种底层结构,其本质就是一颗二叉搜索树。但因为二叉搜索树很容易退化成单支树,所以AVL树便是对二叉搜索树进行升级改造,使其平衡。向二叉搜索树插入节点,保证每个节点的左右子树高度差不超过1(可以包括1),如果确实达不到这种要求,就需要通过特定的算法来达到这样的要求。一颗AVL树可以是空树,也可以是具有以下性质的二叉搜索树1.每个节点的左右子树都是AVL树2.每个节点的左右子树的高度差不超过1(可以包括1)

2023-02-26 22:27:59 518

空空如也

空空如也

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

TA关注的人

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