- 博客(28)
- 收藏
- 关注
原创 网络Socket编程基于TCP协议模拟简易网络通信
// 创建socket文件描述符(TCP/UDP 服务器/客户端)int socket(int domain, int type, int protocol);成功:返回一个非负整数,即新创建的套接字文件描述符。失败:返回-1,并设置以指示错误类型。:指定通信域(地址族)。它定义了套接字将使用的地址类型。常见的值包括::IPv4网络协议。:IPv6网络协议。 或 :Unix域套接字,用于同一台机器上的进程间通信。:用于访问数据链路层。:指定套接字类型,它定义了套接字提供哪种类型的通信。常见的值包括::提
2025-04-10 14:31:44
336
原创 <设计模式>单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例。这种模式在需要严格控制类的实例数量时非常有用,比如在系统中需要一个共享资源(如配置文件、日志记录器、数据库连接池等)时。
2025-03-31 04:02:41
385
原创 <Linux>线程池
池化技术的核心思想是。就像你提前从银行取了一部分钱放在支付宝里,这样需要用钱时就不用每次都跑银行排队了。线程池就是一种典型的池化技术,它提前创建好一批线程,当任务来临时,直接从线程池中分配线程执行任务,避免了每次任务都创建和销毁线程的开销。:线程池在启动时会预先创建一定数量的线程,这些线程处于空闲状态,等待任务。:当任务提交到线程池时,线程池会将任务分配给空闲线程执行。:如果线程池中的线程都在忙,新任务会被放入任务队列中排队等待。
2025-03-31 03:26:57
1034
原创 生产者消费者模型
互斥、同步 不只能通过 互斥锁、条件变量 实现,还能通过 信号量 sem、互斥锁 实现(出自 POSIX 标准)。「信号量」 的本质就是一个 计数器。
2025-03-30 18:41:48
575
原创 线程同步与互斥
互斥锁是一种资源,一种线程依赖的资源,因此 [初始化互斥锁] 操作应该在线程创建之前完成,[销毁互斥锁] 操作应该在线程运行结束后执行;总结就是 使用前先创建,使用后需销毁对于多线程来说,应该让他们看到同一把锁,否则就没有意义不能重复销毁互斥锁,已经销毁的互斥锁不能再使用。
2025-03-12 22:43:07
871
原创 <进程间通信>管道
场景:父进程创建了一批子进程,并通过多条匿名管道与它们链接,父进程选择某个子进程,并通过匿名管道与子进程通信,并下达指定的任务让其执行。
2025-03-03 17:16:32
1038
原创 软硬链接与动静态库
简单来说:库是一些可重定向的二进制文件,这些文件在链接时可以与其他的可重定向的二进制文件一起链接形成可执行程序。一般来说库被分为静态库和动态库,他们是有不同的后缀来进行区分的。系统平台静态库动态库Windows.lib.dllLinux.a.so对于C/C++来说其库的名称也是有规范要求的,例如在Linux下:一般要求是lib + 库的真实名称 +(版本号)+ .so /.a + (版本号),版本号是可以省略不写的。
2025-03-03 14:56:14
999
原创 <操作系统>文件系统
文件分为内存文件和磁盘文件。磁盘文件,这是一个特殊的存在,因为它不属于冯诺依曼体系,而是位于专门的存储设备中,因此磁盘文件存在的意义是将文件更好的存储起来,以便后续对文件进行访问。文件系统是操作系统中负责管理持久数据的子系统,简单点就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。
2025-03-02 11:05:06
952
原创 文件操作与重定向
在FILE是C库提供给我们的一个结构体,里面的缓冲区对应的是用户态的缓冲区,Linux内核中的缓冲区对应的是内核态的缓冲区现象:直接运行和重定向后的结果是不同的,而且fprintf会比write多一次打印。
2025-02-28 22:54:44
989
原创 文件理解和操作
files_struct之中包含了一个指针数组struct file* fd_array[],我们打开文件时,操作系统会在指针数组struct file* fd_array[]中从前往后遍历,找到当前没有被使用的最小一个下标,作为新的文件描述符,并把该下标的指针指向新打开的文件对象file,最后向上层返回该下标。既然是文件,那么在Linux下进行文件操作必须要有文件描述符,那么我们C程序(以及其他编程语言写的程序)默认打开的三个流,也要有文件描述符,只有有了文件描述符我们系统才能找到对应的文件。
2025-02-28 19:21:11
759
原创 进程地址空间
当进程需要访问内存时,操作系统会通过PCB中的内存管理信息来查找对应的物理内存地址,并检查访问权限等信息,以确保内存访问的安全性和正确性。2、将内存申请与内存使用的概念在时间上划分清楚,通过虚拟地址空间来屏蔽底层申请内存的过程,达到进程读写内存和操作系统管理操作进行软件层面上的分离目的,让应用和内存管理解耦。1.父子进程有着各自的mm_struct,其成员起始值是一致的,对于同一个变量,如果并未进行改写,那么俩者的的虚拟地址将会通过页表+MMU转换后指向同一块物理空间。
2025-02-27 22:13:08
561
原创 进程PCB状态
需要先了解一下知识点:使用ps命令查看进程信息,进程状态后面带+的是前台进程,没有+的是后台进程。在运行程序时最后加一个&就会变为后台进程前台进程可以用ctrl+c杀掉,并且运行时不能运行其他进程。后台进程不能用ctrl+C杀掉,只能使用kill命令杀掉,进程运行时还可以运行其他进程。前台进程只能存在一个在运行,而后台进程可以同时运行多个(可以是不同的代码和数据的进程)目前主要使用编号为9(杀死进程),18(继续进程),19(暂停进程)
2025-02-27 21:51:35
923
原创 <操作系统>进程PCB
Linux下又称为task_struct,是Linux内核的一种数据结构,它会被装载到RAM(内存)中,并且包含着进程的信息,这个结构体存在next、prev指针,可以使用双向链表把进程链接起来。
2025-02-27 20:47:12
668
原创 <动态规划> 斐波那契数列模型、路径问题、简单多状态dp问题
实际上是从下或者从右,它是加上方格的健康点,因此我们从上或者从左走,与其相反,所以我们是减去健康点,因为dp[i][j]=dp[i-1][j]+dungen[i-1][j]或者dp[i][j]=dp[i][j-1]+dungen[i][j-1];因此,我们的反方向求值就是:dp[i][j]=dp[i+1][j]-dungen[i][j]或者dp[i][j]=dp[i][j+1]-dungen[i][j];此时的最大利润为: g[i - 1][j] - prices[i]次,处于「买入」状态,第。
2024-11-11 22:15:33
591
原创 进程的替换
进程替换是一种在计算机操作系统中,通过特定的系统调用(如exec系列函数)实现的进程执行内容的改变过程。进程替换的本质是将当前进程的用户空间代码和数据全部替换为另一个程序的内容,而进程的标识符(PID)保持不变。execl相当于将链式信息转化为argv表,供execve参数2使用execlp相当于在 PATH中找到目标路径信息后,传给execve参数1使用execle的envp最终也是传给execve中的参数3替换函数除了能替换为C++编写的程序外,还能替换为其他语言编写的程序,如Java。
2024-11-05 13:26:49
1206
原创 环境变量与本地变量
一般指的是在操作系统上运行环境的一些参数。我们在编写C/C++代码时,在链接的时候,用户并不知道所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关的环境变量去帮助编译器去查找。环境变量通常具有某些特殊用途,在系统当中具有全局属性。
2024-11-04 16:28:08
941
原创 双指针算法
283. 移动零 - 力扣(LeetCode)思路:代码:题目二:复写零1089. 复写零 - 力扣(LeetCode)思路:代码:题目三:快乐数202. 快乐数 - 力扣(LeetCode)思路:通过鸽巢原理可以得知,这是一个闭环的,这是因为整数类型int的正向取值范围是:12^31-1,也就是说,当经过足够多次循环,最多也就是2^31-1次数后,必定会出现一个环,而此时可以使用快慢指针去获取这个环相遇的数字代码:题目四:盛最多水容器11. 盛最多水的容器 - 力扣(L
2024-11-04 11:41:39
573
原创 LINUX-进程等待
当子进程退出时,OS会把退出码填写到 exit_code 中,把退出信号填写到 exit_signal 中,并维护子进程的 task_struct ,此时子进程的状态就是僵尸状态。否则,操作系统会根据该参数,将子进程的状态,即子进程的信号+退出码,反馈给父进程。,非阻塞式等待的时候,如果子进程没有退出,也没有被阻塞,那么父进程就可以做其他事。默认情况下,在子进程没有退出的时候,父进程只能一直在调用 wait 或 waitpid 进行等待,我们称之为。证在时序上,子进程先退出,父进程后退出。
2024-11-01 08:46:22
891
原创 进程监控与进程终止
1、PCB存在的意义:“先描述再组织”,操作系统要进行软硬件的资源管理,就必须对资源进先描述,再组织。而PCB就是用来描述2、创建进程:创建进程就是把新增的task_struct,添加到进程双向链表中3、删除进程:在进程链表中删除对应的task_struct,并把其申请的空间进行释放运行代码获取当前进程PID(getpid()),以及父进程PID(getppid())
2024-10-31 19:03:21
639
原创 进程PCB状态
分析现象:当我们运行程序时,确实会被CPU调度,进入CPU调度队列,但是,我们使用printf函数连接了外设显示器,使得printf函数向外打印信息,而外设并不是随时准备就绪的,也就是说进程在执行printf函数时,需要在外设结构体队列中排队等待,当外设资源准备就绪时,该进程才能被CPU调度,变成R状态,其他时间都是阻塞状态,S状态就是阻塞状态。而事实上,D状态的进程一般是不会出现的,一旦出现就说明磁盘的空间已经非常极限了,存储速度非常慢了,需要力保写入数据的进程活着完成任务,长时间内不能被OS杀死。
2024-10-25 09:17:47
649
原创 进程地址空间
当进程需要访问内存时,操作系统会通过PCB中的内存管理信息来查找对应的物理内存地址,并检查访问权限等信息,以确保内存访问的安全性和正确性。2、将内存申请与内存使用的概念在时间上划分清楚,通过虚拟地址空间来屏蔽底层申请内存的过程,达到进程读写内存和操作系统管理操作进行软件层面上的分离目的,让应用和内存管理解耦。1.父子进程有着各自的mm_struct,其成员起始值是一致的,对于同一个变量,如果并未进行改写,那么俩者的的虚拟地址将会通过页表+MMU转换后指向同一块物理空间。
2024-10-22 17:43:36
724
原创 进程PCB
代码编译链接二进制文件运行该程序就是把文件的代码和数据从磁盘中加载到内存管理内存中的数据,就需要遵循"先描述再组织"原则链表节点的形式存储在内核。
2024-10-21 10:28:14
680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人