linux
文章平均质量分 92
风起、风落
大三在读 但行好事,莫问前程
展开
-
【Linux】多线程 之 POSIX信号量
若临界资源只有1个,则sem设为1,当要使用临界资源时,sem由1变为0,其他人在想申请,则申请不到挂起排队,等待释放临界资源时 sem由0变为1 ,才可以再申请临界资源。POSIX信号量 和system V 信号量 作用相同,都是用于同步操作,达到无冲突的访问共享资源目的,但。当A和B开始,桌子上没有苹果时 ,或者 桌子上全都是苹果时,都会访问同一个盘子。有一个很大的桌子,存在像钟表的0-12点刻度的区域,在每个刻度中放入一个盘子。生产者生产数据在当前空间,则对应的数据+1,所以消费者可以拿数据。原创 2023-07-16 20:56:21 · 890 阅读 · 46 评论 -
【Linux】生产者 消费者模型
针对上述情况,将if判断改为while循环,每一次被唤醒都要被检测,只有当队列真的是不满的情况,才会进行push。发生休眠实际上就是线程切换,当线程从休眠状态被唤醒时,因为是从临界区被切走的,所以继续从临界区内部执行。供货商可以集中生产的一大批的商品 放到超市中,让消费者随时随地来买,供货商就不生产了。如:若超市火腿肠满了,就应该让消费者先消费,若超市没有火腿肠了,就应该让生产者先生产。若队列中没有数据存在,则不该让消费者消费,若队列中数据满了,不该让生产者进行生产。原创 2023-06-05 12:59:14 · 704 阅读 · 108 评论 -
【Linux】死锁 | 条件变量部分理解
设置一个全局锁mutex,再自定义函数中由于两次申请锁,所以在第二次申请锁时,线程自己把自己挂起了。假设要有两把锁才能获取临界资源,本身有一把锁,在多次申请另一把锁时申请不到,就把自身的锁释放掉。所以在教室的使用规则加入一条,自习完毕的人,归还完钥匙,不能立即申请,在外面等待的人,必须排队。假设有线程A和B,线程A申请锁时,必须保持先A再B,线程B申请锁时,也必须保持先A再B。先加锁,默认判断条件不满足,所以使用 wait ,将线程在条件变量中休眠,并自动释放锁。原创 2023-06-03 23:12:30 · 539 阅读 · 89 评论 -
【Linux】线程互斥
此时的tickets的值为0,CPU就会再次执行还未执行完的线程a 的剩余步骤,tickets-- 即 0-1 =-1。所有线程看到的是同一把锁,mutex作为共享数据 ,交换到寄存器的上下文中,寄存器作为线程的私有上下文 即 加锁。当访问临界区时,有可能被挂起被阻塞,但是并不担心别人进入临界区中 此时并没有解锁,没有归还锁,不会,我不在期间,其他人没有办法进入临界区,因为无法成功申请到锁,锁被我拿走了。此时再次执行线程A,由于上次执行线程A时第3步没有执行,所以线程A继续执行第3步。原创 2023-05-28 21:50:46 · 1720 阅读 · 100 评论 -
【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储
创建进程时,在内核中存在LWP(轻量级进程),为了更好管理LWP,没办法给用提供线程接口,就必须使用pthread库来适配,对线程做管理,与LWP产生关联,包含库中的线程属性 即TCB。即 线程默认被创建出来时,必须被join的, 若不能被join,线程对应的资源就无法释放,进而造成内存泄漏问题。ebp 可以是 线程1 、线程2、线程3的栈底,根据调度的不同 ,在不同的栈中开辟不同的变量。若不关心线程的返回值,join是一种负担,创建一个线程时,提前告诉它,要分离这个线程。原创 2023-05-24 21:59:39 · 1446 阅读 · 96 评论 -
【Linux】线程控制
若每一个线程都有一个临时变量,则将所有的临时变量数据都放入地址空间的栈中,就会导致数据谁是谁的分不清楚。主线程打开一个文件,然后又创建了一个新线程,新线程可以看到主线程打开的文件,同样也可以读取文件描述符。覆盖后,并没有改变在上一个线程传递的起始地址,即name没有变化,但是内容为缓冲区更新后的。循环多少次,new就会执行多少次,随着每一次的new,传递给新线程的起始地址就只属于该线程。等待方式默认是阻塞的,若新线程没有退出, 主线程就一直等待,直到新线程退出。原创 2023-05-23 10:21:52 · 1429 阅读 · 100 评论 -
【Linux】多线程概念再理解
当有100MB的空间写到磁盘中,1次写入到磁盘中,还是分100次写入,每次写入1MB的数据 那个效率高?申请物理内存后,不一定立马用,若立马申请物理内存,不用就导致内存一直被占着,处于闲置的状态,不是高效的表现。通过查页表的方式,对操作进行权限查询,发现只有读的权限,但没有修改的权限,所以MMU(内存管理单元)异常,把数据从磁盘换入物理内存,把数据从物理内存换入磁盘,是一个高频的工作,物理磁盘是一个机械设备,作为外设。整体会很常慢,使整机的效率低下,若过多进行IO,就导致过多的寻址操作,即 效率低下。原创 2023-05-17 20:02:38 · 2220 阅读 · 110 评论 -
【Linux】volatile | SIGCHLD | 多线程概念
创建子进程时,只创建PCB,创建出来的PCB继续指向父进程的地址空间代码区假设有很多函数存在,让不同的PCB执行不同的函数相当于在一个进程内部包含多个执行流,指向同一个进程内的不同代码区域每个PCB都是单独的线程线程在地址空间内运行,所以该线程属于进程。原创 2023-05-15 22:57:40 · 1681 阅读 · 93 评论 -
【Linux】进程信号(下)
若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程。虽然说可以使用内核态去执行自己实现的方法,但是不可以这样做,因为有可能方法内部做了一些非法操作。系统调用的本质:就相当于调用库函数中的方法,在自己的地址空间中进行函数跳转并返回。操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别。的时候,进程会在操作系统的指导下,进行信号的检测与处理。当执行完某种任务时,先找到对应的进程,检测对应的信号。原创 2023-05-07 21:02:16 · 1153 阅读 · 128 评论 -
【Linux】进程信号(中)
在上一个文章中,关于信号的产生,还有没补充完的,所以在这篇文章补充一下。原创 2023-05-06 09:24:58 · 2045 阅读 · 106 评论 -
【Linux】进程信号(上)
默认对2号信号的处理动作:终止进程输入指令2号信号的动作是 Term(终止)用signal(2,handler),是在执行用户动作的自定义捕捉CTRL \ 代表3号信号 ,此时虽然2号信号被置为自定义动作了,但是三号信号还没有,所以依旧能终止进程修改mysignal.cc文件内容,加入对于3号信号的自定义动作再次运行可执行程序时,发现使用CTRL \也会调用自定义动作可以给所有信号设置同一个处理函数若修改mysignal.cc文件内容,将1-31的所有普通信号都进行自定义动作捕捉。原创 2023-04-25 22:32:09 · 2168 阅读 · 134 评论 -
【Linux】system V 消息队列 | system V 信号量(简单赘述)
如果放映厅是顶级VIP级别,只有一个座位 ,当这个座位对应的票被预订了,其他人就不会预定了,所以看电影期间,不会有人打扰,就相当于完成互斥功能。操作系统要把多种消息队列管理起来,先描述在组织,每一个消息队列都有自己的结构体对象,对应的结构体对象包含当前消息队列的属性。这样信号量本身就变成共享资源,这就需要信号量保证自身++或- -操作是原子的(要么就不加,要么就加完了),来保证自身安全。临界资源是要通过代码访问的,凡是访问临界资源的代码叫做临界区。任何一个执行流,想访问临界资源的一个资源时,不能直接访问。原创 2023-04-20 23:04:25 · 472 阅读 · 56 评论 -
【Linux】system V 共享内存
打开vscode,创建文件client.cc和server.cc(后缀为cc说明是c++)的文件创建公共路径 comm.hpp。原创 2023-04-16 22:11:38 · 1890 阅读 · 100 评论 -
【Linux】vscode的使用 | 进程间通信(简单概括)
创建一个新文件,并命名为test.c ,此时出现一个黑点,说明本地代码并没有同步给远端。在新创建的终端上,点击电脑图标,SSH出现绿色的对号即表示连接成功。将本地将vscode打造开发环境 – vscode的本地环境搭建。在xshell上,打开对应新创建的test.c 什么都都没有。输入 CTRL S 后,黑点就消失了,对应就保留到远端中了。这里放一篇大佬超详细解析的博客,包括解决下载速度慢的问题。再次重启vscode,在SSH箭头下就有了IP地址存在。需要注意的是当打开文件后,还需再次输入密码。原创 2023-04-12 15:51:05 · 1626 阅读 · 34 评论 -
【Linux】动静态库
2.如果没有默认安装到系统的gcc/g++默认的搜索路径下,用户必须指明对应的选项,告知编辑器, 头文件在哪里,库文件在哪里,库文件具体是谁。如果要安装第三方的库,(第一方库是语言,第二方库是操作系统系统接口),要正常使用,即便已经全部安装到系统中,此时otherperson目录中存在.h文件 与main.c 以及 .o目标文件的压缩包。分别通过myadd.c 与mysub.c形成 myadd.o 与 mysub.o。拷贝所有的.h文件放在include目录下 ,拷贝所有的.a文件放在lib目录下。原创 2023-04-08 21:34:01 · 1478 阅读 · 103 评论 -
【Linux】基础IO——文件系统
第一点:因为OS是软件,磁盘是硬件,硬件定位一个地址,用的是CHS,但是如果OS直接用了这个地址,万一硬件改变,OS也要发生变化,所以OS要和硬件做好解耦工作。2.一个目录也是一个文件,也一定属于 一个分区,在该分区中找到分组,在该分组中对应的inode table中,找到文件的inode。一个文件,一个inode,一个分区内部也会存在大量的文件即会存在大量的inode节点,一个group,文件的内容是变化的,用数据块对文件内容保存的,所以一个有效文件要保存内容就需要1/n数据块。原创 2023-04-03 12:54:57 · 1313 阅读 · 85 评论 -
【创作赢红包】| 【Linux】 基础IO——自己实现文件接口FILE
缓冲区为ptr,单个单元的大小为size,nmemb代表想要写入几个单元,写入对应的流中。共分为两种情况,若剩余空间足够,则调用if语句,将用户从ptr拷贝的数据全部拷贝给缓冲区。将自己设置的结构体MY_FILE内部的fd赋值为 open函数打开的返回值fd。当关闭文件的时候,fclose(FILE*) 将C语言当中的文件指针传进来。若剩余空间不足够,则调用else语句,将从ptr拷贝的数据填满剩余空间即可。同时由于缓冲区加入MY_size个字节,要更新current的位置。原创 2023-04-01 08:03:18 · 1608 阅读 · 86 评论 -
【Linux】 基础IO——文件(下)
将3号描述符里面的内容拷贝到1里面,用3号内容覆盖1号内容,此时1号描述符就不再指向标准输出了,转而指向myfile文件,写入1的内容,就会写入文件中。内存把数据写到显示器上,属于写入的过程,读取是从键盘中读取的,键盘输入后,操作系统把输入的数据回显到显示器上了,在当前进程看来,所有的东西都是文件对象,要有数据放到缓冲区里,底层读写时只需要调用对应的方法,来完成对应的读写,任何一个进程,在启动的时候,默认会打开进程的三个文件,系统中一定会存在大量被打开的文件,原创 2023-03-26 23:37:57 · 1312 阅读 · 73 评论 -
【Linux】基础IO ——文件(上)
操作系统不相信任何用户,所以操作系统给用户提供系统调用程序员调用库的接口,而库的接口必定要调用系统调用打开文件的本质是文件相关的内容加载到内存里把数据触发从磁盘到内存把数据从自己的程序写入硬盘上,一定会涉及到对硬件的访问用户不能使用c/c++库绕过操作系统去访问软硬件各种资源属于操作系统的,操作系统是硬件的管理者。原创 2023-03-21 22:52:13 · 1365 阅读 · 84 评论 -
【Linux】进程的程序替换
编写极简版本的shell(bash)目标:为了深刻的理解shell的运行原理输入,发现bash就是一个进程由于shell是一个进程,所以用while死循环。原创 2023-03-15 10:59:34 · 2391 阅读 · 80 评论 -
【Linux】进程控制
马上要考试了,所以李四需要一份复习资料,而张三是一名学霸,所以李四打电话向张三询问,张三说正在整理复习资料中,为了比其他人更快获得资料,所以李四就一直通着电话一直等到张三整理完。下次考试前,李四又找到张三,还是想要复习资料,而张三依旧还在整理复习资料,每过几分钟李四就给张三打电话询问进度,而在等待这个过程中可以干一些其他的事情,直到打电话张三说整理好了。子进程运行5秒,再等待5秒后进入父进程,在等待期间子进程处于僵尸状态,父进程将子进程回收,子进程僵尸状态消失,最后再过5秒,父进程退出。原创 2023-03-04 11:28:32 · 1712 阅读 · 90 评论 -
【Linux】进程地址空间
假设一个进程的代码中有一个寻址操作,放到CPU中,CPU内部进行寻址,读取某个变量,但是在读取的过程中代码有问题,给CPU的地址也是有问题,如:越界,访问到另一个进程的数据,若再写入数据,则破坏了另一个进程的数据。当malloc申请空间时,在地址空间中申请空间,在页表处只填写虚拟地址,物理地址处不填写,就不需要在物理地址处申请空间,过一会,进程尝试对空间写入,在重新申请空间把映射关系创建好,一个整数4个字节,而每个字节都有自己的地址,所以一个整数要有四个地址,而正常来说会取首地址作为整数的地址。原创 2023-02-28 10:38:52 · 744 阅读 · 21 评论 -
【Linux】孤儿进程 | 环境变量 | 命令行参数 | 进程优先级
环境变量本质就是一个内存级的一张表,这张表由用户在登录系统的时候,进行给特定用户形成属于自己的环境变量表环境变量每一个都有自己的用途,有的是进行路径查找的,有的是进行身份认证的,有的是动态库查找的,有的用来进行确认当前路径的等等,每一个环境变量都有自己的应用场景,每一个元素都是kv的环境变量对应的数据,是从系统的相关配置文件中读取进来的使用cd ~,进入当前目录的主目录中使用ls -la, 显示隐藏文件这是两个shell脚本,内部包含了配置文件。原创 2023-02-25 18:36:39 · 1938 阅读 · 85 评论 -
【Linux】进程状态
阻塞:阻塞就是不被调度一定是因为当前进程等待某种资源就绪一定是进程task_struct结构体需要在某种操作系统管理的资源下进行排队。原创 2023-02-19 09:18:51 · 2026 阅读 · 76 评论 -
【linux】进程|查看进程|PID值|fork原理
假设在一个文件中写代码,并生成一个可执行程序在磁盘中,可执行程序本质也是一个二进制文件文件 =内容+属性内容即 自己写的代码和数据属性即 创建时间、权限等信息使用 ./ 将其加载到内存中,cpu访问代码和数据,从而执行代码,把代码和数据放入内存中 就可以叫做进程么?当然不是!举例:如何成为你的学校的学生呢?只要想办法进入你的学校里,在学校里,就是你的学校的学生么?当然不是,看门的大爷和楼管阿姨也在学校里想要成为学生,必须在学籍档案中有你个人的基本信息同理,原创 2023-01-18 12:02:05 · 3239 阅读 · 75 评论 -
【linux】冯诺依曼体系|操作系统|管理本质
假设校长是一个程序员,要每一个学生的数据, 由于基本属性都是一样的,都包括(姓名、性别、考试成绩),由于linux内核使用c语言写的,所以。所以真正意义的管理者是校长,所有的命令都是由校长发出的, 而辅导员只是按照校长的指令办事,最后辅导员带着学生完成任务。你和你的朋友,聊qq,你发送一个在吗?等上了大学后,你认为你终于脱离了父母的管控了,此时你的父母确实不在你的身边,但若你的父母有一种能力,校长是如何拿到我的数据的呢?在上初中的时候,你经常跟你的同学抱怨,我的爸爸妈妈天天跟在屁股后面,天天管着我。原创 2023-01-14 11:38:58 · 6242 阅读 · 86 评论 -
gcc后续——链接时的静态库和动态库
本篇文章是链接阶段静动态库的理解,原创 2023-01-11 13:52:11 · 1364 阅读 · 24 评论 -
linux小程序—进度条(动态演示)
include 2 #include < unistd . h > //usleep函数 3 #include < string . h >原创 2023-01-10 13:11:06 · 1551 阅读 · 38 评论 -
Linux项目自动化构建工具-make/makefile
这句话表明了你和你爸的关系即依赖关系,但若你只说了这一句话,你爸怎么知道你要干什么,若要修改源代码,此时可执行程序一定存在了,所以源代码的最近修改时间要比可执行程序要晚。后,会自动在当前目录下查找对应的makefile文件,再去执行内置好的gcc命令。比如说到月底你没钱了,你给你爸打电话要钱,过去后,你说。mytest作为目标文件,test.c作为依赖文件列表。,这就表明了依赖方法,这样你爸才能把钱转给你。正常情况下,先有源代码,才编译的可执行程序。clean作为目标文件,依赖文件列表为空。原创 2023-01-09 13:13:33 · 1474 阅读 · 95 评论 -
新建的普通用户无法使用sudo的问题
若普通用户想要使用sudo提高权限,得先被信任,需要将这个普通用户添加到信任名单中。指令查看sudoers的权限 使用者和拥有者都是root,使用者有读和写的功能,在红框中输入自己想要配置的普通用户,第一个即为用户名 复制粘贴后,将用户名修改即可。指令,输入root密码 ,将普通用户切换成root用户。寻找到这句话,使root可以在下面用户的任何地方执行。指令,发现在普通用户中,sudo提供权限即可以使用。所属组有读的功能,而other什么功能都没有。说明lyn这个普通用户,是不被信任的,原创 2023-01-08 11:16:12 · 1178 阅读 · 24 评论 -
linux代码编辑器——vim
刚刚使用 u 撤销 10 p的操作 ,输入 ctrl r 对 u 进行 撤销,相当于进行 10 p的操作。光标所在a处,输入 7r 后 再次输入 m,将aaaaaad 替换成mmmmmmm。从光标开始 ,shift ~ 按一次切换一次 切换为大写。从光标开始 ,shift ~ 按一次切换一次 切换为小写。光标所在w处,输入 r 后,输入 m,将 w字符换成 m。使用o,从命令模式切换到插入模式,光标会重起一行。使用 shift :切换到 底行模式,输入。使用i从命令模式转换到插入模式,光标不变。原创 2023-01-04 19:55:17 · 3486 阅读 · 72 评论 -
linux软件管家——yum
把相关文件名的软件列举出来 此时再次进入查找yum源,会发现yum源已经被替换,并且地址可以打开原创 2022-12-03 09:11:34 · 2101 阅读 · 73 评论 -
linux权限详解
假设有两个组 ,组A和组B,两个组是相互竞争的关系,一起做一个任务,而c为组A中的成员,c做完任务,c即。第三个6对应other, 以二进制表示为: 110 读为真,写为真,执行为假。第三个0对应other, 以二进制表示为: 000 读为假,写为假,执行为假。第二个6对应所属组,以二进制表示为: 110 读为真,写为真,执行为假。第一个0对应拥有者,以二进制表示为: 000 读为假,写为假,执行为假。第二个0对应所属组,以二进制表示为: 000 读为假,写为假,执行为假。原创 2022-11-30 19:43:29 · 2140 阅读 · 93 评论 -
linux的重定向与xshell原理
假设你叫张三,你找到了一份很好的工作,你的村长父亲非常高兴,可如今还没有女朋友, 你的村长父亲问你有没有相中的,你说你喜欢邻居如花,但是。王婆跟你说如花没有相中你后,你依旧没有放弃,想要王婆再尝试下,王婆说不过你,更碍于你的村长父亲,王婆只能再次前去如花家,但是还没等进去就看见了。于是王婆就找到了如花,说你长的挺精神的,并且还有一份不错的工作,让如花考虑一下,如花。找王婆帮你传递信息,王婆来了后,问你喜欢相中谁,你一口确定就相中了如花,结论:显示器输出的信息中,有正确的,也有错误的,原创 2022-11-25 16:52:12 · 1276 阅读 · 49 评论 -
linux基本指令(下)
再次使用vim ,将888.txt文件内容进行修改,使其拥有重复的1111 、2222、3333。此时使用 zip -r 将test 压缩成 test .zip的压缩包后,再剪切到my目录中打开。在test的所处目录中,使用unzip -d 将test.zip 压缩包传入到6.6中,把相邻的一样的文本,压缩只剩下一个 去重后,只剩下 1111 2222 3333。这里使用zip 对test目录进行打包后,会出现 test.zip的压缩包。将 test的压缩包 test.tgz ,解包到6.6目录中。原创 2022-11-23 12:14:20 · 3089 阅读 · 72 评论 -
linux的基本指令(中)
创建一个 test.txt的文件 ,将1-1000带有编号的hello world 重定向到 test.txt中。此时分别打印 file.txt 文件与 file.txt.bak文件发现 都可以打印出 hello world。将 /root/9.9/lesson1 中的 file.txt 文件移动到 /root/9.9中。Y代表 年,m代表月,d代表日,H代表小时,M代表分钟,S代表秒。将file.txt 文件拷贝到 file.txt.bak文件中。将 file.txt 文件拷贝到 touch目录中。原创 2022-11-16 21:13:54 · 5165 阅读 · 92 评论 -
linux基本指令(上)
使用 cd ~ 后 ,使目录 从 /root/9.9/lesson2/dir 到 /root目录中。在 根目录root下的9.9目录中,有一个666.txt的文件 ,一个 lesson2的目录。我们不难发现 ,上面为空的file.txt文件 与 下面有内容的file.txt文件。此时我们发现,使用cd …在 /root/9.9目录下,通过 cd . . 不停的返回上一级目录 ,首先 ,处于 root下的 9.9目录下的 lesson2目录。cd .前后目录没有变化,依旧在root下的9.9目录上。原创 2022-11-10 10:42:04 · 4040 阅读 · 104 评论 -
linux调试器——gdb
这里假设函数是计算1到100的和,结果我们只有1到99的和,所以调试寻找哪里错了。输入两次 n后,第十五行语句已经执行完,光标指向第十六行,但第十五行处是一个函数,如果没有创建就会默认创建一个mytest.c文件,并进入vim编辑器。如果没有创建就会默认创建一个mytest.c文件,并进入vim编辑器。,使光标处于for循环处,随着光标向下移,sum和i也随之改变。光标刚开始在第6行的for循环处,until后直接跳出循环。,发现会报错,不是Debug不可以进入调试。——运行,遇到断点就会停止。原创 2022-10-17 08:04:18 · 746 阅读 · 58 评论 -
使用linux上传代码到gitee
说明并没有传过,当前.c和.h文件以及makefile都不在git中。使用 git add * 将所有没有添加过去的都添加过去。首先登录gittee,进入仓库,并找到克隆/下载。即将上一级目录的所有.c文件都传入当前目录中。即将上一级目录的所有.h文件都传入当前目录中。这是查看代码的状态,看是否之前传过了。点击下载后,找到HTPPS并复制链接。输入以下两句话,再重新输入。进入你想要传的文件目录中。此时我想要传如上文件内容。出现如下则说明上传成功。原创 2022-10-14 10:16:28 · 1984 阅读 · 61 评论 -
linux—— 使用gcc解析程序四个阶段
gcc test1.c -o mybin ——把test.c文件编译形成一个可执行程序mybin。文件中,引入了stdio.h,并将所有头文件都展开以及相关头文件的内容都拷贝进来。这里使用,test.i而不是使用test.c的原因,是因为我们想要。把test.i文件完成编译的临时内容 写入 test.s文件中。文件中,出现了一堆看不懂的东西,实际上是 二进制文件。使用 vim test.c ,进入test.c文件。完成编译阶段,把临时内容放入test.o文件中。进入 test.i文件,同时在。原创 2022-10-11 16:03:25 · 1347 阅读 · 69 评论