Linux系统编程
文章平均质量分 86
该专栏是关于Linux系统编程学习的内容
Gay~
Those times you get up early you work hard,Those times you stay up late and you word hard,Those times when you don't feel like working,you too tired,you don't want to push yourself,but you do it anyway,That is actually the dream,That's the dream,it's not the destnation,it's the journey.
展开
-
Linux多线程:线程池(单例),读写锁
相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。如果感觉到有所帮助的话,那就点点小心心,点点关注呗,后期还会持续更新Linux系统编程的相关知识哦,我们下期见!若不等则失败,失败则重试,一般是一个自旋的过程,即不断重试。悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。注意:写独占,读共享,读写同时来的时候,读锁优先级高,但是读者后来的话,可以是在他前面的写者优先级高的。原创 2023-12-23 22:01:49 · 864 阅读 · 0 评论 -
Linux多线程:POSIX信号量,基于信号量的环形队列实现生产者消费者模型
以上就是基于信号量的环形队列实现的生产者消费者模型啦,你学会了吗?如果感觉到有所帮助的话,那就点点小心心,点点关注呗,后期还会持续更新Linux系统编程的相关知识哦,我们下期见!POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。上一个生产者-消费者的例子是基于queue的,其空间可以动态分配,现在基于固定大小的环形队列重写这个程序。但是我们现在有信号量这个计数器,就很简单的进行多线程间的同步过程。信号量的本质就是一把计数器。(POSIX信号量)。原创 2023-12-23 21:52:08 · 445 阅读 · 0 评论 -
基于阻塞队列下的生产者消费者模型(多线程)
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)2、支持并发(效率高)原创 2023-12-23 21:42:22 · 441 阅读 · 0 评论 -
Linux多线程
1、在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。2、一切进程至少都有一个执行线程。3、线程在进程内部运行,本质是在进程地址空间内运行。4、在Linux系统中,在CPU看来,看到的PCB都要比传统的进程更加轻量化。5、透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。原创 2023-12-23 21:33:52 · 808 阅读 · 0 评论 -
进程的信号
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 2编号34以上的是实时信号,本文不讨论实时信号。这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal上面所说的所有信号产生,最终都要有OS来进行执行,为什么?因为OS是进程的管理者。信号的处理是否是立即处理的?不一定,在合适的时候处理。信号如果不是被立即处理,那么信号是否需要暂时被进程记录下来?需要。原创 2023-12-01 14:51:33 · 962 阅读 · 1 评论 -
进程间通信(管道/消息队列/共享内存/信号量)
数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。原创 2023-11-22 14:32:18 · 970 阅读 · 0 评论 -
动态库和静态库
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。如:libc.so -> c库,去掉前缀lib,去掉后缀.so.a。原创 2023-11-13 13:48:10 · 117 阅读 · 0 评论 -
基础IO+文件系统(从软件到硬件再到软件)
pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写返回值:成功:新打开的文件描述符失败:-1。原创 2023-11-09 12:05:14 · 181 阅读 · 2 评论 -
Linux进程控制
(2)我们要通过进程等待,获取子进程的退出情况。就在子进程的PCB内核数据结构中保存着,所以在父进程wait等待子进程之前,子进程的PCB是需要一直维护着的,子进程的代码和数据那些可以先释放,但是PCB一定要等父进程wait/waitpid之后再释放,因为父进程需要知道子进程的退出信息。当我们收到退出信号,即退出信号不为0时,说明我们的进程是异常终止的,此时的退出信号对应着进程异常退出的原因,注意,进程异常退出时,因为代码都没有跑完,所以进程的退出码就没有意义了,只有在进程正常退出的时候退出码才有意义。原创 2023-10-31 01:13:03 · 108 阅读 · 0 评论 -
进程地址空间
(4)、bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!4、没关系的,因为在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!3、可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。我们发现,父子进程,输出地址是一致的,但是变量内容不一样!2、过期队列上放置的进程,都是时间片耗尽的进程。原创 2023-10-22 10:06:40 · 206 阅读 · 0 评论 -
Linux下的环境变量
原因正是在于PATH环境变量的作用,PATH是指令的搜索路径,当我们在输入指令运行的时候系统会自动根据PATH保存的路径逐一查找,找到指令对应的这个可执行程序就运行,如果PATH的所有路径都找不到你所输入的指令对应的可执行程序,那么就会提示该命令找不到。那么修改的应该是子进程本身的路径啊,为什么父进程bash的路径会被修改呢?我们所运行的进程都是bash的子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量的信息,子进程会继承父进程的环境变量,所以说环境变量是具有全局属性的。原创 2023-08-07 21:38:05 · 402 阅读 · 3 评论 -
进程及进程的相关属性
task_ struct内容分类:标示符: 描述本进程的唯一标示符,用来区别其他进程。状态: 任务状态,退出代码,退出信号等。优先级: 相对于其他进程的优先级。程序计数器: 程序中即将被执行的下一条指令的地址。内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。上下文数据: 进程执行时处理器的寄存器中的数据。I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等原创 2023-08-01 01:23:19 · 129 阅读 · 2 评论 -
冯诺依曼体系结构以及回答操作系统(是什么,为什么,怎么办)问题
计算机的各个硬件都是独立的个体,而计算机在工作的时候各个硬件之间一定要进行数据交互,所以各个单元必须用“线”连接起来,即在物理上是连通的,才能使各个硬件之间的数据进行交互,这个“线”分为系统总线和IO总线,连接CPU与存储器(内存)的线是系统总线,连接存储器(内存)与输入输出设备的线是IO总线。原创 2023-07-14 17:05:25 · 431 阅读 · 8 评论 -
Linux项目自动化构建工具-make/Makefile以及git三板斧
Linux项目的自动化构建工具-make/Makefile以及git三板斧的使用原创 2023-07-10 01:07:28 · 619 阅读 · 14 评论 -
Linux编译器-gcc/g++(动静态链接)
我们为什么能在windows或者linux下进行C/C++或者其它形式的开发呢?前提条件是我们的系统一定要安装上C/C++开发相关的头文件和库文件。所以我们平时下载安装的C/C++开发环境不仅仅指的是VS/gcc/g++,更重要的是语言本身的头文件和库文件。当我们在下载安装VS2019等软件,选择开发包的时候,也在同步下载语言的头文件和库文件。所以,编译型语言,在安装开发包时,必定是安装对应的头文件和库文件的。原创 2023-06-09 02:19:52 · 569 阅读 · 19 评论 -
Linux下的yum和vim
新人在做操作系统选型的时候需要如何选择呢?有以下特点的操作系统很让人青睐:1、系统有多种来源,并且是官方源。2、系统的版本非常成熟,稳定,是行业内公认的非常好的系统。3、有非常活跃的社区,很多问题都已经有解决方案。4、系统有非常成熟的丰富的文档。5、有良好的软件生态,各种软件都做得非常成熟。6、很多大公司也用的。原创 2023-05-28 15:09:37 · 1263 阅读 · 7 评论 -
Linux权限
目录的可执行权限是决定你能否进入该目录的因素。如果没有可执行权限(x),则无法对目录执行任何命令,甚至无法用cd进入这个目录,千万记得不是拥有可读权限就能进去这个目录的(很容易出错)。而如果目录具有x权限,但没有r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在该目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。原创 2023-05-21 14:36:41 · 1714 阅读 · 3 评论 -
Linux简介及Linux常用指令
Linux简介及常用指令Linux常用指令:原创 2023-05-15 23:07:19 · 148 阅读 · 11 评论 -
Linux指令2
less 工具也是对文件或其它输出进行分页显示的工具,是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻进行查看, 只能往后面看。但是使用 less 时,就可以使用 [pageup]和[pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜索,也可以向上搜索。原创 2023-05-14 00:19:41 · 394 阅读 · 8 评论 -
Linux操作系统指令(1)
Linux是一套免费使用和自由传播的类Unix操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统是一款做软硬件管理的软件。更重要的是Linux操作系统是开源的,免费的。而Linux操作系统的开源性就使得Linux操作系统又具有以下了几个特点:更稳定,更安全,更高效,当然了,免费才是重点。原创 2023-05-03 14:58:46 · 920 阅读 · 12 评论