Linux
文章平均质量分 78
Linux 操作系统 网络等
JayceSun449
这个作者很懒,什么都没留下…
展开
-
Linux多线程
如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。调用该函数的线程将挂起等待,直到id为thread的线程终止。返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时线程函数已经退出了。原创 2022-11-26 16:17:17 · 216 阅读 · 0 评论 -
生产者消费者模型
在多线程编程中阻塞队列是一种常用于实现生产者消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。原创 2022-11-26 15:52:08 · 603 阅读 · 0 评论 -
Linux信号
信号是进程之间事件异步通知的一种方式,属于软中断。SIGINT的默认处理动作是终止进程并且Core Dump首先解释一下什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-cortem Debug(事后调试)。一个进程允许产生多大的core取决于进程的Resource Limit(这个信息保原创 2022-11-17 20:38:49 · 320 阅读 · 0 评论 -
Linux多线程篇【5】——线程池
设计模式可以看作是一种经验,根据一些经典的场景,给定了一些特定的解决方案,这些解决方案就是设计模式。原创 2022-09-03 19:05:27 · 281 阅读 · 0 评论 -
Linux多进程篇【4】——POSIX信号量
既然说信号量可以看作是一个计数器,那么我们先来模拟看看信号量应该是怎样工作的。原创 2022-06-19 09:19:32 · 190 阅读 · 0 评论 -
Linux多线程篇【2】——互斥锁
在任意时刻只允许一个执行流访问某段代码就可以叫作互斥。在本篇将介绍互斥锁(mutex)让我们以抢票模型来开始互斥锁的学习,对于抢票这件事有两个原则,一是大家都会尽量抢更多的票,二是一旦票没了就不能再抢了。所以接下来以这段代码为例,看看这样的抢票方式会不会引起问题我创建了五个进程,分别让他们进行抢票,其中每次对tickets进行–就代表一次抢票的完成,当票数小于等于0时抢票应该结束,那么运行结果是什么呢?我们发现问题在于当票数小于0时仍有线程在进行抢票操作,这显然是不符合逻辑的,那么原因是什么呢?我原创 2022-06-12 18:13:39 · 521 阅读 · 0 评论 -
map&set的封装
map和set都是用红黑树来实现的,不同点在于map中存储了key和value而set中只存储了key值,但是总的来看他们的结构是非常类似的,因此我们可以像一个办法让红黑树代码可以同时被map和set使用。主要思路上一篇中我们给红黑树节点的模板是:template<class T>struct RBTreeNode我们仅用一个T类模板来存储数据,也就是说,我们在map中T代表的是pair<key, value>,而在set中代表的则是key值。存储方式很好处理,但是在插入原创 2022-05-30 15:24:35 · 76 阅读 · 1 评论 -
红黑树原理
目录红黑树红黑树的性质节点结构插入规则红黑树与上一篇文章说的AVL树类似,红黑树也是一种可以平衡高度的搜索树,不同点在于红黑树通过控制节点的颜色来调节搜索树的高度。红黑树的性质1.每个节点不是红色就是黑色2.根节点是黑色的3.不能有连续的红色节点4.对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。5.每个叶子节点都是黑色的(这里的叶子节点指的是空节点)当满足这些性质时,就可以保证红黑树中最长路径高度不超过最短路径的两倍。我们可以想象在红黑树中每条路径黑色节点原创 2022-05-30 14:51:38 · 173 阅读 · 1 评论 -
Linux进程间通信——信号量
信号量信号量也是一种进程间通信,他与管道,共享内存,消息队列不同,它们都是以传输数据为目的的,但信号量不是,他是通过共享资源,来达到多个进程的同步和互斥。信号量的本质是一个计数器,可以衡量临界资源中的资源数目我们来想象一个场景:我们想去看一场足球比赛,所以提前去买了球票,那么在我还没落座之前,这个位置是否是我的呢?当然是的,因为我已经提前预定了这个位置。我们可以把球场看成一个临界资源,而买票就是对临界资源的预定机制。而一个球场最不应该出现的情况是什么呢?卖的票比座位多,信号量就是为阻止过多执行流访问临原创 2022-05-17 11:59:25 · 139 阅读 · 0 评论 -
Linux进程间通信——共享内存
目录System V共享内存共享内存函数接口shmgetshmatshmdtSystem V共享内存System V 标准的进程间通信方式是在OS层面专门为进程间通信设计的一个方案,通过系统调用的方式给用户提供功能。在同一个主机内的进程间通信方案叫作system V方案。共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。共享内存函数接口shmget功能:用来创建共享内存int原创 2022-05-17 11:36:06 · 139 阅读 · 0 评论 -
Linux进程间通信——命名管道
目录mkfifo命名管道命名管道与匿名管道的区别命名管道实现进程间通信示例client.cserver.c如何让Makefile编译多个文件mkfifo现在先通过这段命令来创建一个FIFO文件mkfifo fifo接着我们会发现目录下出现了这个文件开始的"p"代表"fifo"是一个管道文件,接下来我们创建两个进程,一个向fifo写数据,另一个从fifo读数据命名管道进程间的通信根本就是要让不同的进程看到同一份资源,而匿名管道利用的是子进程继承父进程资源的特性,让他们看到同一份资源。那么原创 2022-05-10 12:23:23 · 886 阅读 · 0 评论 -
Linux进程间通信——匿名管道
目录通信介绍目的进程间通信发展进程间通信分类管道匿名管道匿名管道的特点匿名管道读写的4种情况通信介绍进程之间可能会存在特定的协同工作的场景,为此一个进程要把自己的数据交付给另一个进程,让其进行处理,而进程是具有独立性的,一个进程看不到另一个进程的资源,因此交互数据成本一定很高。为了完成进程间的通信,首先得先有一份各进程都能看到公共资源,而这里的资源指的就是内存,且它属于操作系统(因为当它属于操作系统时才能让各个进程都能看到),换言之进程间通信的前提本质是由OS参与,提供有一份所有进程能看到的公共资源(可原创 2022-05-10 10:56:16 · 737 阅读 · 0 评论 -
C++的内存管理方式
目录C语言中动态内存管理方式malloc/calloc/realloc/freeC++内存管理方式new/delete操作内置类型new和delete操作自定义类型operator new与operator delete函数C语言中动态内存管理方式malloc/calloc/realloc/freevoid Test1(){ int* p1 = (int*)malloc(sizeof(int) * 10); int* p2 = (int*)calloc(4, sizeof(int) * 10);原创 2022-04-28 10:54:37 · 239 阅读 · 0 评论 -
C++多态
概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。举个例子:当普通人去买票时,是全价购票,学生买票,是半价购票,军人买票则是优先买票。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象去调用同意函数,产生了不同行为。继承中构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的函数进行重写class Person{public: virtual void BuyTick原创 2022-04-23 13:12:25 · 608 阅读 · 0 评论 -
C++的IO流
C语言的输入与输出C语言中我们用到最频繁的输入输出方式就是scanf和printf。scanf从标准输入设备(键盘)读取数据,并将值存放在变量中,printf将指定的字符输出到标准输出设备(屏幕)。C语言借助了相应的缓冲区来进行输入与输出。对输入输出缓冲区的理解:可以屏蔽低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分,可以很容易写出可移植的程序。可以使用这部分的内容实现”行“读取的行为,对于计算机而言没有”行“这个概念,有了这部分,就可以定义”行“,然后解析原创 2022-04-18 14:31:01 · 198 阅读 · 1 评论 -
C++继承的使用
定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。...原创 2022-04-17 13:14:08 · 1754 阅读 · 1 评论