Linux系统编程
文章平均质量分 84
黑马程序员和C++教程网相关系列课程进行总结和理解的记录,为此所写。
KuoGavin
这个作者很懒,什么都没留下…
展开
-
多线程顺序打印输出数据
同花顺技术面手撕代码题,考察线程同步的实现。题目:有三个线程,编号分别为①②③,其中①线程打印1,4,7,10,…;②线程打印2,5,8,11,…;③线程打印3,6,9,12,…;如何编程,使得在STDOUT中的输出是顺序的,即输出是1,2,3,4,5,6,7,8,9,…,100题解:#include <iostream>#include <thread>#include <mutex>#include <condition_variab原创 2021-07-13 15:33:59 · 272 阅读 · 0 评论 -
CAS无锁队列的实现
1. 基本原理源于1994年10月发表在国际并行与分布式会议上的论文【无锁队列的实现.pdf】。CAS(Compare And Swap,CAS维基百科)指令。CAS的实现可参考下面的代码:bool CAS(int* pAddr, int nExpected, int nNew) atomically { if(*pAddr == nExpected) { *pAddr = nNew; return true; } else return false;}//CAS返回bool告知原子性交原创 2021-09-02 16:20:28 · 1042 阅读 · 1 评论 -
Linux五种IO模型
为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。相关内容也可见:Linux系统中的I/O同步和异步 这两个概念与消息的通知机制有关。 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。 异步 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系转载 2021-08-01 20:18:32 · 172 阅读 · 0 评论 -
Linux系统中的I/O
文章目录1. I/O是什么2. 阻塞(Block)和非阻塞(Non-Block)I/O:均是同步I/O2.1 阻塞I/O:得到请求就等待处理2.2 非阻塞I/O:多次请求2.3 区别3. 同步(Synchronous)和异步(Asynchronous)I/O3.1 同步I/O:阻塞(等待完成)和非阻塞(问询完成)都是同步I/O3.2 异步I/O:I/O发起则不需向内核确认I/O内容准备好3.3 区别4. 总结及归纳1. I/O是什么I/O:在计算机中指Input/Output,就是输入和输出。由于程原创 2021-07-23 16:49:06 · 501 阅读 · 1 评论 -
一个简单线程池的实现
文章目录线程池使用场景简单线程池的目标线程池实现threadpoll.hcondition.hthreadpoll.ccondition.cmain.c线程池使用场景线程池拥有若干个线程,用于执行大量的相对短暂的任务:计算密集型任务:线程个数=CPU个数,占用CPU的任务,特点是很少被外部中断。线程个数远多于CPU个数并不合适,因为CPU个数一定,即并发数一定,那么是较少的CPU调度多个线程,造成线程的上下文切换开销较大,所以会降低效率;I/O密集型任务:线程个数>CPU个数;简原创 2021-07-14 15:50:12 · 119 阅读 · 0 评论 -
POSIX条件变量
文章目录1. 条件变量的使用情形2. 条件变量函数3. 条件变量使用规范4. 生产者消费者模型条件变量实现5. 对条件变量函数的分析5.1 pthread_cond_wait的实际含义5.1 pthread_cond_signal的实际含义:5.3 pthread_cond_broadcast的实际含义:1. 条件变量的使用情形当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了;例如一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中,这原创 2021-07-14 11:08:54 · 193 阅读 · 0 评论 -
POSIX信号量、互斥锁、自旋锁、读写锁
文章目录1. 信号量和互斥锁2. 自旋锁3. 读写锁1. 信号量和互斥锁信号量 sem_t(使用sem_init()或是sem_open()),互斥锁 pthread_mutex(创建使用pthread_mutex_init())。以生产者和消费者问题的实现来对POSIX信号量和互斥锁进行掌握,大体的程序思路如下。两个信号量(sem_full,sem_empty)和一个互斥量(sem_mutex):sem_full 表示缓冲区是否已满,对于生产者进行生产前需先P(sem_full),对于消费原创 2021-07-13 22:25:43 · 391 阅读 · 1 评论 -
POSIX线程库:pthreads
文章目录 1. pthread_create 函数2. pthread_exit / pthread_self 函数3. pthread_join / pthread_cancel 函数4. 进程库和线程库的函数比较5. 线程属性、线程模型、线程调度竞争范围6. 线程特定数据(TSD)与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"打头的;要使用这些函数库,要通过引入头文件<pthread.h>;链接这些线程函数库时要使用编译器命令的"-lpthrea原创 2021-07-13 19:50:17 · 400 阅读 · 0 评论 -
POSIX的IPC方式:消息队列、共享内存
文章目录1. POSIX 消息队列mq_open 函数mq_close/mq_unlink 函数mq_getattr/mq_setattr 函数mq_send/mq_receive 函数mq_notify 函数2. POSIX 共享内存shm_open/ftruncate 函数fstat/shm_unlink/mmap 函数POSIX IPC名字限定:必须以/打头,并且后续不能有其它/,形如/somename;长度不能超过NAME_MAX;1. POSIX 消息队列#include <原创 2021-07-13 11:47:07 · 280 阅读 · 1 评论 -
SystemV的IPC方式:消息队列
消息队列概述- 消息队列提供了一个从一个进程到另外一个进程发送一块数据的方法;- 每个数据块都被认为是有一个类型,接受者进程接受的数据块可以有不同的类型值;- 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数也是有上限的(MSGMNB),系统上消息队列的总数也有个上限(MSGMNI),以上限制/上限可以使用如下指令进行查看:`cat /proc/sys/kernel/msg/msgmax (/msgmnb原创 2021-07-10 17:36:36 · 807 阅读 · 1 评论 -
进程间通信、死锁、信号量、PV原语
文章目录进程间通信(Inter-Process Communication, IPC)顺序程序与并发程序的特征进程互斥、临界资源、临界区同步的细分进程间通信目的进程间通信发展进程间通信分类进程间共享信息的三种方式死锁及死锁产生条件哲学家就餐问题信号量(Semaphore)及PV原语信号量信号量值含义信号量实现的数据结构P原语和V原语PV原语解决实际问题进程间通信(Inter-Process Communication, IPC)顺序程序与并发程序的特征顺序程序:顺序性;封闭性(运行环境的封闭性);原创 2021-07-10 10:09:14 · 826 阅读 · 0 评论 -
close_on_exec选项:FD_CLOEXEC(fcntl)、O_CLOEXEC(open) 和 EPOLL_CLOEXEC(epoll_createl)
close_on_exec解决的问题类型:我们经常会碰到一个进程需要fork出子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到如何妥善处理好子进程中无用文件描述符的问题。fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。接着,一般子进程会调用exec转载 2021-07-09 12:00:34 · 892 阅读 · 0 评论 -
可重入函数和非可重入函数
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程/函数,任务在调用时不必担心数据是否会出错。一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度/陷入内核态转载 2021-07-08 20:00:05 · 151 阅读 · 0 评论 -
wait()函数和waitpid()函数详解
文章目录wait()函数waitpid()函数wait() 和 waitpid() 用法和比较wait()函数#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status); 进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wa原创 2021-07-08 19:45:41 · 4742 阅读 · 1 评论 -
Linux中的文件描述符
文件描述符文件描述符已经不陌生了,在一个进程中一个打开的文件就是用一个文件描述符所表征的,可以看作是一个句柄,就是所谓的遥控器。但是这个遥控器到底怎么来控制具体的文件呢?接下来会依此讲解文件描述符背后的在UNIX环境下实现相关的数据结构。 UNIX环境下的文件共享 文件描述符用来表征一个文件,在进程PCB中有着这么一个部分,IO状态信息,说的再具体点,在PCB中存在着一张表,我们可以叫它文件描述符表,也可以叫做打开文件描述符表,这张表每个进程都会有且为进程独有,所以它是进程级的。这张表上的每一个表项原创 2021-06-28 11:12:26 · 224 阅读 · 1 评论 -
mmap()共享内存详解
文章目录(一)管道与共享存储映射对比管道共享存储映射(存储I/O映射)(二)mmap函数使用普通文件进行存储映射匿名内存映射(三)mmap文件大小和映射空间大小文件大小等于映射区大小的情况文件大小远小于映射区大小的情况(四)父子进程存储内存映射的地址分布mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完原创 2021-06-27 00:24:26 · 5317 阅读 · 1 评论 -
进程、线程、协程的区别和联系
文章目录(一)进程(二)线程(三)进程和线程直接的区别和联系(四)进程/线程之间的亲缘性(五)进程池与线程池(六)协程(一)进程进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。 进程虚拟内存空间 进程状态转换图 虚拟内存空间相关知识见:虚拟内存(Virtu原创 2021-06-26 10:29:12 · 354 阅读 · 0 评论 -
Linux下EAGAIN宏的含义
在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。在man手册关于read的解释如下:RETURN VALUE On success, the number of bytes read is returned(zero indicates end of file), and the file position is advanced by this number. It is not an error if thi原创 2021-06-25 19:53:49 · 5817 阅读 · 0 评论 -
makefile简略教程
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。以下是makefile的简要用法:1个规则目标 : 依赖条件(一个tab缩进)命令1. 目标的时间必须晚于依原创 2021-06-08 20:25:15 · 246 阅读 · 1 评论 -
gdb调试工具
在进行程序调试时,要遵循“分析现象->假设错误原因->产生新的现象去验证假设”的循环。进行gdb调试的前提是,程序是自己所写,同时在对程序进行编译时,要使用 −g-g−g 选项(gcc简介及使用可见:gcc简介和命令行参数说明),例如:gcc -g main.c -o main。若是对main使用gdb进行调试,则在shell中输入gdb main即可。(所生成的文件较不添加 −g-g−g 的,多生成了调试表,可见文件大小比不添加的大。若是未添加且想使用 gdb 进行调试,则可打开后在 g原创 2021-06-08 11:01:07 · 259 阅读 · 0 评论 -
gcc简介和命令行参数说明
文章目录(一) gcc基本用法(二) 警告提示功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项更多的相关资料见:GCC常用参数详解(一) gcc基本用法使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。 如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。因为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数原创 2021-05-12 14:01:15 · 4540 阅读 · 5 评论 -
Linux动态库(.so)、静态库(.a)的制作和使用
静态库制作及使用步骤:①将 .c 文件生成 .o 文件:gcc -c add.c -o add.o;②使用 ar 工具制作静态库:ar rcs lib库名.a add.o sub.o div.o;③编译静态库到可执行文件中:gcc test.c lib库名.a -o a.out;(参数顺序先源文件再库文件)头文件守卫:防止头文件被重复包含#ifdef _HEAD_H_#define _HEAD_H_......#endif可见:防止头文件重复包含:#ifndef 和 #prama o原创 2021-06-07 21:03:40 · 364 阅读 · 0 评论 -
Linux相关复习
类Unix系统目录Linux当中所见皆文件;/bin:存放二进制可执行文件;/boot:存放开机启动程序;/dev:存放设备文件(字符设备、块设备等…);/home:存放用户的文件;/etc:用户信息和系统配置文件;/lib:库文件(libc.so.6);/root:管理员宿主目录(root的家目录);/usr:用户资源管理目录;Linux系统文件类型普通文件:-;目录文件:d;字符设备文件:c;块设备文件:b;软连接:l;管道文件:p;套接字:s;未知文件;其中,软原创 2021-06-07 10:56:54 · 1323 阅读 · 6 评论