- 博客(12)
- 收藏
- 关注
原创 用JavaSocket编程开发聊天室
1. 用Java图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。2. 可以实现群聊(聊天记录显示在所有客户端界面)。3. 完成好友列表在各个客户端上显示。4. 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。5. 服务器能够群发系统消息,能够强行让某些用户下线。6. 客户端的上线下线要求能够在其他客户端上面实时刷新。
2024-06-05 10:47:23 192
原创 初步了解Kubernetes(k8s)及其工作原理
k8s是介于和之间的中间层,通过策略,协调和管理多个应用服务,只需要一个yaml文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还可以实现服务器的自动重启,自动扩缩容。
2024-05-16 11:42:00 361
原创 MIT 6.5840(原6.824)个人实现记录
终于来到了最难的lab3,我做的是2024 版,新增了一个KVServer为lab2,原来的raft就变成lab3了Raft是一种基于日志复制的一致性算法,比paxos更加简单易学且易于实现具体的论文细节就不赘述了,网上有很多写的很好的总结,本文主要记录我的个人实现过程和细节lab3A是实现leader的选举。
2024-04-29 11:37:06 445
原创 MySQL数据库引擎、事务详解
支持事务ACID,也就是支持事务完整性、一致性innoDB支持行级锁,行级锁可以在最大程度上支持并发,允许在同一时刻对表的进行并发修改,而且不会相互阻塞InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显式在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键InnoDB支持崩溃数据自修复。InnoDB存储引擎中就是依靠redo log(重做日志)来保证的。
2024-04-14 23:21:50 450 1
原创 C++与计算机网络面经
水平触发 (Level-Triggered, LT):边缘触发 (Edge-Triggered, ET):Reactor是一种基于事件驱动的设计模式,用于构建高效的并发系统,有以下几个核心组件移动构造函数可以在C++中的引入是为了提高程序的性能和效率。当需要通过值传递对象时,常规的拷贝构造函数会进行深拷贝操作,将原对象赋值到新对象中。但是在某些情况下,这种深拷贝操作可能会产生不必要的开销,特别是对于大型对象或者含有资源管理(例如动态内存分配)的对象移动构造函数允许在没有复制数据的情况下,将资源从一个对象“
2024-04-09 15:30:48 589
原创 计算机网络之输入网址按下回车之后发生了什么
TCP通过在TCP数据段首部的窗口字段中填入当前设定的接收窗口(即通知窗口)的大小,用来告知对方'我放当前的接收窗口的大小',以实现流量控制。把解析的结果返回给本地电脑,本地电脑根据TTL值缓存在本地系统缓存中,域名解析过程结束在实际的DNS解析过程中,可能还不止这10步,如Name Server可能有很多级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析过程。本地DNS服务器返回给浏览器对应的IP和TTL值,本地DNS服务器会缓存在这个域名和IP的对应关系,缓存时间由TTL的值控制。
2024-04-08 11:11:38 678
原创 SQL的基础操作(入门)
WHERE Websites.id=access_log.site_id and Websites.name="菜鸟教程";BETWEEN 操作符选取介于两个值之间的数据范围内的值。在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。WHERE a.site_id=w.id and w.name="菜鸟教程";SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。SELECT TOP 子句用于规定要返回的记录的数目。SQL 通配符用于搜索表中的数据。
2024-04-02 20:55:46 426 1
原创 C++项目TinyWebServer学习记录(上)
基础知识RAII全称Resource Acquisition is Initialization 资源获取即初始化在构造函数中申请分配资源,在析构函数中释放资源。在RAII的指导下,我们需要使用类来管理资源,将资源和对象生命周期绑定RAII的核心思想是将资源或者状态与对象的生命周期绑定,通过C++构造函数和析构函数的语言机制,实现资源和状态的安全管理,智能指针就是RAII最好的例子信号量机制信号量是一种特殊的变量,只能取自然数,只支持两种操作:P、V操作,假设有信号量SV。
2024-04-02 11:04:08 593 1
原创 C++线程池学习
当一个线程被标记为可分离时,该线程的资源(如堆栈和线程描述符)在退出时可以自动被系统回收,而不需要等待其他线程使用。当线程池收到一个新任务时,将其加入任务队列。如果不希望用户使用线程池的时候都需要自己定义job并添加到任务队列,job这种私密的关于内部实现的代码页不希望被看到,所以封装一层面向用户的添加任务函数。很明显线程池中需要两把锁,控制对任务队列操作的互斥锁,当任务队列有新任务时唤醒worker的条件锁。通过管理线程并发数量,线程池有助于减少线程之间的竞争,增加资源利用率,提高程序运行的性能。
2024-04-01 10:39:50 774
原创 文件系统和设备管理
不会的,因为进程在执行write(使用缓冲IO)系统调用的时候,实际上是将文件数据写到了内核的page cache,它是文件系统中用于缓存文件数据的缓冲,所以即使进程崩溃了,文件数据还是保留在内核的page cache,读数据时,也是从page cache读取,因此还是依然读的进程崩溃前写入的数据。索引节点,用来记录文件的元信息,包括inode编号,文件大小,访问权限,创建时间,修改时间,数据在磁盘的位置等。索引节点是文件的唯一标识,他们之间一一对应,都会被存储在硬盘中,所以索引节点同样占用磁盘空间。
2024-03-28 14:30:28 797
原创 进程调度/内存页面置换
只有磁头朝某个特定方向移动时,才处理磁道访问请求,而返回时直接快速移动至最靠边缘的磁道,也就是复位磁头,这个过程是很快的,返回过程中不处理任何请求,该算法的特点,就是磁道只响应一个方向上的请求。解决办法:定期减少访问的次数,比如发生时间中断时,把过去时间访问的页面的访问次数除以2,即随着时间的流逝,以前高访问次数的页面会慢慢减少,增大被置换的概率。新的进程会被放入第一级队列二末尾,按先来先服务的原则排队等待被调度,如果在第一梯队规定的时间片没运行完成,则将其转入第二级队列的末尾,以此类推。
2024-03-28 14:21:52 821
原创 操作系统个人学习笔记
记录型信号量中value表示剩余资源数,对信号量进行一次P操作,意味着进程请求一个单位的该类型资源,需要对value--,当value<0表示该类型资源已经分配完毕,此时调用block原语进行自我阻塞,该机制遵循了让权等待。最短剩余时间优先算法,抢占式,每当有新进程加入就绪队列改变时就需要调度,如果新达到的进程剩余时间比当前运行的进程剩余时间更短,则抢占,当一个进程完成时也如此做。优先换出阻塞进程,可换出优先级低的进程,为了防止优先级低的进程被反复调入换出,有的系统考虑了进程在内存的驻留时间。
2024-03-28 14:13:30 709 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人