- 博客(72)
- 资源 (3)
- 收藏
- 关注
原创 面向对象设计之套路——设计模式
面向对象的分析设计编程思想,通过封装、继承、多态把程序的耦合度降低,用设计模式使得程序更加灵活,容易修改,并且易于复用。让业务逻辑与界面逻辑分开,让它们的耦合度下降,只有分离,才可以达到容易维护和扩展。没有什么设计模式是完美无缺的,一个设计模式应是解决一类的问题,通常设计模式在解决一类问题的同时,还会带来别的问题,我们设计者要做的事,就是要扬长避短,充分发挥长处。
2024-05-10 10:32:54
478
原创 Linux编程6.3 线程及并发控制-互斥锁、读写锁
主要特性:写独占,读共享。但是是读写是互斥的,即任意时刻,读与读不互斥,但读写互斥。一个线程从锁中获取上锁条件,此时若锁已经上锁,则阻塞,若未上锁,则上锁之后执行解锁,将上锁条件解锁掉。要求填满整个缓存区后才进行I/O系统调用操作,对于磁盘文件通常使用全缓存访问。标准错误流stderr通常量不带缓存区的,这使得错误信息能够尽快地显示出来。,当有多个线程同时访问同一资源时,就需要使用互斥机制进行控制。涉及一个终端时,(例如标准输入和标准输出),使用行缓存。读写锁,与互斥量类似,但读写锁允许并行性。
2024-04-02 17:10:29
290
原创 Linux编程6.1 线程及并发控制-线程与进程
线程与进程非常像:进程=线程*n(n>=1)+资源线程:执行单元->运行 就绪 阻塞 线程状态多线程,一个进程中,有多个线程在运行->虚拟内存不是镜像,而是共享。
2024-03-25 17:06:46
590
原创 Linux编程5 信号量
多个程序同时访问一个共享资源一般是不允许的,为了避开这个事件而引发的一系列问题,我们需要一种方式,通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。进程在进程 p操作的时候,对应的信号量进行“量”的加操作。
2024-03-25 16:28:10
413
原创 Linux编程4.12 网络编程-高级编程
3)、在使用select函数之前,首先使用FD_ZERO和FD_SET来初始化文件描述符集,并使用select函数时,可循环使用FD_ISSET测试描述符集,在执行完成对应的文件描述符后,使用FD_CLR来清除描述符集。④select函数,在监听套按字的时候,根据传参的fd_set判断,需要监听哪些套接字,比如第n位为1,则n会被监听,若m位为0,则m不监听。②select函数中,若timeval时间到,则被唤醒,timeval若为NULL,则没有时间,永久阻塞,等待套接字准备状态。
2024-03-20 17:29:56
1064
原创 Linux编程4.11 网络编程-广播
每一个套接字有一个发送缓冲区和接收缓冲区,这两个缓冲区由底层协议使用,接收缓冲区存放由协议接收的数据直到应用程序读走,发送缓冲区存放应用写出的数据直到被协议发送出去。控制着UDP套接字是否能够发送广播数据报,选项的数据类型为int,非零意味着“是”,注意,只有UDP套接字可以使用这个选项,TCP是不能使用广播的。受限广播地址:{-1,-1,-1}或255.255.255.255.路由器从不转发目的地址255.255.255.255.的IP数据报。全部子网广播地址:{netID,-1,-1}。
2024-03-20 16:49:57
422
原创 Linux编程4.9 网络编程-建立连接
使用系统提供的IO多路复用函数(select、poll、epoll),要求内核挂起进程,会有一个线程不断去轮询监控多个文件描述符的状态,只有在一个或多个I/O事件发生后,才将控制返回给应用程序,真正调用实际的IO读写操作。多线程服务器是对多进程服务器的改进,由于进程在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。据统计,创建线程与创建进程要快 10100 倍,所以又把线程称为“轻量级”进程。2.3 I/O多路转换。
2024-03-19 16:03:22
366
原创 Linux编程4.6 网络编程-绑定套接字(bind)
函数功能:主要的过程是调用bind函数将socket和地址(包括ip、port)进行绑定。
2024-03-15 17:08:40
536
原创 Linux编程4.5 网络编程-套接字(Socket)
Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段。Linux中的网络编程通过Socket接口实现,Socket既是一种特殊的IO,提供对应的文件描述符。一个完整的Socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每一个Socket有一个本地的唯一Socket,由操作系统分配。
2024-03-14 17:05:23
401
原创 Linux编程4.4 网络编程-通信架构
TCP客户端服务器编程模型1、客户端调用序列调用socket函数创建套接字调用connect连接服务器端调用I/O函数(read/write)与服务器端通讯调用close关闭套接字2、服务器端调用序列调用socket函数创建套接字调用bind绑定本地地址和端口调用listen启动监听调用accept从已连接列队中提取客户连接调用I/O函数(read/write)与客户端通讯调用close关闭套接字3、大致的函数调用流程
2024-03-14 16:02:56
705
原创 Linux编程4.3 网络编程-数据封装
1、数据封装2、Internet协议(IP)IP的主要目的是为数据输入/输出网络提供基本算法,为高层协议提供无连接的传送服务。这意味着在IP将数据递交给接收站点以前不在传输站点和接收站点之间建立对话(虚拟链路)。它只是封装和传递数据,但不向发送者或接收者报告包的状态,不处理所遇到的故障。 IP协议有以下四个主要功能 数据传送 寻址 路由选择 数据报文的分段 IP协议不注意包内的数据类型,它所知道的一切是必须将某些称为IP帧头的控制协议回到高层协议(TCP或者UDP)所接受的
2024-03-13 17:17:21
658
2
原创 Linux编程4.2 网络编程-协议
它负责在源主机和目的主机之间传输来自其较高层软件的称为数据报文的数据块,它在源和目的地之间提供非连接型传递服务。ICMP(网络控制信息协议Internet Control Message Protocol)处理IP的状态信息,比如能影响路由决策的数据错误或改变。RIP(路由信息协议Routing Information Protocol)它是几个决定信息传输的最佳路由路线协议中的一个。ARP实际上不是网络层部分,它处于IP和数据链路层之间,它是在32位IP地址和48位局域网物理地址之间执行释放的协议。
2024-03-13 15:59:15
1070
原创 Linux编程4.1 网络编程-前导
由于,跨计算机的进程间通信,通过电信/移动等网络节点,因此,数据通信不稳定。单服务与多客户端的进程间通信C/S client server。
2024-03-12 16:28:28
547
原创 Linux编程3.7 进程-进程间通信
5、管道文件不是普通文件,管道的缓存在内核中,不在硬盘里,断开连接缓存清除。4、当建立连接之后,再断开一端连接,另一端不阻塞,再建立连接则回复阻塞。2、两边打开建立连接,否则阻塞等待连接。1、半双工通信,一边读,一边写。
2024-03-12 15:24:58
338
原创 Linux编程3.5 进程-进程创建
父进程创建一个子进程后,文件表项中的引用计数器加1变成2,当父进程作close操作后,计数器减1,子进程还是可以使用文件表项,只有当计数器为0时才会释放文件表项。两次返回的区别是:在子进程中返回值是0,而在父进程中的返回值则是新子进程的进程ID。用户信息和权限、目录信息、信号信息、环境、共享存储段、资源限制、堆、栈和数据段,共享代码段。子进程只继承父进程的文件描述表,不继承但共享文件表项和i-node。创建子进程,但子进程先运行且不复制父进程的内存空间。进程ID、锁信息、运行时间、未决信号。
2024-03-07 16:34:42
496
原创 Linux编程3.3 进程-进程的终止
内核中,会产生或监听若干信号,若一个进程,监听了一个信号,则当发生该信号时,此进程会将当前进度暂停。3. signal信号回收->当子进程结束,内核会发射SIGCHLD信号到对应的父进程中。通常可以查看到:进程的ID、进程的用户ID、进程状态和进程的Command。登记的多个终止函数执行顺序是以栈的方式执行,先登记的后执行。进程的NICE值,数值大,表示较少占用CPU时间。每个启动的进程都默认登记了一个标准的终止函数。终止函数在进程终止时释放进程所占用的一些资源。7.2、ps输出的信息;
2024-03-06 16:04:59
1090
原创 Linux编程3.2 进程-C程序启动过程
进程ID(PID)为1的进程,被称为init进程或init系统,它是系统的第一个进程,由内核在系统引导后创建。③从 MBR 指示,找到 GRUB 所在分区,加载 GRUB 显示菜单。系统初始化、进程管理、运行级别切换、孤儿进程处理。① BIOS 启动,完成自检,选择启动硬件。④加载 Linux 内核到内存中。②如果是磁盘系统读取 MBR。⑤执行 INIT 程序。1、内核启动特殊例程。
2024-03-06 15:41:36
311
原创 Linux编程3.1 进程-进程的概念
进程:程序运行,由操作系统内核对该程序进行资源的分配 ,子进程会拷贝父进和的资源,拷贝的结果为副本。进程中,再创建另外的进程,两个进程父子关系。2、子进程的资源,由父里进程负责回收。1、父子进程之间,可以使用匿名管道。
2024-03-04 16:57:54
441
原创 Linux编程 2.5 文件和目录-管道文件
管道是一种两个进程间进行单向通信的机制。管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。管道又分为匿名管道和命名管道。管道有如下(1)其本质是一个伪文件(实为内核缓冲区)(2) 由两个文件描述符引用,一个表示读端,一个表示写端。(3) 规定数据从管道的写端流入管道,从读端流出。(1)只能进行单向通信;(2)只适用于有血缘关系之间的进程;(3)自带同步基质;(4)在进行通信时面向字节流服务;(5)生命进程随周期。
2024-03-04 15:40:37
903
原创 Linux编程 2.4 文件和目录-Linux文件系统结构
硬链接没有自己的i节点,没有自己的单独的数据,只是指向i节点。软链接不能创建数据区域,但有自己的i节点,来指向文件。对于文件,remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。存放文件系统本身的结构信息。节点包含数据块的列表。存放i-节点信息列表。
2024-03-01 16:50:47
431
原创 Linux编程 2.3 文件和目录-文件权限
struct stat *buf : 文件属性结构体变量的地址。const char *path : 文件名(含路径)
2024-03-01 15:30:00
324
原创 Linux编程 1.3 系统文件IO- 内核表示
如果请求的I/O操作阻塞,且他不是真正阻塞I/O,而且让其中的一个函数等待,在这期间,I/O还能进行其他操作。在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回。当请求的I/O操作不能完成时,则不让进程休眠,而且返回一个错误。在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。复制文件描述符,新的文件新的文件描述符作为函数返回值返回。1)、阻塞I/O模型。
2024-02-26 15:49:05
882
原创 Linux编程 1.1 系统文件IO-调用概述
这些不带缓存的函数都是内核提供的系统调用。它们不是ANSI C的组成部份,是POSIX的组成部分。遵守ISO标准,基于流的I/O,对文件指针(FILE结构体)进行操作。兼容POSIX标准,基于文件描述符的I/O,对文件描述符进行操作。
2024-02-24 16:26:41
369
原创 C#中foreach Linq AsParallel三者在查找数据中的奇妙现象
当数据量为:2^10。当数据量为:2^20。当数据量为:2^25。当数据量为:2^28。
2023-11-18 11:00:37
89
原创 C++ 知识总结提高问题
这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。(1)当存在类继承并且析构函数中有必须要进行的操作时(如需要释放某些资源,或执行特定的函数)析构函数需要是虚函数,否则若使用父类指针指向子类对象,在delete时只会调用父类的析构函数,而不能调用子类的析构函数,从而造成内存泄露或达不到预期结果;类的静态成员属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;
2023-07-16 15:59:27
80
原创 C++ 知识点基础问题
信号槽完全独立于标准的C/c++语言,因此要正确的处理好信号和槽,必须借助于一个成为MOC(Metal Object Compiler)的Qt的工具,MOC工具是一个C++预处理程序,能为高层次的事件处理自动生成所需要的的附加代码。在c++中空类会占一个字节,这是上为了让对象的实例能够相互区别,具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。在运行时,可以通过指向指针,来调用实现派生类中的方法。
2023-07-16 15:55:45
85
原创 C++学习总结 知识点总结
类的非静态成员函数,非静态成员函数的调用,必须通过该类具体对象+访问运算符进行调用,无法直接全局调用。私有、受保护:不可以直接通过对象全局访问,但是可以在类的成员函数内部,通过this指针访问。公开成员:可以直接通过对象全局访问,也可以在类的成员函数内部,通过this指针访问。引用:变量的别名,当引用变量a,绑定实际变量b之后,对a所有的操作,即对b操作。具体调用,是在创建具体对象时,根据其初始化参数,自动匹配并调用的。公开,私有,受保护,对类的成员进行修饰,成员的访问权限发生变化。
2023-07-16 15:51:31
75
原创 C++学习总结Part1.6 面向对象之内联函数
内联函数是指用inline关键字修饰的成员函数或非成员函数。内联函数具有函数的结构,而在编译后,却不具有函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。
2023-07-16 15:47:08
52
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人