- 博客(91)
- 资源 (5)
- 收藏
- 关注
原创 【Linux】多进程服务器模型(第十九篇)
定义:多进程服务器模型通过创建多个进程来提供服务,每个进程都可以独立地处理客户端的请求。工作原理父进程创建一个套接字,并与服务器的IP地址和端口号进行绑定。父进程开始监听来自客户端的连接请求。当有客户端请求连接时,父进程通过accept()函数接收连接,并创建一个新的套接字用于与客户端通信。父进程调用fork()函数创建一个子进程,该子进程是父进程的副本,包括代码、数据和状态等信息。子进程关闭从父进程中复制下来的监听套接字,然后与客户端进行通信。
2024-10-10 09:44:48 455
原创 【Linux】线程池(第十八篇)
首先,定义一个任务结构体和任务执行函数。void *arg;} task_t;free(task);2. 创建线程池实现一个线程池管理器,管理线程和任务队列。// 等待任务// 检查是否停止break;// 取出任务// 执行任务if (task!= NULL) {// 初始化线程池...// 添加任务到线程池...// 销毁线程池...3. 初始化和销毁线程池初始化线程池时,你需要创建多个线程,并初始化互斥锁和条件变量。
2024-09-20 14:42:19 646
原创 【Linux】线程同步(第十七篇)
多线程模型中,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。在man里面可以查询到线程同步的相关函数。
2024-09-20 14:04:20 1062
原创 【Linux】线程(第十六篇)
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。ubuntu线程为LWP(轻量级进程)线程id 为tidlwp 为 线程编号查看线程的命令ps -eLf 查看系统中所有的线程ps -Lf pid 查看指定进程里的线程线程与进程的区别线程与进程的差异:相比于进程而言,线程体积更小更轻量(进程是最小的分配资源的单位,线程是最小的调度单位)进程创建时,内核对进程进行初始化并分配资源(内核)线程寄存于进程中,与进程共享资源,线程隶属于进程的一部分。
2024-09-20 13:59:59 867
原创 【Linux】信号(第十五篇)
信号集为未决态信号,未决集对应码要置成1,当通过屏蔽字后,信号转为递达态,未决集中对应位置回0 .信号集每位对应一个信号,位码为0表示信号可传递, 1 表示不可传递 .信号尝试通过屏蔽字,但对应位码为1,那么信号被阻塞屏蔽,无法递达(即屏蔽行为) .某信号尝试通过未决信号集,但是对应的位码为1,那么该信号直接丢弃,不做处理 .信号通过未决信号集,没有被处理掉前,未决信号集对应位,置1 .未决信号集,由内核设置与翻转,用户只能读不能设置与修改, 屏蔽字用户可以自由设定,用于自定义阻塞屏蔽某个信号。
2024-09-05 17:08:02 1060
原创 【Linux】进程间通信(IPC)(第十四篇)
进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。1.进程间通信的应用场景数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
2024-09-05 14:28:46 1532
原创 【Linux】进程间的关系(第十三篇)
setpgid(pid_t pid,pid_t pgid) 转移进程,将pid的进程转到pgid的组,转移的组必须存在 (注意:创建进程组,使用pid 申请pgid,传参时两个参数相等) 父进程默认为进程组组长,无法使用setpgid进行组创建,子进程和非组长进程可以。无论进程组如何变动,亲缘关系始终保持不变,父进程一定要对子进程进行回收操作(无论子进程组情况如何复杂)多个进程间可能存在亲缘关系(多个进程间可能是父子进程结构,也可能更为复杂的层级亲缘结构)示例:略(子进程申请进程组)示例:略(一父多子)
2024-09-04 09:40:14 1068
原创 【Linux】孤儿进程(第十二篇)
孤儿进程指的是在其父进程执行完成或被终止后,仍继续运行的一类进程。这些进程由于失去了父进程的监控和管理,因此被称为“孤儿”。
2024-09-04 09:35:26 1056
原创 【Linux】僵尸进程(第十一篇)
这份代码子进程通子进程先于父进程终止。这种内存泄漏由僵尸进程导致的(残留的子进程PCB)【思考:为什么会残留】 exit里面调用_exit() 进程结束时负责释放进程资源 将0-3G都释放,内核空间释放部分PCB残留此为僵尸进程。除非父进程通过wait回收僵尸进程。
2024-09-03 09:14:58 1187
原创 【Linux】自定义子进程(第十篇)
2,带 p 的exec函数:execlp,execvp,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。1,带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。4,带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程。
2024-09-03 09:11:32 569
原创 【Linux】进程(第九篇)
进程是操作系统进行资源分配的最小单位,而内存是进程运行必不可少的资源。那么,为什么需要内存呢?CPU 太快,但其数据容量极小且功能单一,而其他 I/O 等硬件功能多样,只是相对于 CPU 来说它们又太慢,所以便需要内存在 CPU 与 I/O 设备间进行缓冲。现代操作系统均支持多任务,操作系统一般会为每个进程分配独享的内存空间,这个独享的内存空间只是在进程自己看来是独享的,实际上其只是操作系统为其分配的虚拟内存空间,虚拟内存在真正被使用时才映射到物理内存上。
2024-09-02 09:14:39 1214
原创 【Linux】Makefile项目管理工具(第八篇)
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了哪些文件需要编译,哪些文件不需要编译,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
2024-08-30 09:34:12 1838
原创 【Linux】GDB调试(第七篇)
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
2024-08-30 08:48:26 1054
原创 【Linux】系统管理(第六篇)
在不同的 Linux 发行版上,ps 命令的语法各不相同,为此,Linux 采取了一个折中的方法,即融合各种不同的风格,兼顾那些已经习惯了其它系统上使用 ps 命令的用户。killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
2024-08-29 14:47:13 1036
原创 【Linux】Linux权限管理详解(第五篇)
也就是说,后 3 位数字 "022" 才是本节真正要用到的 umask 权限值,将其转变为字母形式为 ----w--w-。例如,若 umask 默认权限的值为 033,按照数字形式计算文件的初始权限,666-033=633,但我们按照字母的形式计算会得到 (rw-rw-rw-) - (----wx-wx) = (rw-r--r--),换算成数字形式是 644。把两个字母权限相减,得到 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--),这就是新建文件的初始权限。
2024-08-29 14:23:16 981
原创 【Linux】用户和用户组管理(第四篇)
用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机来讲问题不大,但在服务器上是行不通的。大家想象一下,我们是一个管理团队,共同维护一组服务器,难道每个人都能够被赋予管理员权限吗?
2024-08-29 13:43:27 932
原创 【Linux】VIM编辑器(第三篇)
使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用 ":起始行,终止行 s/^/#/g",例如:表示在第 1~10 行行首加"#"注释。"^"意为行首;"g"表示执行替换时不询问确认。如果希望每行交互询问是否执行,则可将 "g" 改为 "c"。
2024-08-29 13:27:26 1173
原创 【Linux】基本命令(第二篇)
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下:TERM=xterm......
2024-08-27 14:22:33 1104
原创 【Linux】快速入门(第一篇)
Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,所以 Linux 模仿了 UNIX(但并没有抄袭 UNIX 的源码),使得 Linux 在外观和交互上与 UNIX 非常类似。说模仿可能会被人喷,你也可以说微创新或者改进。相比于 UNIX,Linux 最大的创新是开源免费,这是它能够蓬勃发展的最重要原因;而目前的 UNIX 大部分都是收费的,小公司和个人都难以承受。
2024-08-27 13:54:57 880
原创 【MySQL】Qt远程链接MySQL(第五篇)
建立一个mysql.priINCLUDEPATH 存放的是Mysql的系统安装路径中mysql.h所在的目录LIBS 存放的是Mysql的引入库文件然后将libmysql.dll 放入C:/windows/System32 下CMysql.hCMysql.cpp。
2024-08-21 17:07:45 231
原创 【MySQL】基础入门(第四篇)
获取两个表中字段匹配关系的记录。获取左表所有记录,即使右表没有对应匹配的记录。与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。MySQL INNER JOIN 取得两个表得交集部分。INNER JOIN以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 runoob_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 runoob_author 字段值。
2024-08-21 16:56:59 889
原创 【MySQL】基础入门(第三篇)
第一范式要求数据库表的每一列都是不可分割的基本数据项,即每个字段都是原子性的,不能再进行拆分。同一列中不能有多个值,也不能有重复的属性。比如说:想要记录学生的信息:id,姓名,电话号码以及备用号码。
2024-08-21 14:40:17 953
原创 【MySQL】基础入门(第二篇)
MySQL 支持所有标准 SQL 数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
2024-08-20 20:39:05 873
原创 【MySQL】基础入门(第一篇)
MySQL是一个关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,后来被Sun Microsystems收购,最终在2010年被Oracle公司收购。MySQL是目前全球最受欢迎的开源关系型数据库管理系统之一,广泛应用于各种规模的应用系统中,从小型网站到大型企业级应用。
2024-08-20 20:20:13 957
原创 【网络】IO多路复用之IOCP
IOCP(Input/Output Completion Ports,输入输出完成端口)是Windows操作系统中一种高效的网络和文件I/O处理机制。它允许应用程序以异步方式处理多个I/O操作,同时能够减少线程的使用和提高系统的可扩展性。
2024-08-13 19:58:27 1115
原创 【网络】IO多路复用模型之事件选择模型(第八篇)
事件选择模型(Event Select Model)是Windows网络编程中一种重要的异步IO模型,它允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知。与select模型相比,事件选择模型在处理大量连接时具有更高的效率和更好的性能。
2024-08-13 19:53:41 792
原创 【网络】IO多路复用模型select
Select是IO多路复用模型的一种实现方式,它通过单个线程监视多个文件描述符的状态变化,并在就绪时进行相应的读写操作。虽然存在文件描述符限制和性能问题,但在连接数不是特别多的情况下,它仍然是一种有效的解决方案。
2024-08-13 19:34:42 903
原创 【网络】TCP拥塞窗口(第六篇)
拥塞窗口(Congestion Window,简称cwnd)是TCP协议中用于防止网络拥塞的一种重要机制。它是在发送端采用的一种“拥塞避免”算法和“慢速启动”算法相结合的机制,用于控制发送端向网络中注入的数据量,从而避免网络拥塞。以下是关于拥塞窗口的详细解释:定义与作用定义:拥塞窗口是TCP发送端维护的一个可滑动窗口,用于控制发送端在任何时候可以发送的最大字节数。它的大小取决于网络的拥塞程度,并动态变化。 作用:防止网络拥塞,通过调整发送速率来适应网络状况,确保网络的平稳运行。工作原理拥塞窗
2024-08-13 19:27:11 1688 1
原创 【网络】TCP滑动窗口概述(第五篇)
定义:滑动窗口是TCP协议中的一种流量控制技术,通过维护一个动态变化的窗口来允许发送方在无需等待每个数据段确认的情况下连续发送多个数据段,从而提高数据传输效率。作用流量控制:接收方通过调整接收窗口的大小来控制发送方的发送速率,确保发送的数据量不会超过接收方的处理能力,防止接收方缓冲区溢出。拥塞控制:虽然滑动窗口本身不直接进行拥塞控制,但它与拥塞控制机制(如慢启动、拥塞避免、快速重传等)相结合,共同维护网络的稳定性和效率。
2024-08-09 17:19:44 960
原创 【网络】TCP协议(第四篇)
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,并广泛应用于互联网中。TCP的主要目的是在不可靠的网络环境中提供可靠的、有序的数据传输服务。面向连接:TCP通信双方在进行数据传输之前,必须先通过三次握手(Three-way Handshake)建立连接。这种连接是全双工的,即双方都可以同时发送和接收数据。可靠性。
2024-08-06 11:44:19 1037
原创 【网络】IP协议
IP 是互联网协议的核心,它定义了数据包如何在互联网中的各个网络之间传输。IP 地址是分配给连接到互联网上的每个设备的唯一数字标识,用于在数据通信中识别源和目标设备。IPv4 是目前广泛使用的版本,它使用32位(4字节)地址,理论上可以支持约43亿个设备。然而,随着物联网(IoT)的发展,设备数量急剧增加,IPv4 地址空间已经接近耗尽,因此 IPv6 被开发出来,它使用128位(16字节)地址,可以支持几乎无限数量的设备。
2024-08-04 11:33:32 616
原创 【网络】UDP协议创建流程详解(第三篇)
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它基于IP协议,提供了一种将数据包发送到网络上的方式。函数是网络编程中的一个基本且关键的函数,它用于创建一个新的套接字(socket)。函数是网络编程中的一个重要函数,特别是在使用UDP协议进行通信时。函数在多种编程语言中都有对应的实现,但最基础和广泛使用的是在C语言中的定义,它也被许多其他语言通过标准库或扩展库间接支持。函数是网络编程中用于向指定的目的地址发送数据报的函数,特别是在使用UDP协议时非常常见。
2024-08-02 08:54:32 1829
原创 【网络】基于UDP协议的聊天室(第二篇)
在C++中,使用UDP协议进行网络通信通常涉及到socket编程。下面我将给出基于UDP的简单的客户端和服务器示例代码。这些示例将使用C++标准库以及POSIX套接字接口(主要适用于Linux和类Unix系统)。如果你在使用Windows,可能需要使用Winsock库,但这里我们主要关注POSIX接口。
2024-08-01 16:09:30 447
原创 【网络】网络入门(第一篇)
网络的传输过程是一个从应用层到物理层逐层封装数据,并通过网络进行传输,最终在目标设备逐层解封装数据的过程。这一过程遵循TCP/IP模型的层次结构,确保了数据的可靠传输和高效处理。同时,DNS解析、路由选择、MAC寻址等机制在传输过程中发挥着重要作用,保证了数据能够准确、快速地到达目标设备。
2024-08-01 09:18:59 669
原创 【Windows】库(第十篇)
定义:静态库是预先编译好的代码集合,以文件形式存在(如.a在Unix-like系统,.lib在Windows系统中),在编译时将库中的代码复制到可执行文件中。特点静态链接:在编译时将库中的代码与程序的其他部分一起链接,生成可执行文件。代码复制:库中的代码会被完整地复制到可执行文件中,因此最终的可执行文件体积可能会较大。无需运行时加载:由于代码已经包含在可执行文件中,因此程序运行时不需要再加载库文件。定义:动态库是一种包含可执行代码和数据的文件,它在程序运行时被加载到内存中,供程序调用。特点。
2024-07-31 08:59:13 636
原创 【Windows】操作系统死锁之银行家算法
银行家算法(Banker's Algorithm)是一种经典的死锁避免算法,由计算机科学家艾兹格·迪杰斯特拉(Edsger Dijkstra)在1965年为T.H.E系统设计。该算法以银行借贷系统的分配策略为基础,主要用于操作系统中的资源分配,确保系统能够安全地进行资源分配和释放,避免因资源分配不当而导致的死锁。
2024-07-29 18:21:43 773
原创 【Windows】操作系统之死锁(第九篇)
对于a图的状态,按照安全序列的要求,我们选的第一个客户应满足该客户所需的贷款小于等于银行家当前所剩余的钱款,可以看出只有C2客户能被满足:C2客户需1个资金单位,小银行家手中的2个资金单位,于是银行家把1个资金单位借给C2客户,使之完成工作并归还所借的3个资金单位的钱,进入b图。第五步:进程P1运行完后,释放其所占有的资源(2个A资源和1个B资源),系统回收这些资源后,空闲的资源便变成2个A资源和1个B资源,由于进程P2一直在申请一个A资源,所以此时,系统能满足它的申请。系统死锁,可利用资源分配图来描述。
2024-07-29 08:33:46 656
原创 【Windows】操作系统之线程池(第八篇)
线程池在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程是指用于执行任务的线程,而任务则是指实现了Runnable或Callable接口的实例对象。线程池通过复用现有的线程来减少线程创建和销毁的开销,从而提高系统的运行效率。
2024-07-29 08:20:27 1012
原创 【Windows】操作系统之线程同步(第六篇)
线程同步是多线程编程中的一项重要技术,它确保了多线程环境下数据的一致性和程序的正确执行。通过合理的线程同步机制,可以避免竞态条件、死锁等问题,提高程序的稳定性和性能。在实现线程同步时,需要根据具体的应用场景选择合适的同步方法,并遵循良好的编程实践来确保程序的正确性和可维护性。练习题答案:a的最小值是2,最大值是200。
2024-07-28 10:19:36 736
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人