
Linux
文章平均质量分 73
瓴翎玲
一点一滴积累,一步一步向前
展开
-
线程池处理任务
一、线程池1.概念 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利 用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。2.模拟实现ThreadPool.hpp#pragma once#include<iostream>#include<queue原创 2022-05-29 16:48:19 · 310 阅读 · 0 评论 -
Linux线程同步
一、线程同步同步:保证数据安全的条件下,让多执行流访问资源具有一定的顺序性,从而高效地使用临界资源1.条件变量定义:当一个线程互斥访问某个变量时,它可能发现在其它线程改变状态之前,什么也做不了pthread_cond_t条件变量用来描述某种临界资源是否就绪的一种数据化描述2.二、生产者消费者模型1.模型生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消原创 2022-05-27 23:05:08 · 198 阅读 · 0 评论 -
进程间通信——管道
一、进程间通信目的1.数据传输:一个进程需要将它的数据发送给另一个进程2.资源共享:多个进程之间共享同样的资源3.通知事件:一个进程需要向拎另一个或一组进程发送消息,通知它发生了某种事件(如:进程终止时要通知父进程)4.进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。如何做到进程间的通信?1.进程之间的通信具有独立性(数据层面)2.进程间通信,一半一定要借助第三方(OS)资源3.通信的本质:“数据的拷贝” ,进程原创 2022-05-23 14:30:41 · 1918 阅读 · 0 评论 -
进程的控制
1.为什么要给子进程返回0,给父进程返回子进程的pid父子进程立场:父进程不需要标识,子进程需要标识;子进程是要执行程序的,父进程需要区分子进程,子进程不需要fork只是代码的集合如何理解fork有两个返回值的问题?为何要写实拷贝:①进程具有独立性②不在创建时分开:子进程不一定会使用父进程的所有数据,写入的本质是:需要的时候,按需分配延时分配:本质是可以高效可以使用任何内存空间代码会不会写时拷贝:90%不会,只读的不会fork常规用法:①父进程复制自己,使父子进程同时执行不同的代码②一原创 2022-05-02 22:14:36 · 220 阅读 · 0 评论 -
Linux线程互斥
一、相关概念1.临界资源:多线程执行流共享的资源临界区:每个线程内部,访问临界资源的代码互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完二、互斥1.抢票例子变量–:不是原子操作(一搬是三个步骤,存入,–,输出读取)互斥量:本质上是一把锁,(1)代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。(2)如果多个线程同时要求执行临界区的代码,并且临界区没有原创 2022-02-16 09:41:50 · 407 阅读 · 0 评论 -
多线程的创建、等待、终止与分离
一、创建一个新的线程头文件:<pthread.h>函数:pthread_create()makefile文件:mythread文件:结果:执行新的线程,主进程仍然继续运行看是否属于一个进程,分别打印出线程与进程的id号,线程与进程的id号是一致的ps -aL | head -1 && ps -aL | grep mythread(显示两个线程的PID一样)-L:显示当前的轻量级进程LWP:轻量级进程ID调用自己线程的ID:pthread _self(),和g原创 2022-02-16 09:25:21 · 532 阅读 · 0 评论 -
线程基本概念
一、线程概念1.定义进程:承担分配系统资源的基本单位(1)线程在进程内部运行→线程在进程地址空间内运行(2)站在CPU的角度,能否识别task_stryct是进程还是线程?识别不了,也不需要,CPU只关心一个一个的执行流(3)该如何理解之前的进程?进程:内核角度,承担分配系统资源的基本单位进程:该进程内部只有一个执行流;线程:该内部有多个执行流;(4)Linux下,并不存在真正的多线程,提供创建轻量级进程的接口,创建进程,共享空间(vgork():父子共享空间)普通OS:如果支持真的线原创 2022-01-21 09:16:41 · 598 阅读 · 0 评论 -
处理信号的过程(重要)
一、处理信号:合适的时候:由内核态切换为用户态的时候用户态:执行自己的代码,系统所处的状态内核态:自己的代码中,可能包含了系统调用,本质是内核的代码内核态:通常用来执行OS代码,是一种权限非常高的状态用户态:是一种用来执行普通用户代码的状态,是一种受监管的普通状态二、状态切换用户态切换成内核态:(1)系统调用;(2)时间片到了,导致进程切换;(3)异常,中断,陷进内核态切换成用户态:(1)系统调用返回;(2)进程切换完毕;(3)异常,中断,陷阱处理完毕三、访问识别到信号可以被原创 2022-01-15 16:33:57 · 1824 阅读 · 0 评论 -
保存信号过程
1、每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。2、SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。虽然它的处理动作是忽略,但在没有解除阻塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞。3、SIGQUIT信号未产生过,一旦产生SIGQUIT信号将被阻塞,它的处理.原创 2022-01-15 16:33:43 · 310 阅读 · 0 评论 -
产生信号的方式
一.信号,需要识别,知道此类信号的作用(产生前)1.信号产生的种类2.信号产生的时候,和人的生活之间的运行关系是怎样的?异步关系二、(产生中)当信号产生的时候,不一定立马处理信号,可能正在做优先级更高的事情(在合适的时候处理,信号已经产生,没有被处理(时间窗口),有某种方式记下此信号的产生)三、准备处理信号(产生后)信号的捕捉动作:1.默认行为2.自定义行为()3.忽略信号(非常规)人对应进程:1.进程虽然现在没有收到信号,但是进程知道收到信号后该怎么做进程内部一定能够识别信号,程原创 2022-01-15 16:32:55 · 559 阅读 · 0 评论 -
信号的概述
一.信号,需要识别,知道此类信号的作用(产生前)1.信号产生的种类2.信号产生的时候,和人的生活之间的运行关系是怎样的?异步关系二、(产生中)当信号产生的时候,不一定立马处理信号,可能正在做优先级更高的事情(在合适的时候处理,信号已经产生,没有被处理(时间窗口),有某种方式记下此信号的产生)三、准备处理信号(产生后)信号的捕捉动作:1.默认行为2.自定义行为()3.忽略信号(非常规)四、人对应进程:1.进程虽然现在没有收到信号,但是进程知道收到信号后该怎么做进程内部一定能够识别信号原创 2022-01-15 16:31:12 · 125 阅读 · 0 评论 -
进程间通信——共享内存
4.system V进程间通信:OS特地设计的方式(1)共享内存:以传送数据为目的物理地址映射到进程的地址空间中(映射本质:修改页表,虚拟地址空间中开辟空间,用的是系统接口,完成开辟空间,建立映射,开辟虚拟地址,返回给用户都是OS操作)共享内存建立的过程:开始通道:1.申请共享内存(物理内存已经开辟完成);shmget函数2.将共享内存挂接到地址空间(挂接:建立映射关系)释放资源的过程:3.用完后,去关联共享内存(修改页表,取消映射关系)4.释放共享内存如何保证共享内存是唯一的?如何原创 2021-12-29 21:27:40 · 485 阅读 · 0 评论 -
Linux——基础IO
当前路径:当前进程运行时所处的路径任何进程在运行的时候,默认打开三个输入输出流:stdin:键盘 标准输入stdout:显示器 标准输出stderr:显示器 标准错误理解:extern FIFE *stdin;extern FIFE *stdout;extern FIFE *stderr;a:追加,从结尾写w:从开始写文件描述符:file descritionsLinux系统接口:open系统函数参数传参标志位:int 32bit 理论上传递32个标志位...原创 2021-11-08 09:32:03 · 510 阅读 · 0 评论 -
Linux中编译错误之——vector.h:250:57: error: no matching function for call to ‘find
C++编译.cpp文件,出现错误:vector.h: In function ‘void sxl::test_vector3()’:vector.h:242:57: error: no matching function for call to ‘find(sxl::vector<int>::iterator, sxl::vector<int>::iterator, int)’ vector<int>::iterator pos = find(v.begin原创 2021-10-11 15:56:17 · 796 阅读 · 0 评论 -
Linux中编译错误之——vector.cpp:(.text+0x97): undefined reference to `std::cout‘
C++编译.cpp文件,出现错误:vector.cpp:(.text+0x97): undefined reference to `std::cout'vector.cpp:(.text+0x9c): undefined reference to `std::ostream::operator<<(int)'vector.cpp:(.text+0xa9): undefined reference to `std::basic_ostream<char, std::char_trait原创 2021-10-11 10:07:02 · 599 阅读 · 0 评论 -
Linux中编译错误之——error: stray ‘\357’ in program
C++编译.cpp文件,出现错误:解决方法:修改标点符号错误原因出现的代码中一定有非法字符,认真检查自己是否切换成了中文字符原创 2021-10-04 11:03:20 · 1263 阅读 · 0 评论 -
进程基本概念(2)
1.程序地址空间(1)结构图:进程地址空间不是内存虚拟地址在语言层面上见到的地址都不是物理地址原创 2021-09-23 15:40:26 · 302 阅读 · 0 评论 -
进程基本概念(1)
1.冯诺依曼体系冯诺依曼体系结构计算机的基本原理是:存储程序和程序控制2.输入设备:键盘、网卡、硬盘、话筒、摄像头输出设备:显示器、音响、网卡、硬盘数据要处理,必须预装到内存中,局部性原理,操作系统完成程序要运行之前,必须先加载到内存中?可执行程序(文件)是在硬盘上(外设)硬件控制信号:中断操作系统是一款进行软硬件资源管理的软件操作系统:进程管理、驱动管理、硬件进行管理、内存管理、文件系统...原创 2021-09-16 21:34:53 · 247 阅读 · 0 评论 -
Linux中编译错误之——‘need ‘typename’ before ‘std::vector<T>::const_iterator’ because ‘std::vector<T>’ is a‘
Linux中编译错误之——need ‘typename’ before ‘std::vector::const_iterator’ because ‘std::vector’ is a dependent scope(题目只有100的限制)C++编译.cpp文件,出现错误:vector.cpp: In function ‘void PrintVector(const std::vector<T>&)’:vector.cpp:23:3: error: need ‘typename’原创 2021-09-14 10:13:37 · 1236 阅读 · 0 评论 -
Linux中编译错误之——‘no matching function for call to‘
C++编译.cpp文件,出现错误:In file included from string.cpp:1:0:string.h: In member function ‘void sxl::string::swap(sxl::string&)’:string.h:55:25: error: no matching function for call to ‘sxl::string::swap(char*&, char*&)’ swap(_str,s._str);原创 2021-08-30 11:51:18 · 12256 阅读 · 0 评论 -
三、Linux开发工具使用
扩展源的安装:原创 2021-08-30 09:39:40 · 2633 阅读 · 0 评论 -
Linux中编译错误之——‘nullptr’ was not declared in this scope‘
C++编译.cpp文件,出现错误:[sxl@VM-4-5-centos string]$ g++ -o mystring string.cppIn file included from string.cpp:1:0:string.h: In destructor ‘sxl::string::~string()’:string.h:48:16: error: ‘nullptr’ was not declared in this scope _str = nullptr;解决方法原创 2021-08-29 15:28:41 · 4048 阅读 · 0 评论 -
四、Linux项目自动化构建工具-make/Makefile
一.make/Makefile最大区别make是一条命令,makefile是一个文件二.makefile文件的编写makefile自己定义了一系列的规则,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。1.Linux多源文件编译执行例:若我们要编译一个工程里面的多个文件的方式(1)包含test.h、test.c、main.原创 2021-08-03 20:50:00 · 136 阅读 · 0 评论 -
五、Linux小程序之进度条——缓冲区
1.缓冲区无缓冲:数据不需要缓冲,直接打印到显示器当中行缓冲:先把一行的数据保存起来,刷新的时候再把这一行数据缓冲出来全缓冲:数据将缓冲区全部存满才会被释放出来应用举例:显示器刷新是行刷新,缓存是行缓存带\n就立即把缓冲区内容刷新到显示器上,不带\n表示把行缓冲改成了全缓冲下面两个图作比较:第二张图没有\n,会导致过了5秒,程序结束再打印输出...原创 2021-08-03 20:49:25 · 162 阅读 · 0 评论 -
Linux展示C程序运行详细过程(预处理、编译、汇编、链接)
C程序运行需要的过程:预处理、编译、汇编、链接以mytest.c程序为例讲解:一、预处理(-E)将mytest.c文件进行预处理,-E就是进行预处理,-o是将预处理后的文件存储在mytest.i文件中,mytest.i文件叫做目的文件gcc -E mytest.c -o mytest.i预处理实现的工作:头文件展开、去注释、条件编译、宏替换(1)头文件展开:通过编译器找到指定的头文件,并将头文件对应的内容拷贝至源文件(2)去注释 ,打开mytest.i文件(右边)中,可以看到mytest.c原创 2021-07-30 16:37:35 · 993 阅读 · 0 评论 -
Linux解决没有安装g++问题
1.搜索g++,若没有出现版本信息,则是没有安装,若没有安装进行以下操作2.查找相对应的包yum whatprovides "*/g++"显示:3.安装相应的包 sudo yum install gcc-c++-4.8.5-44.el7.x86_64显示:4.查看是否安装成功g++ -v显示:5.利用g++编译文件...原创 2021-07-30 11:07:37 · 2316 阅读 · 0 评论 -
二、Linux权限
1.用户切换普通用户切换到root用户:su -输入密码:root密码root切换到普通用户:logout/exit/cyrl+D登录root用户变为其它用户:su - sxl(其它用户名)需要把用户名添加到/etc/sudoers文件中,才能提升命令权限(root管理权限下修改)2.单纯提升当前命令权限:sudo passwd sxl3.10个字符第一个字符: 文件类型,Linux中文件类型与后缀无关-:普通文件,文本,可执行程序,库d:目录c:字符文件,显示器,键盘b:块设备,磁原创 2021-07-27 20:03:05 · 308 阅读 · 0 评论 -
一、Linux基本命令详解
1.ls:列出该目录下的所有目录及文件命令加参数功能ls-a列出所用文件,包含隐藏文件ls-l列出文件详细信息ls-d只显示目录相关信息ls-R列出所有子目录下的文件2.pwd:显示当前所处目录的路径3.linux的路径分隔符:/ ; windows的路径分隔符:\4.cd:切换路径命令加参数功能cd-回到上一次所在路径cd~直接进入到当前工作的主目录5.linux中任何目录下,都默认存在两个目录原创 2021-07-25 09:06:37 · 166 阅读 · 0 评论