我们都知道计算机是只认识0和1的,但是不同的机器对于这种0和1信息的识别也是不一样的,例如有的设备对于0和1信息的识别
要完成网络编程首先要理解原IP和目的IP,这在上一节已经说明了。也就是一台主机要进行通信必须要具有原IP和目的IP地址。
通过上面的代码我们已经知道了客户端和服务端能够使用read和write从网络中获取信息。IO类的函数,write/read在底层已经做了转网络序列的工作下一
要完成网络编程首先要理解原IP和目的IP,这在上一节已经说明了。也就是一台主机要进行通信必须要具有原IP和目的IP地址。端口号首先要知道进行网络通信的目的是要将信息从A主机送到B主机吗?很显然不仅仅是。例如唐僧要去到西天取真经,让唐僧去到西天取真经的请求不是唐僧发的,而是太宗发的。响应也不是唐僧去响应的,是如来佛祖响应的。所以取西经的本质就是太宗和如来佛祖之间进行的数据通信。所以唐僧从A机器来去到
以下是网络部分整体的学习路线:网络的发展历程因为人与人之间是需要合作去完成一些任务的,这也就意味着计算器之间也是需要互相"沟通"的。因为计算机也是人所使用的工具,人都需要互相协作,也就注定了计算机也是需要互相协作的。假设现在有三个人,现在三个人都需要一份资料,在早前想要将这份资料拷贝到这三个人的计算机中,就需要一个软盘一样的东西,去拷贝资料,在分别放到这三个人的计算机上。后来就有了下面的进步:将三
线程池的代码可以写的很复杂,这里就稍微简单一些首先来看一下线程池的原则,下面的大框是服务器,而在服务器中维护一个任务队列。然后在server中预先创建一批线程,这批线程和任务队列合在一起只用向外界提供一个入队列的接口。未来如果任务队列中有任务,这批线程就去执行任务,如果没有任务这批线程就去阻塞。这个模式不就是一个生产消费模型吗?只不过这里没有提供生产者,而所有的线程都是消费者从一个共同的任务队列中
后面启动的进程都是由前面的进程带起来的,就以bash为例子,创建的bash就可以说是最早的进程了,你将bash关闭了,
在之前的学习种我们知道了在,多线程的情况下,对一个全局变量做++,并不是原子的。并且在之前的学习中,我们学习到了给临界区加锁,在之前的代码中我们使用的是一个全局的锁。并且为了保证锁能够保护临界区,所以这里首先就要保证申请锁是一个安全的行为。至于原理之后会说明。局部锁的初始化如果你定义的是一个局部的锁,要对锁进行初始化需要使用下面到的函数。依旧使用destroy来销毁锁。下面我们来修改一下我们上面写
在之前的学习中我们学习到了使用匿名和命名管道进行进程间的通信,下面我们再来使用一种新的方式进行进程间的通码的。但是我们在
在一个比较完善的服务运行过程中,肯定是会出现一些问题的,这些问题根据严重的程度不同我们的做法也是不一样的。
首先我们需要知道单例模式的作用是什么,单例模式也就是单实例,全局只有wei'y的作用是什么,单例模式也就是单实例, ,这个实例对象中究竟储存什么数据则都行,例如你希望什么数据是全局唯一的数据,你就可以将这个数据放到这个里面。内存池就可以考虑使用成为单例模式。既然是全局只有一份的资源,那么肯定要将构造函数限制了,因为限制了构造函数也就限制了普通的创建对象的方式。限制了构造函数也就意味着,无法从外部
在之前的学习中我们学习到了使用匿名和命名管道进行进程间的通信,下面我们再来使用一种新的方式进行进程间的通信。我们下面要学习的是system V版本的共享内存。首先我们要知道什么是system V首先我们要知道我们在之前学习的管道通信的代码并不是一个专门设计出来的模块,我们之前所学习的管道通信是复用了文件系统模块的代码的。但是我们在实际的使用场景上来说,只有一种通信方式是不够的。所以我们还是需要有其
首先我们要知道信号和信号量没有任何的关系。讲解信号我们会从下面的几个步骤开始讲解。信号的概念例如前一天晚上我们在手机上设置了一个闹钟,第二天早上闹钟响了,此时我们就知道我们应该起床了,这就是我们所说的信号的机制。由此我们就能知道在生活中的信号是存在很多种的。例如下面的这些:我们通过红绿灯来理解一下信号。首先就是你自己能够识别红绿灯,然后你知道对应的灯亮意味着什么你自己要做什么那么我们为什么能够认识
在上一篇的博客中我说明了一些关于管道的特征特点如下:其中对于3和4特征这里只需要知道即可,我会在后面的博客讲解
我们之前学习到的管道是没有名字的正因为没有没有名字所以最后选择的是让子进程继承父进程的方式来达到让父子进程看到同一份资源的方式。这也也就导致了匿名管道只能在具有血缘关系的进程进行进程间通信。但是我们需要进行进程间通信的场景并不是只有这一种的?如果是毫不相关的进程进行进程间通信呢?所以我们需要下一种通信方式:命名管道命名管道的使用首先我们就来了解创建命名管道的一个函数:mkfifo编辑从
在上一篇的博客中我说明了一些关于管道的特征特点如下:其中对于3和4特征这里只需要知道即可,我会在后面的博客讲解。然后我们测试了管道的前三种情况: 第一种:读写端正常,管道为空,读端就要阻塞. 第二种:读写端正常,管道如果被写满,写端就要阻塞 第三种:读端正常,写端关闭,那么读端就会读到0,表明读到了文件(pipe)结尾,但是此时的读端是不 会被阻塞的首先我们来检测管道的第四种情况
以下就是两个小点我们知道.o文件在形成可执行程序的时候,要么使用的是动态连接,要么使用的是静态连接,那么我们如何去看
管道进行进程间通信在posix和system V标准还没有出现的时候,进程间是如何进行通信的呢?这就要借助于我们今天学习的这个东西了。在进程间通信的标准没有出现之前,在os中就已经存在了文件了。而管道就是基于文件的一种进行进程间通信的方式。什么是管道首先一个文件是可以被一个进程打开并访问的,那么现在的问题是一个文件能否被多个进程打开并访问呢?如果能的话,那么这个文件不就是一个共享的空间吗?只要一个
下面我们就进入动静态库的过程。静态库的制作我们通过下面的步骤来理解动静态库。静态库不存在加载。下面我们制作一个简单的库。首先所有的静态库的名字一般都是libXXX.a而动态库的名字一般都是libYYYY.so。而和静态库相对存在一个叫做静态链接的东西,和动态库相对的还存在一个叫做动态链接的东西。而静态链接是指在编译时将程序所需要的库文件(如函数库)的代码全部复制到可执行文件中,使得可执行文件不再依
在这里我们首先学习两个新的知识点第一个:第二个:下面我们再来理解思考下面的四个问题:我们首先来解决第一个问题如果新建一个文件Linux系统会做什么呢?新建文件,系统会做什么当我们要新建一个文件的时候,我们肯定是在系统的一个文件路径下去新建的,这个路径能够帮助我们确定清楚这个文件是在哪一个分区中(C盘还是D盘还是其它盘),以及在哪一个分组(分组就是上一节说的800G被划分成了好几份,第一个200G就
这次博客我们将重点理解Ext2文件系统。首先我们要理解什么是文件系统。在之前我们一直理解的文件都是一个被打开的文件,而os为了能够管理这样的文件创建了struct_file这样的结构体对象在内核中描述被打开的文件,这个结构体对象中包含了被打开文件的基本属性,和绝大多数的属性(文件的大小,文件的偏移量,文件的权限,以及和内存块相关联的内容),包括对应的缓冲区。以上都是描述的被进程打开的文件的状态,那
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/
位图题目:第一种方法:二分查找。虽然二分的时间复杂度为o(log n),但是这个方法是不可行的,我们就算假设这40亿个数据是已经排序完成了的数据,但是40亿个整数在内存需要消耗的内存就是差不多16G,这个消耗是非常巨大的,并且这16个g还必须是连续的空间。(这里最大的问题就是内存很难开出这样巨大的空间),放到红黑树,和哈希表自然也是不可行的,因为这些还具有其它的消耗(红黑树,哈希表的结构
什么是哈希思想首先哈希是一个关联式容器,各个数据之间是具有关系的,和vector那些序列式容器不一样。首先unordered_map中的迭代器是一个单向的迭代器。其次在unorderede_map和set中是无序的(因为底层不是红黑树,而是哈希了)不再进行排序了。用法和set/map一样(除了不能使用--之外)。然后下面是对于map和unorder_ed map在性能上面的差异。总结:在存在很多个
exec系列接口中的环境变量在之前我们学习了exec系类函数的功能就是将一个程序替换成另外一个程序。然后就会出现下面的问题:首先父进程对应的环境变量的信息是从bash中来的,因为我们自己写的父进程在运行的时候首先就要成为bash的子进程。这里我们将bash称为祖父进程,我们自己写的父进程,和父进程创建的进程为孙子进程。这三位其实使用都是一套环境变量(bash的环境变量)。在这里我们在bash中导入
要学习红黑树节点的插入那么首先就要了解什么是红黑树,以及红黑树的特点。红黑树的特点本来AVL树已经很厉害了,但是红黑树的总体效率略比1AVL树高。高的大体原因。我们先来看一下红黑树和AVL树的区别。AVL树严格的保证了左子树和右子树的高度差不超过1,而红黑树则是保证了最长路径不超过最短路径的2倍。这里可以理解成AVL树是极其相似于一棵完全二叉树了,而红黑树则不是。所以如果这里存在100w个节点,那
AVL树的规则在学习AVL树插入节点的方式之前,我们首先要理解为什么要出现AVL树,首先我们要知道的是AVL树是在二叉搜索树的基础上增加一些限制条件才完成的。那么AVL树就是为了处理二叉搜索树的缺点而出现的一棵树,那么普通的二叉搜索树的缺点是什么呢?假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了
序列式容器和关联性容器首先序列式容器和我们之前学的线性表很相似,序列式容器的功能就只是单纯的储存数据。序列式容器例如:vactor/list/deque等等而关联式容器则并不单纯的储存数据,数据之间式存在关联关系的,有了这个关联关系我们才能更好地去做查找。关联式容器由map/set等等。两者的的区别,我要往map中插入一个数据,我能不能保证这个节点一定插在根节点的左子树上呢?很明显是不能的,而我想
这里我们引入一下:首先我们写一段会出现异常的代码:这里我们的代码除0错误会异常。此时编译运行一下会发现最后系统给我们报出了一个浮点数异。还有一种这里不能
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号