Linux
文章平均质量分 94
主要讲解Linux
接受平凡 努力出众
执行力,就是生命力!
展开
-
【Linux篇】第十八篇——线程池
线程池是一种线程使用模式。线程过多会带来调度开销,进而影响整个进程的缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时线程创建和销毁线程的代价。线程池不仅能够保证内核充分利用多线程,还能防止过分调度。此外,可用线程数量应该取决于可用的并发处理器,处理器内核,内存,网络sockets等的数量。原创 2022-11-11 14:51:35 · 6129 阅读 · 1 评论 -
【Linux篇】第十七篇——信号量
(2)V(sv):我们将释放信号量称为V操作,释放信号量的本质就是归还临界资源中某块资源的使用权限,当释放成功时临界资源中资源的数目就应该加一,因此V操作本质就是让计数器加一,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给他加1。(1)P(sv):我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减去一,因此P操作的本质就是让计数器减一,如果sv的值大于零,就给它减1;原创 2022-11-06 14:19:26 · 10857 阅读 · 7 评论 -
【Linux篇】第十六篇——生产者消费者模型
生产者和消费者彼此之间不进行直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器中,消费者也不用找生产者要数据,而是直接从容器也就是阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。–》比如以超市为例:超市的货架就是我们这里的队列,一般超市的货物是不会有短缺的,因为通常假设进货了100个面包,店员一般会每天清点货物,每次他会在面包少于30个的时候就会通知厂家(生产者)进行补货,这样才会让超市的货物永远处于不断货的状态。原创 2022-11-05 20:50:20 · 5541 阅读 · 5 评论 -
【Linux篇】第十五篇——线程安全
因为该执行流第一次申请锁的时候是申请成功的,但第二次申请锁时因为该锁已经被申请过了,于是申请失败导致被挂起直到该锁被释放时才会被唤醒,但是这个锁本来就在自己手上,自己现在处于被挂起的状态根本没有机会释放锁,所以该执行流将永远不会被唤醒,此时该执行流也就处于一种死锁的状态。例如,现在有两个线程访问一块临界区,一个线程往临界区写数据,另一个线程从临界区读取数据,但负责数据写入线程的竞争力很强,该线程每次都能竞争到锁,那么此时该线程就一直在执行写入操作,直到临界区被写满,此后该线程就一直在进行申请锁和释放锁。原创 2022-10-24 09:07:58 · 4913 阅读 · 3 评论 -
【Linux篇】第十四篇——多线程(一)(线程概念+线程控制)
Linux下的线程线程的概念需要明确的是,一个进程的创建实际上伴随着其进程控制块(task_struct),进程地址空间(mm_struct)以及页表的创建,虚拟地址和物理地址就是通过页表建立映射的。每个进程都有自己独立的进程地址空间和独立的页表,也就意味着所有进程在运行时本身就具有独立性。但如果我们在创建"进程"时,只创建task_struct,并要求创建出来的task_struct和父task_struct共享进程地址空间和页表,那么创建出来的结果就是下面这样"原创 2022-10-05 16:34:36 · 6463 阅读 · 3 评论 -
【Linux篇】第十三篇——信号(概念+信号的产生+阻塞信号+捕捉信号)
而操作系统是软硬件资源的管理者,在程序运行过程中,若操作系统发现CPU内的某个状态标志位被置位,而这次置位就是因为出现了某种除0错误而导致的,那么此时操作系统就会马上识别到当前是哪个进程导致的该错误,并将所识别到的硬件错误包装成信号发送给目标进程,本质就是操作系统去直接找到这个进程的task_struct,并向该进程的位图中写入8信号,写入8号信号后这个进程就会在合适的时候被终止。查看这两个信号的默认处理动作,可以看到这两个信号的action是不一样的,2号信号是term,而三号信号是core.原创 2022-10-03 15:51:45 · 3582 阅读 · 9 评论 -
【Linux篇】第十二篇——进程间通信(管道+system V共享内存)
进程间通信介绍概念目的本质分类管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的大小命名管道命名管道的原理使用命令创建命名管道创建一个命名管道命令管道的打开规则 用命名管道实现serve&client通信用命名管道实现进程遥控用命名管道实现文件拷贝命名管道和匿名管道的区别命令行当中的管道system V进程间通信system V共享内存共享内存的基本原理共享内存数据结构共享内存的建立与释放共享内存的创建共享内存的释放共享内存的关联共享内存的去关联用共享内存实习ser原创 2022-09-30 20:09:47 · 5663 阅读 · 6 评论 -
【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
动静态库的基本原理动静态库的本质就是可执行程序的"半成品"。例如,用test1.c,test2.c以及main1.c形成可执行文件,需要先得到各个文件的目标文test1.o,test2.o以及main1.o,然后将这些目标文件链接起来,最终形成一个可执行程序。如果在另一个程序main2.c中也需要用到test1.c和test2.c,那么可执行程序生成和上面的步骤一样。原创 2022-09-25 19:15:24 · 6701 阅读 · 2 评论 -
【Linux篇】第十篇——基础IO(系统文件IO+文件描述符+重定向+文件系统+软硬链接)
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fputs函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程,一份子进程,所以重定向到log.txt文件当中printf和puts函数打印的数据就有两份。但0,1,2跑哪去了?原创 2022-09-24 13:53:55 · 1029 阅读 · 7 评论 -
【Linux篇】第九篇——Linux下的进程控制
进程创建进程创建的最常见的两种场景:1.命令行启动命令(程序,指令等)2.通过程序自身fork出来子进程fork函数fork在前面有讲过,关于fork的用法可以去前面看看。在这里接着往下讲:fork创建子进程是以父进程为模板的,很多数据代码继承父进程,它从存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。fork函数也是一个系统调用接口,为当前进程创建子进程,子进程返回0,父进程返回子进程pid,出错返回-1。运行结果返回值:子进程返回0,父进程返回子进程id,出错返回-1。原创 2022-08-19 14:51:19 · 829 阅读 · 10 评论 -
【Linux篇】第八篇——进程地址空间
如果没有进程地址空间,因为物理内存空余的地方不一定是连续的空间,可能是零散的,那么将可执行程序的数据加载到内存当中时,那么这些数据就是零散的放在各个位置,而这些位置我们又是不确定的,此时很难找到代码和数据的位置了,进程地址空间的存在,进程地址空间又是进行区域划分的,通过页表的映射关系可以很好的找到物理内存,所以这也是存在地址空间的一个理由:让每个进程,以同样的方式(虚拟地址),明确程序运行的地址。为什么父进程和子进程的数据不一样,这个我们不意外,因为数据是私有的,但是地址却也是相同的,这是什么原因呢?...原创 2022-08-10 12:52:43 · 456 阅读 · 7 评论 -
【Linux篇】第七篇——环境变量
基本概念查看环境变量方法。原创 2022-08-03 21:54:50 · 464 阅读 · 4 评论 -
【Linux篇】第六篇——Linux下的进程(冯若依曼体系结构+操作系统+进程相关内容)
例如有个进程,它定期的产生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就推出了,因此这个子进程的生命周期很短,但是父进程只管生成新的子进程,至于子进程退出之后的事,则一概不问,这样系统运行上一段时间,系统就会存在很多僵死进程。枪毙元凶进程后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放他们占用的系统进程表中的资源。这种状态是一种浅度睡眠,此时的进程是在被阻塞的状态中,等待着条件的满足过后进程才可以运行。...原创 2022-08-02 15:07:28 · 620 阅读 · 4 评论 -
【Linux】第五篇——Linux环境下的工具(三)(make/Makefile+进度条小程序)
所以现在就理解了,代码2中没有"\n",要打印的字符串一直保存在C语言级别的缓冲区,只有程序运行快结束才会把这些字符串刷新在屏幕上。第一行中冒号左边的mytest是目标文件,该目标文件依赖于冒号右边的test.c而产生,所以第一行写的是依赖关系,第二行一个tab键之后写上两个文件的依赖方法。可以发现代码2是先睡眠5s然后才进行打印,但事实上,睡眠5s这行代码是在打印后面的,为什么会有限睡眠5s这种现象呢?今天就到这里啦,如果对你有帮助的话,那就一赞三连吧,你的支持就是我持续更新的动力,爱你吆!...原创 2022-07-30 23:33:48 · 433 阅读 · 10 评论 -
【Linux】第四篇——Linux环境下的工具(二)(yum + vim + gcc/g++ +gdb)
编译器gcc/g++调试器ghb原创 2022-07-30 15:39:42 · 509 阅读 · 7 评论 -
【Linux】第三篇——Linux环境下的工具(一)(yum + vim + gcc/g++ +gdb)
Linux环境下的工具(一)(yum + vim + gcc/g++ +gdb)原创 2022-07-29 21:46:12 · 572 阅读 · 12 评论 -
【Linux】第二篇——权限管理
Linux下的用户Linux下有两种用户:超级用户(root),普通用户。超级用户:可以再linux系统下做任何事情,不受限制;命令提示符"#“; 普通用户:在linux下做有限的事情,普通用户的命令提示符是"$”如图所示:命令:su[用户名]功能:切换用户例如:要从root用户切换到普通用户user,则使用su user.要从普通用户user切换到root用户则使用su root(root可以省略),此时系统会提示输入root用户的口令.实例演示:..原创 2022-07-29 00:30:14 · 1266 阅读 · 19 评论 -
【Linux】第一篇——基本指令(图示详解)
接受平凡,努力出众,承认普通,但拒绝沉沦于平庸。大家好,我是你们的老朋友,小KK。 Linux下基本指令 ls指令语法:ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -d 将 ...原创 2022-05-15 00:01:43 · 1376 阅读 · 36 评论