- 博客(21)
- 资源 (2)
- 收藏
- 关注
原创 linux中线程局部存储(TLS)
我们知道术语每个线程私有的数据包括线程的栈和当前的寄存器,但时这两种存储都是非常不可靠的,栈会在每个函数退出和进入的时候被改变;如果我们要在线程中使用一个全局变量,但希望这个全局变量时线程私有得,而不是所以线程共享得,该怎么办呢?TLS得用法很简单,如果要定义一个全局变量TLS类型得,只需要在它签名加上相应得关键字即可。一旦一个全局变量被定义成TLS类型得,那么每个线程都会拥有这个变量得一个副本,任何线程对该变量得修改都不会影响其他线程中该变量得副本。可见地址都不一样,线程之间相互不影响。
2023-11-25 22:42:12
465
原创 通过命令行来执行共享库里面的任意一个函数
这些信息是无法通过运行时加载获取得到的(很多高级语言如Java、.NET里面的反射功能可以实现运行时获得函数的额外信息,包括参数、返回值类型等),因为C/C++编译器在编译时并没有把这些信息保存到目标文件、可执行文件或者共享对象等,我们仅仅能获取得到时函数的地址。所以从这一点来看,C/C++的确不能被称为"高级"语言。这表示我们希望调用/usr/lib32/libm.so里面的sin函数,其中第一个参数时double类型的,参数值时1.74,最后一个字母d表示sin函数的返回值时double类型的。
2023-11-23 23:00:09
414
原创 linux TCP三次握手与四次挥手参数调优
tcp时一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号。tcp可以看成是一种字节流,它会处理丢包、重复以及错误的问题。在连接的建立过程中,双发需要交换一些连接的参数。tcp提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建议一个连接。采用四次挥手关闭一个连接。
2023-10-03 18:55:32
122
原创 linux系统高级问题分析
可是在子进程中持有哪个锁的线程消失了(参考1中的解释),从子进程的角度来看,这个锁被永久的上锁了,因为它的持有者“蒸发”了,所以如果子进程中的这个线程对这个已经被持有的锁进行lock操作的话,就会发生死锁。因为子进程地址空间创建的时候,得到了所有父进程定义的锁的副本,继承的是父进程的锁的拷贝。但是在有的系统中,条件变量的实现中包含了锁,这种情况就需要清理。子进程会继承其父进程的锁以及锁的状态,但是父子进程用的不是同一把锁,父进程解锁并不会影响到子进程的锁,即fork以后子进程和父进程使用的是两把锁。
2023-09-30 16:15:09
34
原创 常见的网络编程面试题目
LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。LT模式只要表现在,只要有数据没有被获取,内核就不断通知你,因此不用担心事件丢失的情况。- ET:边缘触发,效率非常高,在并发,大流量 的情况下,会比LT少很多epoll的系统调用,因此效率高。但是对编程要求高,需要细致的处理每个请求,否则容易发生丢失事件的情况。- 对于监听的socket,有新连接到达也是可读。- socket有错误发生,且pending。- 慢启动,拥塞避免、拥塞发生、快速恢复。- 接收缓冲区有数据,一定可读。
2023-09-27 14:53:08
44
原创 C++ 常见面试题
同时,由于构造函数本身也是一个函数,在函数体内抛出异常将导致当前函数运行的结束,并释放已经构造的成员对象,当然包含其基类的成员,要执行直接基类的和成员对象的析构函数。- 可以,用const和volatile同时修饰的变量,表示这个变量在程序内部是只读的,不能改变,只在程序外部条件变化下改变,并且编译器不会优化这个变量。每次使用这个变量时,都要小心地去内存读取这个变量的值,而不是去寄存器读取他的备份。define是宏定义,是预编译的部分,发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
2023-09-26 23:07:14
37
原创 C++设计模式之解释器模式
动机:在软件构建过程中,如果某一个特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。定义:给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。
2023-07-02 23:12:56
54
原创 C++设计模式之访问器模式
使用背景:在软件构建的过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有的设计。定义:表示一个作用于某个对象结构中的各元素的操作。使得可以在不改变各元素的类的前提下定义作用与这些元素的新操作。条件:要求Element的子类是确定的。头文件 visitor.h。
2023-07-02 19:03:38
91
原创 C++ 设计模式之组合模式
模式定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Compostie使得用户对单个对象和组合对象的使用具有一致性。
2023-07-02 10:53:07
54
原创 C++单例模式
但有些会分配内存之后,直接返回的指针复制,在调用构造函数,这样会在多线程模式下导致返回的对象没有调用构造函数,出现问题。这个模式当不考虑内存的reorder问题,是可以的,当出现内存reoder的问题,就不行了。有些编译器执行new操作的时候,正确的顺序是分配内存,调用构造函数,返回指针,2、多线程安全基础上,考虑内存reorder的版本。1、普通的多线程安全的版本。
2023-07-01 19:35:20
35
原创 ubuntu12.04 源 台湾的源
1、/etc/apt/sources.list 更换位如下内容deb http://tw.archive.ubuntu.com/ubuntu trusty main restricted universe multiversedeb http://tw.archive.ubuntu.com/ubuntu trusty-security main restricted universe multiversedeb http://tw.archive.ubuntu.com/ubuntu trusty
2021-08-17 17:10:39
207
原创 centos mysql修改密码
一修改配置文件1、 vim /etc/my.cnf2、 添加skip-grant-tables;如下图:3、重新mysql:sudo service mysqld restart登录mysql1、 mysql -uroot -p 2、输入密码登录3、use mysql;4、更新root用户信息,把密码设置为空字符串 update user set authentication_string='' where user='root';5、exit; 退出mysql6、vim /
2020-08-14 13:51:51
1083
原创 su和sudo的区别
linux中 su和sudo的区别su和sudo是两个常用的切换到root超级用户命令。功能上类似,但使用上还是有不少差异。sudo命令
2020-07-09 14:50:05
7919
原创 Centos7 内核源码编译 网桥 bridge模块
一、安装相应版本的内核源码1、查看系统版本2、Centos官网下载对应的源码#http://vault.centos.org/#wget http://vault.centos.org/7.8.2003/os/Source/SPackages/kernel-3.10.0-1127.el7.src.rpm3、用rpm 安装# rpm -ikernel-3.10.0-1127.el7.src.rpm如果提示:Warning: user mockbuild do..
2020-06-04 11:31:45
1410
原创 TCP缺点
a、TCP拥塞控制算法会在丢包的时候主动降低吞吐量b、TCP的三次握手增加了数据传输的延迟和额外开销c、TCP的累积应答机制导致了数据段的传输在弱网环境下,TCP的传输效率会大幅度下降,所以Goole的QUIC才是王道。...
2020-01-17 16:24:59
1210
原创 Ubuntu sudo apt-get install 安装错误
现象:无论 sudo apt-get install 安装什么应用出现下面输出解决办法:sudo apt-get --fix-broken install执行这条命令之后就可以了原因:可能是不小心删除了系统级应用,或者非正常停止apt-get install *...
2019-09-18 18:19:38
4308
2
原创 Linux常见命令分类
1、目录文件操作 mkdir:创建目录。 一般用法: mkdir path常用的选项 : -p mkdir /a/b/c 如果父目录不存在则创建父目录cp:复制文件,如果文件存在则覆盖。一般用法:cp file1 path常用的选项:-r cp path1 path2 复制整个目录path1 到目录path2中mv:移动文件或...
2019-09-11 17:44:53
125
原创 git使用
git工作流程我们的本地仓库由git维护的三颗树组成。第一个是我们的工作目录,它持有实际文件;第二个是缓存区,它像个缓存区域,临时保存我们的改动;最后是head,指向我们最近一次提交后的结果。添加和提交我们可以计划改动(把它们添加到缓存区),使用如下命令:git add filenamegit add *推送改动我们的改动现在已经在本地仓库的HEAD中了。...
2019-05-30 18:14:48
107
原创 postgresql 存储过程,统计数据库中各个表的数量
CREATE OR REPLACE FUNCTION totalRecords()RETURNS integer as $total$DECLAREtotal integer := 0;perCount integer := 0;result RECORD;name RECORD;tables varchar;getCount varchar;BEGINta...
2019-04-30 16:35:31
4620
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人