![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 87
xxjkkjjkj
这个作者很懒,什么都没留下…
展开
-
线程安全的单例模式
先描述在组织 本质就是一套面向对象的思想,大部分语言都支持面向对象,这就是语言设计者发现都 大家使用时都一样,都需要面向对象,他不是语言必要的特征,他是计算机发展必然的阶段,大家刚开始你是你我是我,二进制,汇编,C的,VB VC。因为后面网络服务器希望它是单例的,一个服务器一旦启动了那就一个启动就行了,不需要再用它的类创建更多的对象了。另外线程池我也不想过多创建,一会总结线程池优缺点,再来谈一谈为什么要把他改成单例模式。编代码也是有方式的,发展这么多年大神们最后大家的代码都很类似,最后总结出一套模板,原创 2024-04-20 12:51:24 · 599 阅读 · 0 评论 -
线程池 1-17续
调系统调用也是有成本的。比如申请内存,一次多给你一点,间接减少系统调用次数。单例模式设计线程池涉及的加锁双if问题 饿汉 懒汉。所有的池化技术本质都是以空间换时间。C++类内创建线程原生线程。原创 2024-04-19 17:50:49 · 129 阅读 · 0 评论 -
配置vscode链接linux
4. 切换到远程资源管理器中 应该可以看到一台电脑,右键在当前窗口链接,输入你的服务器用户密码后电脑变绿说明远程连接成功。3. 选择保存远端host到本地 某位置 等待片刻后。5.一定要登陆上云服务器后再安装各种插件。1.安装 remote SSH。ssh ljh@服务器公网ip。原创 2024-04-06 15:27:03 · 275 阅读 · 0 评论 -
【网络 】
netstat -n(显示数字)au(all udp)p(显示pid信息)查内网ip 和 以太网mac地址。netstat 网络状态。原创 2024-01-27 13:35:58 · 109 阅读 · 0 评论 -
1-17.同步与互斥
1.正确看待生产消费者模型的高效问题。原创 2024-01-17 13:15:11 · 396 阅读 · 0 评论 -
死锁 + 条件变量 + 生产消费者模型
线程第一次申请锁成功,继续再次申请,第二次申请就失败了,当前线程抱着锁就被挂起了。现象 : 代码不会继续往后推进了。一把锁有没有可能产生死锁呢?3. 剩余线程申请锁都不成功。其他线程申请都失败阻塞了。所有整个线程全部都卡住了。1.你抱着锁去休眠了。原创 2023-12-16 13:22:53 · 519 阅读 · 0 评论 -
【加锁 】
1.从逻辑上不对,因为你难道想让一个线程在while循环中,一个线程把票全抢完然后才能到下一个线程抢吗,下一个线程抢都没票了。线程申请锁失败了,线程阻塞等待的本质是线程等待锁资源不就绪,调度器把线程PCB阻塞后去锁的队列里进行等待。此时解锁代码没有被执行,这个线程已经走了,但是锁一直没释放,其他线程会一直阻塞。但是这里还有问题,可能一个线程抢到锁了,在抢票时发现票没了直接break。我们要把对应的资源保护起来,要保证多个线程申请的是同一把锁。没有拿到锁的线程,就必须要在指定的锁上等待。原创 2023-12-14 13:25:35 · 424 阅读 · 0 评论 -
线程互斥与同步
用户级线程 和 内核级线程 也就是线程实现真的是在OS内部实现,还是应用层或用户层实现。必定每一个人都要有自己独立的栈结构,让自己的调用链不受别人的。用户级执行流(用户级线程) :内核lwp = 1 : 1。新线程在执行流上和主线程是独立的,所以他们形成调用链时。站在线程角度每个线程都有自己独立的栈结构,但并不是说我。用户级线程 + 内核的LWP = Linux线程。干扰,所以每一个线程都要有自己的栈结构。这个栈不仅仅要简单的变量定义,入栈出战。所以主线程当然要有自己的调用链。下面来谈谈线程库中的栈。原创 2023-12-11 19:03:32 · 442 阅读 · 0 评论 -
线程控制.
因为main函数和指定函数threadRoutine 它在同一块代码被编译时一定使用代码部分不同的地址空间范围,代码区虽然是一整块,但不同函数用的不同的地址空间,注定了这两个线程执行时在代码资源上是分离的。既然他只有轻量级进程的概念的话,注定了linux os不会给我们直接提供线程的系统调用,只会给我们提供轻量级进程的系统调用!线程已经成为调度的基本单位了,每一个线程都属于同一个地址空间中,所有的线程都属于同一个进程。正是因为OS用进程内核数据结构模拟的线程,所以内核中有没有很明确的线程的概念呢?原创 2023-12-05 12:34:24 · 402 阅读 · 0 评论 -
线程+地址空间4
如果我今天再创建一个“进程” 不再给它创建新的地址空间,新的页表,我只创建pcb,让其指向父进程的地址空间,也指向父进程的页表(我们不管)我们以前创建子进程,父子进程在数据结构上相互独立,需要给子进程开辟新的pcb,地址空间,页表,虽然大部分都是从父进程来的。此时新的子进程就在父进程的地址空间内运行,同时把页表中对应分出来区域的映射给新的子进程就可以了。既然能创建一个,就能创建多个,只创建pcb,把一个进程的地址空间分成若干份分给子进程部分代码。此时线程的执行粒度,要比进程更细,为什么这么说?原创 2023-12-03 20:22:20 · 419 阅读 · 0 评论 -
信号收尾.
看看sigaction结构体里面,红线是我们不关心的,里面有个sa_handler不就是之前信号捕捉的函数指针类型吗,也就是处理方法,其实也就是修改了handler表里面的方法。输入型参数act结构体里面包含了你要设置新的动作,输出型参数oact是保存老的设置以便你后续恢复。我们发现函数名和形参中结构体名一样都是sigaction,这在c/c++中允许吗?它也是信号捕捉,不仅能处理普通信号还能处理实时信号,但我们不管实时信号。这个结构体红线你都不关心,那直接用memset都清零就可以。原创 2023-11-30 12:04:26 · 433 阅读 · 0 评论 -
信号-重谈地址空间3
信号的保存:我可能正在推高地,脑子里面记住我外卖到了,一会再去拿。信号的产生:外卖小哥给我打电话说你外卖到了。信号的处理:我打完了,下楼把外卖拿了。完成了一次信号的生命周期。原创 2023-11-23 17:33:45 · 458 阅读 · 0 评论 -
SystemV ipc(进程间通信)
如果今天创建了一个共享内存,OS就会为我们创建struct shmid_ds结构,我们就把第一个字段struct ipc_perm shm_perm地址放入到数组当中,消息队列和信号量同理都把第一个字段地址放入数组中(这个道理就像你创建一个都是Int类型的结构体你看看第一个整形的结构体地址和结构体地址一不一样?数组中保存的是ipc_perm的地址,该如何访问共享内存or消息队列 shmid_ds 和msgid_ds中的其他属性呢?,OS中也是用数组来管理的,数组中保存了struct ipc_perm*原创 2023-11-22 13:02:35 · 190 阅读 · 0 评论 -
共享内存.
因为不能让进程直接malloc,你这样申请了那这块空间就是你的,会破坏了进程的独立性。OS帮助申请内存,通过页表挂接到进程地址空间中,给应用层返回起始虚拟地址。到了共享内存了支持双向通信能读也能写,但是一般都是一个读一个写。上面的操作都是进程直接做的吗?直接由操作系统来做。进程间通信的本质是:先让不同的进程,看到同一份资源!如果要释放共享内存:去关联,释放共享内存。要想通信先看到同一个份资源,则。3、共享内存的特性,扩展代码。我们要把这句话奉若圭臬一般。原创 2023-11-21 16:00:48 · 83 阅读 · 0 评论 -
打开文件 和 文件系统的文件产生关联
2、如果4KB文件你只要100字节,你能保证你下一次不用这文件上下文的其他数据吗?反正拿100字节还是4KB效率差不多,因为估摸着你后面的字节大概率也要用。物理内存和磁盘交互的单位是4KB,磁盘中未被打开的文件数据块也是4KB,所以磁盘中页帧也是4KB,内存中叫页框。把数据交换的物理内存也要花4KB?1、和磁盘交互比较慢,一共4KB每次要1KB的效率不如一气直接4KB,因为磁盘只需要定位一次。我这个文件可能没有4KB,就一个字节,但不好意思加载4KB。我这个文件4KB,想修改1字节,也得加载4KB。原创 2023-11-16 20:24:02 · 138 阅读 · 0 评论 -
进程间通信
进程代表的就是用户,一般而言“资源”从创建,使用,释放–OS不允许用户直接访问内部的资源,所以都是调用–系统调用接口!e.基于文件级别的通信方式–管道(既不属于system V也不属于posix)一般操作系统,会有一个独立的通信模块—隶属于文件系统—IPC通信模块。这个进程独有,破坏进程独立性。d.我们进程访问这个空间,进行通信,本质就是访问操作系统!a.进程间通信的本质:必须让不同的进程看到同一份"资源"从底层设计,从接口设计,都要由操作系统独立设计。假设一个进程提供,这个资源属于谁?原创 2023-11-16 17:28:35 · 105 阅读 · 0 评论 -
动静态库-进程地址空间的第二讲
gcc去默认路径/usr/include里面去找。但是mymath.h根本不在这里面,所以就报错了。原创 2023-11-14 14:22:27 · 101 阅读 · 0 评论 -
文件系统.
如果一个文件没有被打开呢?终极目标: inode 和 软硬连接。3、获取的问题(属性 +文件内容)之前谈论的是一个被打开的文件!1、认识硬件 --- 磁盘。2、对硬件进行抽象理解。文件系统 :Ext2。原创 2023-11-08 16:04:28 · 123 阅读 · 0 评论 -
用户缓冲区概念
先看现象,printf / fprintf / fwrite 一定封装了write , 但是执行代码看到大家都是去掉\n 和close(1),库函数无法打印,write可以。如果执行这两句代码你会发现程序会等待一会最后结束时打印出来,这是因为缓冲区的存在,printf把。你不是说的库函数封装了write,怎么打印不出来?原创 2023-11-07 14:31:22 · 94 阅读 · 0 评论 -
重定向-缓冲区
尝试用这个代码 关闭0,1,2文件描述符,看看有什么现象?关闭哪个,你打开的文件fd应该就是哪个。从0下标开始,寻找最小的没有没使用的数组位置,它的下标就是新文件的文件描述符。文件描述符对应的分配规则是什么?原创 2023-11-03 18:31:26 · 139 阅读 · 0 评论 -
文件fd.
-----0S要不要管理这些被打开的文件呢?—先描述,在组织 — 在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。没有被打开的文件非常多。一定要先把属性加载到内存,内容要不要被加载取决于要不要对文件做修改,理想情况是都被加载。3.打开的文件: 谁打开?----本质是研究进程和文件的关系!根据冯诺依曼原理,文件被打开,必须先被加载到内存!一个进程可以打开多个文件,则进程与打开文件数量关系为。2.文件分为打开的文件 和 没打开的文件。则操作系统内部,一定存在大量的被打开的文件!原创 2023-11-02 12:12:58 · 130 阅读 · 0 评论 -
进程替换..
1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。1、单进程版 – 最简单的先看看程序替换。3、多进程版 – 验证各种程序替换借口。2、谈进程替换的原理。5、自定义shell。原创 2023-10-29 20:24:57 · 112 阅读 · 0 评论 -
进程等待..
我们要通过进程等待,获得子进程的退出情况—知道我布置给子进程的任务,它完成的怎么样了—要么关心,也可能不关心—可选的。通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能!僵尸进程无法被杀死,需要通过进程等待来杀掉它,进而解决内存泄漏问题—必须解决的。代码:父进程通过调用wait/waitpid进行僵尸进程的回收问题!wait返回值为等待成功的子进程pid,如果小于0说明等待失败了。进程,现在有多个子进程需要通过循环+wait。原创 2023-10-26 17:29:38 · 157 阅读 · 0 评论 -
地址空间收尾-进程控制
父进程的环境变量也是由bash继承下来的,必定有页表帮助我们从虚拟到物理的映射,创建子进程的页表时也会将对应父进程的地址空间中环境变量的对应映射建立好,所以即便不传对应的env参数,子进程也能获得环境变量信息。我们的PCB对象数据结构本身和进程地址空间也要在物理内存中放的哦,操作系统内核中的数据结构一定要映射到地址空间内核空间中。子进程为什么能继承父进程的环境变量呢?通过打印地址实验可以发现,进程的环境变量在栈区之上。0G-2G是给用户使用的。3G-4G是给操作系统的。原创 2023-10-25 13:33:11 · 90 阅读 · 0 评论 -
进程地址空间
内存寻址的最基本单位是字节。原创 2023-10-19 16:32:49 · 119 阅读 · 0 评论 -
Linux-环境变量
环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性。原创 2023-08-23 20:24:01 · 265 阅读 · 1 评论 -
linux-进程
一个计算机能够正常运行,就必须遵守冯诺依曼体系数据流向为什么不把Cpu直接怼到输入设备和输出设备中间,非要加个内存呢?答:因为根据木桶原理,如果这样设计,导致最终效率会由外设的效率为主,而外设非常慢。并且Cpu 的存储空间非常小,就注定了外设会拖慢cpu那么按照冯诺依曼体系结构,这种依然串行的结构,输入设备把数据拷到内存,内存在拷到cpu,输出同理,好像也没快多少?原创 2023-08-19 13:43:12 · 689 阅读 · 0 评论 -
make makefile
如果把clean放到makefile的最开头,那么 make 会自顶向下对makefile进行扫描,把所要形成的第一个目标文件,充当为make的默认动作,谁在前面,直接make就是默认动作。当有多个源文件时,使用make和makefile来帮助我们进行自动化编译,也就是用一个make和make c lean帮助程序员从繁琐的gcc或者g++的命令中解脱。举个例子:你给你爸爸打电话要钱,你是你爸爸的儿子,你依赖于你爸爸,这就是类似的依赖关系。touch一个存在的文件 ,强制更新文件的三个ACM时间。原创 2023-07-11 22:08:19 · 238 阅读 · 0 评论 -
gcc/g++
windows中也存在C的头文件和库文件,在安装VS时候也会安装C的库和头文件,所以#include 直接就可以找到。1.寻找root用户 在 /etc/sudoers 文件中修改 添加普通用户的白名单。vs社区版本和专业版并不需要维护两份代码,而是只维护一份,利用条件编译进行代码。编译器在预处理阶段对.c文件进行修改,再添加一个宏定义,也不是什么难事。而不是#include原创 2023-06-04 14:36:23 · 496 阅读 · 0 评论 -
Vim yum
yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.(在windows下也是这样,比如说卸载时)要安装软件一定是要往系统目录里写文件,如果用户不是白名单,那么只能用root来安装,或者sudo给命令提权。如果你的CentOS-Base.repo里面不是国内的镜像网址,是国外的,可能会很慢。yum install -y 找到的软件包名 //-y表示不再询问。下载链接 位置 :ll /etc/yum.repos.d/原创 2023-05-20 17:10:58 · 481 阅读 · 0 评论 -
Linux-权限
问题:对于 -普通文件,后缀.txt文件 你给它加了可执行权限x,但是能不能执行又是一回事,这里执行失败。test.txt未经编译,是源代码,给它添加可执行权限一定无法运行。目前我们用adduser新建的用户,没有颁发执行sudo,系统不信任你。gcc是一款编译器,软件不代表其他Linux系统上运行的其他软件不需要后缀。用户 和拥有者,所属组对比,都不属于就是other。文本,可执行程序,库基本都属于普通文件。人(角色):拥有者,所属组,other。你不在 /etc/sudoers。属性:读,写,可执行。原创 2023-05-15 13:23:39 · 513 阅读 · 0 评论 -
Linux 指令3
因为有目录所以加上 -r递归压缩。原创 2023-05-14 17:08:46 · 462 阅读 · 0 评论 -
Linux-基本指令2
语法:cp [选项] 源文件或目录 目标文件或目录。-f 即使文件属性为只读(即写保护),亦直接删除。*匹配任意字符,配和 ls查找需要的名字或后缀。顺序都是可以的,推荐rm -rf xxxx。本来应该显示到显示器的内容,打印到文件中。rmdir只能删空的目录,不能删除文件。当遇到死循环输出停不下来 就用此条指令。rmdir和mkdir 相对应。-r 删除目录及其下所有文件。-i 删除前逐一询问确认。递归删除且不进行询问。man 对应手册 指令。优先1 -》2-》 3。功能:删除文件或目录。原创 2023-04-30 19:52:14 · 686 阅读 · 0 评论 -
Linux-基本指令
Linux的目录结构整体是一个多叉树,他的叶子节点,一定是空目录或者非目录文件,路上节点一定是一个非空目录。功能:对于目录,该命令列出该目录下的所有子目录与文件。我们以自己当前所处的路径为起始参照位置,来进行特定文件的定位,我们这种路径:相对路径!Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。所以我们所有的对文件或者目录的增删改查,本质都是对这颗多叉树的增删改查。在Linux中,以.开头的文件,我们称之为隐藏文件!如果进入的目录很深,退出了又想返回刚才的目录,就用它。原创 2023-04-30 13:59:12 · 682 阅读 · 2 评论