- 博客(9)
- 问答 (1)
- 收藏
- 关注
原创 Java内部类
内部类与组合是完全不同的概念。组合:A a;内部类:class A{};初次看内部类有什么用处,感觉内部类就是把A的实现嵌套在B中,不能单独创建A,仅此而已。不然,内部类还有其他的用途,当生成一个内部类的对象时,此对象与制造她的外围对象之间就有一种联系,她能访问外围对象的所有成员,比如B中有一个private int i,A也能访问。可能会问这有什么用处呢?组合就做不到啊。那内部如何实现的呢?内部类对象会秘密捕获一个指向外围类对象的引用,细节Java编译器帮助实现。
2024-02-04 16:01:37
1034
1
转载 守护进程
在Unix系统中,用户通过终端登录系统后得到一个shell进程,这个终端成为shell进程的控制终端,进程中,控制终端是保存在PCB中的信息,而fork()会复制PCB中的信息,因此由shell进程启动的其他进程的控制终端也是这个终端。进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树。如果调用进程非组长进程,那么就能创建一个新会话:该进程变成新会话的首进程,该进程成为一个新进程组的组长进程,该进程没有控制终端,如果之前有,则会被中断(会话过程对控制终端的独占性)
2024-02-02 21:17:53
70
原创 mysql Table ‘performance_schema.data.locks‘ doesn‘t exist问题
解决mysql Table 'performance_schema.data.locks' doesn't exist问题
2023-06-11 10:37:32
2499
1
原创 C++双检查锁reorder
不过也带来问题,就是reorder问题,主要是由于编译器优化带来的问题,比如在进行instance = new singleton()的时候,我们期望的是三步:先为instance分配内存,然后调用singleton()方法构造,最后将这个实例地址给到内存。然而编译器优化会将2,3部顺序调换,先分配内存,然后先将地址分给内存,这是如果其他进程进来,就会return一个不可访问的地址,产生严重的错误,而且这个出现的频率还蛮高,有时间研究一下。那么到此单线程是没有问题的,但是多线程就会出事,那么就需要加锁。
2023-05-22 23:08:06
596
2
原创 C++动态绑定
首先B创建对象b,A创建对象a,并通过b赋值,那么a调用func2(),输出结果是:A的虚函数2,这其实跟动态绑定没用任何关系,因为A只是通过b强制转换成A的类型,然后进行拷贝赋值,甚至光看A,跟继承都没任何关系。这就引出了动态绑定的概念,只有指针+虚函数才可以实现,学过编译原理的应该直到,C++编译器编译阶段它只处理了第一层,而这个属于第二层,而对于普通函数来说,他是静态绑定,汇编里他是被call调用的,是写死的,动态绑定是运行是才确定的,是通过(*(pa->vptr)[n]) (pa)来调用的。
2023-05-09 13:08:13
188
原创 背包问题动态规划
1.01背包问题,有N件物品,背包容量为V,第i件物品占容量c[i],价值是w[i],求装入哪些物品背包的价值最大?每个物品只能放一次或零次。动态规划思想很简单解决,用一个数组f[i][v]来表示前i件物品,容量为v的最大价值,那么推出转移方程f[i][v] = max(f[i - 1][v],f[i-1][v - c[i] ] + w[i]),然后以i...N,0...V循环即可,时间复杂度O(n2)。那么其实空间复杂度可以在优化,因为f[i][v]可能是由f[i-1][v],f[i-2][v]...
2023-05-07 15:16:58
224
1
原创 从Linux内核角度理解信号信号集
工作过程:可以把终端看成进程A,需要中断的进程看成进程B,内核调度进程A使用CPU,进程A通过用户的输入Ctrl+C,内核调度进程B使用CPU,对应于进程B的SIGINT信号产生,并进入B的未决信号集,存储在第二个标志位上,为1,表示需要被处理,然后和阻塞信号集比较,如果此信号处于阻塞状态,信号继续处于未决信号状态,直到解除阻塞,信号被处理,标志位改为0。Linux的体系结构大致可分为两部分,上面是用户(或应用程序)空间,由用户应用程序和C库组成,下面是内核空间,由系统调用,内核和平台架构相关代码组成。
2023-03-13 13:17:55
124
原创 Linux fork()函数
对,但是只拷贝pid这一小部分栈空间,fork()后,父子进程的虚拟地址空间相同,但每个进程的页表不同,即映射后的物理地址空间不同,写数据的时候,产生冲突,产生缺页中断,页表中添加新的页表项,开辟新的物理地址。这里的写时拷贝是对父子进程的用户区来说的,只有改变用户区的数据才会进行写时拷贝,而对系统文件修改并不会进行写时拷贝,比如说管道通信,父子进程通过读入共享的内核区的文件描述符指向的文件描述表中的文件的位置,通过这个位置对文件进行修改,并不会写时拷贝,因为并没有写入内存产生缺页中断。
2023-03-09 23:55:04
217
原创 STL仿函数
函数指针的缺点就是他无法持有自己的状态(局部状态),也无法达到组件技术的可适配性,也就是无法再将某些修饰条件加诸于上而使其改变。C++的STL算法接受所谓的“条件”,“策略”,或“一整组操作”,都以仿函数的形式呈现。仿函数就是用起来像函数的东西。仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。针对某个class进行operator()重载,他就成为一个仿函数。这样是可以的,但要是B想加入一些判定的阈值当作参数传入,就不行了,如。
2023-03-07 09:44:18
181
空空如也
PAT甲级1003第345测试点都不通过,求帮助
2021-06-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人