并发编程
文章平均质量分 96
以实战为主线,从浅到深逐步介绍并发编程的核心知识,在SMP架构系统下需要用到的并发性能相关的要点,不仅满足面试需求,而且让自己的技能提升到并发架构的层次。
韩楚风
多年服务端开发经验,目前在做数据库内核研发,希望和大家多交流数据库和产品研发方面的经验^.^
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【linux 多进程并发】0203 网络资源的多进程处理,子进程完全继承网络套接字,避免“惊群”问题
本节主要分享了网络套接字在父子进程中的继承的情况。可以通过验证发现,父启动监听后,此时创建子进程,在子进程中也继承了监听套接字,它也可以与客户端建立连接;而父进程中的监听套接字,也仍然可以与客户端建立连接。当然其它网络操作步骤也是一样的,在父子进程中相同的套接字都会收到相同的网络事件,但最终只有一个进行处理,这样就带来一个问题,其它不处理事件的套接字会被频繁唤醒。原创 2024-11-05 11:58:09 · 2884 阅读 · 202 评论 -
【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求
本文主要介绍了基于多进程架构的网络服务器的设计与实现,在多进程架构中每个客户端会有一个服务端的进程专门处理通信,增加了对客户端消息的响应效率,提升了并发处理能力。原创 2024-10-30 08:28:43 · 3322 阅读 · 194 评论 -
【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦
通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。本章节代码位于[gitcode](https://gitcode.com/toadb/hatchCode/overview), 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然原创 2024-10-22 18:47:14 · 3074 阅读 · 197 评论 -
【linux 多进程并发】0202 Linux进程fork之后父子进程间的文件操作有着相同的偏移记录,多进程操作文件的方法
好了,到这里,子进程是父进程的拷贝有了更加深入的理解,这里像编程语言中的深拷贝与浅拷贝的关系。而子进程其实是做了一些浅拷贝,引用的内核文件表项还是一份,这就会引起两个进程共同操作的问题。在这种情况下,每次操作需要加锁,同时要指定操作的位置和大小。原创 2024-10-17 10:24:21 · 2559 阅读 · 167 评论 -
【linux 多进程并发】0201 Linux进程fork内存空间,父子进程变量内存地址居然是一样的
在多任务并发编程中,使用多进程架构时,在使用fork创建的父子进程时,子进程得到与父进程相同的内存空间内容。进程的内存空间由虚拟地址描述,在使用时会映射到物理地址。原创 2024-10-11 07:39:21 · 2377 阅读 · 161 评论 -
【linux 多进程并发】0102 linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
本文介绍了linux平台下进程的基本状态,这些状态经过细化后对应进程生命周期中的各阶段;进程从创建启动之后,就处于一个有限状态机中,从就绪,运行,可中断阻塞,不可中断阻塞之间进行转换,直到进程的终止。原创 2024-09-29 15:02:07 · 6128 阅读 · 205 评论 -
【linux 多进程并发】0101 linux下使用常见命令,来解析进程家族体系脉络
本文介绍了Linux系统平台下进程的相关概念,在Linux下所有进程是有继承关系的,最初的1号和2号进程分别是用户进程和内核进程的祖先,通过 `ps`,`top`,`kill`三个常用的命令,就可以查看进程信息,资源占用情况,以及结束进程。原创 2024-09-27 11:29:10 · 2346 阅读 · 113 评论 -
【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-11 08:22:28 · 5508 阅读 · 133 评论 -
【linux 多线程并发】多线程的控制,挂起线程暂停运行,直到唤醒线程,取消线程运行,可以设置合适的取消点属性避免不安全点被中止
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-18 15:00:00 · 6074 阅读 · 83 评论 -
【linux 多线程并发】线程退出自动清理函数的使用,释放线程申请的资源,异常退出自动调用
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-11 05:00:00 · 8481 阅读 · 141 评论 -
【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-09 01:00:00 · 7262 阅读 · 115 评论 -
【linux 多线程并发】多任务调度器,调度策略时间片轮转,先进先出,多种实时任务的策略,内核级最高优先级调度策略
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-04 00:45:00 · 7397 阅读 · 154 评论 -
【linux 多线程并发】线程属性设置与查看,绑定CPU,线程分离与可连接,避够多线程下的内存泄漏
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2024-01-01 10:44:31 · 7098 阅读 · 116 评论 -
【linux c多线程】线程的创建,线程信息的获取,获取线程返回值
现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。原创 2023-12-26 00:15:00 · 8553 阅读 · 147 评论 -
linux barrier 栅栏屏障,让多任务在栅栏处集合,全部到齐后同时出发
pthread_barrier_t 这是posix定义线程同步方法,不一定所有linux 版本中都实现了它。barrier 是一种非常有效的线程同步方法,当我们需要几个线程一起开始时,或者在某个条件下需要一起等待时,就需要有个类似栅栏一样的东西,条件成立时,就会被拦住。当然这个功能,也可能通过管道,信号量,eventfd等方法实现,但是barrier非常简单高效。原创 2023-07-26 08:28:56 · 6337 阅读 · 75 评论 -
linux 信号原理 信号处理设置signal, 信号发送kill,信号等待sigsuspend,信号阻塞sigprocmask,一网打尽信号使用
信号是一种软中断的方式,让进程陷入中断处理调用中;linux 下信号也是一种进程间通信的手段;进程间也可以互相发送信号,来传递状态,让对方获知,并处理一些事情。原创 2023-07-10 08:00:00 · 7105 阅读 · 58 评论 -
linux 文件锁flock与fcntl bytes级别精细控制不再是困难
前面博客介绍了多任务下互斥的方法,如信号量,互斥锁,管道,事件通知等等,这些可以对内存或者关键资源进行同步处理。但是对于文件,有没有单独的方法呢?本文就来介绍文件锁,来避够文件的多任务下的写覆盖,脏读等问题。一般的互斥方法,如互斥锁,一个任务加锁后,另一个任务如果不调用加锁接口 flock fcntl ,直接访问共享资源,那么这就破坏了使用规则。建议模式的文件锁效果也是类似,任何任务里面,需要调用加锁/解锁函数,才能达到互斥访问的保护,直接访问文件就会破坏规则。这就是建议锁模式,基于大家的遵章守法基础上。原创 2023-06-30 13:10:47 · 5592 阅读 · 20 评论 -
linux eventfd事件通知 比信号量更好用
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。eventfd 就是一个用于事件通知的fd。当然linux中,一切都可以做为文件来看待,所以就有fd。这样有一个好处管理统一,比如可以加入到epoll事件等待中。很多人可能没怎么用,但是用过的人都说:香!eventfd 提供了一个进程/线程间通信的方式。这个方式是载体是一个句柄,也就是fd,类型是eventfd,可以在/proc下查看fd时看到;原创 2023-06-13 08:33:42 · 7137 阅读 · 22 评论 -
linux 条件变量 pthread_cond_signal
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。条件变量,根据某个条件进行触发pthread_cond_signal/pthread_cond_broadcas,条件达不到时就等待,而不用我们不断检测。原创 2023-05-28 22:15:00 · 9785 阅读 · 5 评论 -
linux 读写锁 pthread_rwlock
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。与前面介绍的互斥量,信号量类似,用于多线程/进程间同步控制,但与它们的不同之处在于,读写锁pthread_rwlock_t可以区分读加锁pthread_rwlock_rdlock和写加锁,也就是说一把锁有两种不同的加锁方式,那么对于两种加锁方式下的并发控制也是不同。这个不同点,也就是读写锁的精妙的所在。当然定义了还不能用,此时状态未知,必须初始化后才能用。原创 2023-05-21 22:00:00 · 6441 阅读 · 3 评论 -
linux 互斥量pthread_mutex
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。本文主要介绍并发编程中的互斥量,linux中提供了一系列pthread_mutex打头的接口完成互斥量的功能。它不同于信号量,在并发编程中应用非常广泛。原创 2023-05-07 22:15:00 · 5684 阅读 · 0 评论 -
linux 信号量semget/semop/semctl
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。信号量semget/semop/semctl提供了多任务间的同步机制,生产者产生后,消费者才能消费,避免消费者提前消费的问题。原创 2023-04-23 22:00:00 · 6056 阅读 · 0 评论 -
linux 匿名文件 memfd_create
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。本专栏已经分享共享内存,文件映射,匿名/命名管道,消息队列等四种进程间通信的方式,本文来介绍第五种方式memfd_create,而且非常特别,且看本文分解。原创 2023-04-16 20:43:22 · 6850 阅读 · 0 评论 -
linux 消息队列 msgget/msgsnd/msgrecv
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。进程间传递数据,在本专栏已经分享过共享内存,匿名/命名管道,文件映射等,今天给大家再分享一种msgget/msgsnd/msgrecv可以通过消息包方式传递,类似于socket的方式,使用更加便捷。原创 2023-04-16 20:29:57 · 5841 阅读 · 0 评论 -
linux 匿名管道 pipe
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。概述管道是在进程间进行通信的一种方式。在不同进程和程序间如何传递少量数据,且能阻塞形式使用,这就用到了管道。管道分为两种,无名管道pipe和命名管道mkfifo,因为子进程可以复制父进程的进程上下文,所以无名管道用在父子进程间,而命名管道在不同进程间通过路径名进行共享,更加通用。原理介绍基本原理无名管道是一种在内存中创建的管道,只能在相关进程间使用。原创 2023-04-09 20:53:34 · 5524 阅读 · 1 评论 -
linux 命名管道 mkfifo
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。在不同进程和程序间如何传递少量数据,且能阻塞形式使用,这就用到了管道。管道分为两种,无名管道和命名管道,因为子进程可以复制父进程的进程上下文,所以无名管道用在父子进程间,而命名管道mkfifo在不同进程间通过路径名进行共享,更加通用。命名管道是一种在进程间进行通信的机制,它可以用于在两个进程间进行数据传输。原创 2023-04-08 22:15:45 · 5387 阅读 · 0 评论 -
linux 共享内存 shmget
本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。共享内存是进程间通信的一种常用手段,相较于其它通信方法,它可以在进程间传递大量的不同格式的数据,同时这些数据不需要持久保存在磁盘上。原创 2023-04-04 08:22:16 · 2469 阅读 · 1 评论 -
linux 进程创建的五种方法fork/vfork/execv/clone
本专栏介绍:以实战为主线,从浅到深逐步介绍并发编程的核心知识,在SMP架构系统下需要用到的并发性能相关的要点,不仅满足面试需求,而且让自己的技能提升到并发架构的层次。在linux中每个进程都有一个编号号PID,它的父进程的编号为PPID。当我们用ps -ef查看时,就可以看到每个进程的PID和PPID。我们发现,Linux下最原始的PID为0,由它产生了两个PID分别1,2的子进程,后面的进程的PPID都为1或2。进程创建方式fork,execv,vfork,clone,后台进程介绍和编码例子。原创 2023-03-28 13:15:47 · 3585 阅读 · 1 评论
分享