
操作系统
文章平均质量分 77
操作系统
JayceSun449
这个作者很懒,什么都没留下…
展开
-
Linux多线程
如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。调用该函数的线程将挂起等待,直到id为thread的线程终止。返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时线程函数已经退出了。原创 2022-11-26 16:17:17 · 299 阅读 · 0 评论 -
线程池介绍(普通与单例版本)
线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能保证内核的充分利用。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。某些类,之应该具有一个对象(实例),就称之为单例。在很多服务器开发场景中,经常需要让服务器加载很多的数据到内存中,此时往往要用一个单例的类来管理这些数据。懒汉方式的核心思想是“延时加载”,从而优化服务器的启动速度。原创 2022-11-26 15:47:55 · 170 阅读 · 1 评论 -
Linux信号
信号是进程之间事件异步通知的一种方式,属于软中断。SIGINT的默认处理动作是终止进程并且Core Dump首先解释一下什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-cortem Debug(事后调试)。一个进程允许产生多大的core取决于进程的Resource Limit(这个信息保原创 2022-11-17 20:38:49 · 373 阅读 · 0 评论 -
Linux进程间通信——匿名管道
目录通信介绍目的进程间通信发展进程间通信分类管道匿名管道匿名管道的特点匿名管道读写的4种情况通信介绍进程之间可能会存在特定的协同工作的场景,为此一个进程要把自己的数据交付给另一个进程,让其进行处理,而进程是具有独立性的,一个进程看不到另一个进程的资源,因此交互数据成本一定很高。为了完成进程间的通信,首先得先有一份各进程都能看到公共资源,而这里的资源指的就是内存,且它属于操作系统(因为当它属于操作系统时才能让各个进程都能看到),换言之进程间通信的前提本质是由OS参与,提供有一份所有进程能看到的公共资源(可原创 2022-05-10 10:56:16 · 839 阅读 · 0 评论 -
Linux多线程篇【2】——互斥锁
在任意时刻只允许一个执行流访问某段代码就可以叫作互斥。在本篇将介绍互斥锁(mutex)让我们以抢票模型来开始互斥锁的学习,对于抢票这件事有两个原则,一是大家都会尽量抢更多的票,二是一旦票没了就不能再抢了。所以接下来以这段代码为例,看看这样的抢票方式会不会引起问题我创建了五个进程,分别让他们进行抢票,其中每次对tickets进行–就代表一次抢票的完成,当票数小于等于0时抢票应该结束,那么运行结果是什么呢?我们发现问题在于当票数小于0时仍有线程在进行抢票操作,这显然是不符合逻辑的,那么原因是什么呢?我原创 2022-06-12 18:13:39 · 590 阅读 · 0 评论 -
Linux进程间通信——命名管道
目录mkfifo命名管道命名管道与匿名管道的区别命名管道实现进程间通信示例client.cserver.c如何让Makefile编译多个文件mkfifo现在先通过这段命令来创建一个FIFO文件mkfifo fifo接着我们会发现目录下出现了这个文件开始的"p"代表"fifo"是一个管道文件,接下来我们创建两个进程,一个向fifo写数据,另一个从fifo读数据命名管道进程间的通信根本就是要让不同的进程看到同一份资源,而匿名管道利用的是子进程继承父进程资源的特性,让他们看到同一份资源。那么原创 2022-05-10 12:23:23 · 997 阅读 · 0 评论 -
Linux多线程篇【1】——线程控制
我们一般将一个进程内的所有线程称为一个线程组,而组id就是pid即进程id线程的优点1.创建一个新线程的代价比创建一个进程小得多2.与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多3.线程占用的资源更少4.计算密集型应用为了能在多处理器系统上运行,将计算分解到多个线程中实现()5.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。计算密集型:加密,大数据运算等,主要使用的CPU资源I/O密集型:网络下载,云盘,ssh,在线直播等,主要使用内存原创 2022-06-07 16:01:11 · 401 阅读 · 0 评论 -
进程终止与等待
进程的退出场景有三个1.代码运行完毕,结果正确2.代码运行完毕,结果不正确3.代码异常终止(程序崩溃)问题:main函数为什么要return 0?main函数的返回值是进程的退出码,退出码传给其父进程。echo $? // 输出最近一次进程退出时对应的进程码退出码的意义是可以帮助我们判断程序运行完时结果是正确还是错误,一般0代表结果正确,!0代表结果错误,而程序崩溃后退出码会变得没有意义。1.main函数return代表程序退出,非main函数叫函数返回2.可以使用exit(int v原创 2022-03-26 08:00:00 · 475 阅读 · 6 评论 -
Linux多进程篇【4】——POSIX信号量
既然说信号量可以看作是一个计数器,那么我们先来模拟看看信号量应该是怎样工作的。原创 2022-06-19 09:19:32 · 254 阅读 · 0 评论 -
Linux多进程篇【3】——同步
在使用互斥时我们会发现一个问题,如果一个线程频繁地使用互斥锁来占用临界资源,会严重影响别的线程的效率,而同步就是在保证数据安全的情况下让多线程的执行具有一定的顺序性,以此提高运行效率。创建条件变量跟创建互斥锁类似,在全局定义一个pthread_cond_t类型的变量即可。静态初始化销毁等待条件满足唤醒等待案例在这个例子共创建了两类进程,第一类是一个控制进程(master),第二类是三个工作进程(worker),master每秒释放一次一个信号让其中一个worker工作从运行情况中我原创 2022-06-14 20:41:35 · 548 阅读 · 0 评论 -
Linux进程间通信——信号量
信号量信号量也是一种进程间通信,他与管道,共享内存,消息队列不同,它们都是以传输数据为目的的,但信号量不是,他是通过共享资源,来达到多个进程的同步和互斥。信号量的本质是一个计数器,可以衡量临界资源中的资源数目我们来想象一个场景:我们想去看一场足球比赛,所以提前去买了球票,那么在我还没落座之前,这个位置是否是我的呢?当然是的,因为我已经提前预定了这个位置。我们可以把球场看成一个临界资源,而买票就是对临界资源的预定机制。而一个球场最不应该出现的情况是什么呢?卖的票比座位多,信号量就是为阻止过多执行流访问临原创 2022-05-17 11:59:25 · 198 阅读 · 0 评论 -
Linux进程间通信——共享内存
目录System V共享内存共享内存函数接口shmgetshmatshmdtSystem V共享内存System V 标准的进程间通信方式是在OS层面专门为进程间通信设计的一个方案,通过系统调用的方式给用户提供功能。在同一个主机内的进程间通信方案叫作system V方案。共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。共享内存函数接口shmget功能:用来创建共享内存int原创 2022-05-17 11:36:06 · 209 阅读 · 0 评论