- 博客(106)
- 收藏
- 关注
原创 线程池的实现
如果isPoolRuning_为ture,但是在cached模式下,根据当前时间和上一次线程使用时间,判断有没有超过60s,如果超过了,并且当前线程数大于初始定义,说明不需要那么多线程了就需要回收线程资源;cached模式下,需要根据任务数量和空闲线程的数量,判断是否需要创建新的线程出来,如果任务数大于现有的空闲线程数并且没有超过阙值,就增加线程,修改相关数量;创建线程对象,把线程函数threadFunc给到thread线程对象,使用绑定器,获取线程id,方便回收线程资源;
2024-09-23 16:28:51 1262
原创 Linux后台服务端(三)
主模块主要就是客户端的接入,然后分发客户端到客户端处理进程。服务器的线程函数主要是接收客户端,然后发送到客户端处理进程。所以其逻辑比较清晰(服务器每个模块的逻辑,越简单越好)
2024-09-23 15:36:41 156
原创 Linux后台服务端(二)
现在我们一开始就是多进程模式了,所以直接就可以上进程间通。管道在多线程环境下不太方便(可能会出现内容插入)而且是单。消息函数(sendmsg、recvmsg)需要创建时确定。进程间通信,最方便最快速的就是本地套接字通信了。内存共享需要反复加锁同步,否则可能出现问题。数据传输量巨大,传输速率高(纯内存读写)无需IP和端口,不影响服务器对外的资源。网络套接字通信,需要额外的IP和端口。信息无需加锁,可以多线程并发写。所以本地套接字是最佳选择。
2024-09-23 14:34:19 441
原创 C++锁的使用
线程之间的锁有:互斥锁、条件锁、递归锁、读写锁、自旋锁。其中自旋锁比较特殊,它是一种busy-waiting锁。如果T1正在使用自旋锁,而T2也去申请这个自旋锁,此时T2不但得不到这个自旋锁,而且与互斥锁相反的是,此时运行T2的处理器core2会一直不断地循环检查锁是否可用(自旋锁请求),直到获取到这个自旋锁为止。除自旋锁外,其他的锁都是sleep-waiting锁。
2024-09-23 11:19:11 1018
原创 C++单例模式
单例模式设计模式是 被反复使用 多数人知晓 经过分类的、代码设计经验的总结单例模式:一个类只能创建一个对象 即单例模式,该模式可以保证系统中该类只有一个实例单例模式分为饿汉模式和懒汉模式。
2024-09-23 11:05:51 478
原创 C++11(上)
auto 关键字在 C++11 中引入,用于让编译器自动推导变量的类型。基本用法:auto 可以用于变量的声明,让编译器根据初始化表达式来推导变量的类型。
2024-09-22 21:28:10 535
原创 C++智能指针详解
看下面的例子:若p1处new抛异常,则相当于p1的new没有成功,则什么都不用做若p2处new抛异常,则相当于p2的new没有成功,而p1的new成功了,所以需要释放p1,然后再重新抛出若div处抛异常,则将p1与p2都释放,再将其重新抛出可以看出处理起来非常麻烦,存在内存泄漏的问题(只进行new,但没有delete)第二个new抛异常要释放第一个new,div抛异常要释放前两个new若再添加一个new,则又会存在new抛异常的问题,还需添加 try catch。
2024-09-22 17:30:30 941
原创 【计算机网络】socket编程
1.不是所有的进程都要进行网络通信,只有部分进程可能会网络通信,若用进程PID来作为网络标识该进程,就很难区分清楚那些是进行网络通信的,那些不是进行网络通信的。在进行发和收数据时,在TCP层没有报文的概念,收到一堆的数据,把这一堆的东西一次将给上层的应用层,也可一个字节一个字节交。进程PID在系统层面上每个进程也是唯一的,也能表示该系统上进程的唯一性,所以用进程PID可以代替端口号的。如:收快递,收一个就是一个完整的快递,具体的快递不可能收半个或者一个半,若对方发了三次,你就必须收三次。
2024-02-15 17:51:42 911
原创 【计算机网络】网络基础
到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测。划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.数据链路层的标准是不一样的,因为数据链路层的具体实现是在网卡驱动实现的。
2024-02-15 16:30:03 388
原创 【Linux】线程互斥
第二种,若锁为局部变量,就必须调用pthread_init 进行初始化,用完后也必须调用 pthread_destroy 进行销毁。此时的tickets的值为0,CPU就会再次执行还未执行完的线程a 的剩余步骤,tickets-- 即 0-1 =-1。第一种,锁为全局变量 ,直接用PTHREAD_MUTEX_INITIALIZER,对锁进行初始化。不会,我不在期间,其他人没有办法进入临界区,因为无法成功申请到锁,锁被我拿走了。为了保证访问时不能被别人去抢走,所以就把门窗都关上,直到访问完,才让别人进来。
2024-02-07 05:55:52 844
原创 【Linux】线程分离
即 线程默认被创建出来时,必须被join的, 若不能被join,线程对应的资源就无法释放,进而造成内存泄漏问题。若不关心线程的返回值,join是一种负担,创建一个线程时,提前告诉它,要分离这个线程。整体红色的框 作为一个结构体 等同于 线程的TCB 结构 进行描述。struct pthread 描述的是线程的其他的一些属性。找线程,找红色框的起始地址即可 称为 线程ID。默认情况下,新创建的线程是joinable的。线程库也需要管理线程,先描述再组织。线程库创建类似的管理线程的TCB。
2024-02-07 05:45:01 407
原创 多线程概念
创建子进程时,只创建PCB,创建出来的PCB继续指向父进程的地址空间代码区假设有很多函数存在,让不同的PCB执行不同的函数相当于在一个进程内部包含多个执行流,指向同一个进程内的不同代码区域每个PCB都是单独的线程线程在地址空间内运行,所以该线程属于进程。
2024-02-07 05:33:37 379
原创 【Linux】进程信号(下)
若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程。当进程从内核态切换回用户态的时候,进程会在操作系统的指导下,进行信号的检测与处理。操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别。当执行完某种任务时,先找到对应的进程,检测对应的信号。内核态:执行操作系统的代码的时候,进程所处的状态。若为3,则表征正在运行的进程,执行级别为用户态。用户态:执行你写的代码的时候,用户所处的状态。
2024-02-07 05:28:45 310
原创 【Linux】进程信号(上)
信号产生什么叫做信号呢?生活当中认为是信号的是:红绿灯 闹钟 下课铃 鸡叫 手势1.当红灯亮的时候, 你会停下来 即匹配的动作那为什么会有这个匹配动作呢?因为曾经有人培养过你所以信号没有被产生,也知道怎么该处理它。
2024-02-07 05:20:49 350
原创 【Linux】system V 共享内存
进程A和进程B都通过自己的页表映射到物理内存中的特定区域,进而找到该进程匹配的代码和数据。并不是在内存中开辟空间即可,系统为了管理共享内存,构建对应的描述共享内存的结构体对象。想办法把物理内存中新开辟空间 通过页表 映射到 进程A和进程B的共享区中。就完成了让进程A和进程B看到同一份资源,这份资源就被称为共享内存。进程A和进程B就可以通过起始的虚拟地址,对应页表访问到内存。为了让进程A和进程B通信,前提是两者要看到同一份资源。进程A和进程B在自己的地址空间中都有自己的共享区。可以,其他进程也可以通信。
2024-02-07 05:17:46 348
原创 【Linux】基础IO ——文件(上)
文件= 内容+属性对应文件的操作,对内容的操作,对属性的操作当文件没有被操作的时候,一般在磁盘中当对文件进行操作的时候,一般在内存中,因为冯诺依曼体系规定当我们对文件进行操作的时候,文件需要提前加载到内存中,提前加载的是属性当我们对文件进行操作的时候,文件需要提前加载到内存中,不只有你在load,内存中一定存在大量的不同文件属性打开文件本质就是将需要的属性加载到内存中,OS内部一定会同时存在大量的被打开的文件,操作系统就会通过先描述,在组织的方式管理这些被打开的文件。
2024-02-07 05:07:25 334
原创 【Linux】进程的程序替换
编写极简版本的shell(bash)目标:为了深刻的理解shell的运行原理: mybash.c????buffers102464//在commandstr以空格作为分割符if(argv[0]==NULL)//切割失败return -1;int i=1;while(1)//继续切割空格break;i++;W>}int i=0;for(i=0;argv[i];(void)s;
2024-02-07 05:05:02 857
原创 【Linux】进程控制
写时拷贝本质是一种资源筛选,当子进程尝试去修改子进程要用的空间,才进行分配.是一种按需所取资源的策略。崩溃的本质:进程因为某些原因,导致进程收到来自操作系统的信号。操作系统不允许浪费或者不高效的行为出现的。正常执行分为 结果正确, 结果不正确。供用户进行进程退出健康状态的判定。正确就返回0,不正确就返回非0。
2024-02-07 04:56:56 352
原创 【Linux】孤儿进程 | 环境变量 | 命令行参数 | 进程优先级
目录1. 孤儿进程2. 环境变量3 . 命令行参数4. 进程优先级1. 孤儿进程正常来说,若父子进程中子进程结束,父进程要接收子进程的退出码结果,所以子进程处于僵尸状态但是 父子进程中父进程结束,为什么父进程没有进入僵尸状态呢?如果父子进程中父进程先退出,而子进程没退出,子进程在父进程退出后,要被1号进程领养,1号进程称为操作系统,而被领养的进程称为孤儿进程如果不领养,子进程后续退出,就无人回收了2. 环境变量在操作系统当中由系统在开机之后帮我们维护的一些系统运行时的动态参数我们自己写的代码
2024-02-03 23:15:19 310
原创 【Linux】进程状态
阻塞:阻塞就是不被调度一定是因为当前进程等待某种资源就绪一定是进程task_struct结构体需要在某种操作系统管理的资源下进行排队。
2024-02-03 22:20:16 953
原创 静态库和动态库
链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码地址到自己的可执行程序中。链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到自己的可执行程序中。动态库:因为可以被共享,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间。静态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序就无法运行。静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行。动态库为专门让编译器,对用户的程序进行动态链接。静态库为专门让编译器,对用户的程序进行静态链接。
2024-02-03 18:37:30 349
原创 Linux项目自动化构建工具-make/makefile
退出vim,使用make后,会自动在当前目录下查找对应的makefile文件,再去执行内置好的gcc命令。clean目标文件中含有.PHONY,clean即可称为伪目标 而mytest目标文件中不含有。说明makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译工具。使用 touch makefile 创建一个makefile文件。.PHONY : 代表总是被执行的,被修饰的称之为伪目标。mytest作为目标文件,test.c作为依赖文件列表。使用test.c形成mytest,两者称之为依赖关系。
2024-02-03 10:25:52 394
原创 linux权限
第三个6对应other, 以二进制表示为: 110 读为真,写为真,执行为假。第三个7对应other, 以二进制表示为: 111 读为真,写为真,执行为真。第二个6对应所属组,以二进制表示为: 110 读为真,写为真,执行为假。第二个0对应所属组,以二进制表示为: 000 读为假,写为假,执行为假。第一个7对应拥有者,以二进制表示为: 111 读为真,写为真,执行为真。第二个7对应所属组,以二进制表示为: 111 读为真,写为真,执行为真。输入 su +普通用户名。输入root用户密码。
2024-02-03 10:19:55 315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人