一、通信方式分类 在当前的网络通信中有三种通信模式:单播、广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点。
单播:单台主机与单台主机之间的通信
广播:当台主机与网络中的所有主机通信
多播:当台主机与选定的一组主机的通信
二、单播单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样。如果一个人对另外一个人说话,
那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。
1. 单播的优点:
(1)服务器以及响应客户端的请求;
(2)服务器能针对每个客户端的不同请求发送不同的响应,容易显示个性化服务;
2. 单播的缺点:
服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负;
3. 应用场景:
单播在网络中得到了广泛的应用,网络上绝大部分的数据都 是以单播的形式传输的。例如:收发电子邮件、游览网页时,必须与邮件服务器、网站服务器建立连接,此时使用的就是单播通信方式;
三、广播“广播”可以比方为:一个人通过广播喇叭对在场的全体说话(他才不管你是否乐意 ...
半年前,我写了《计算机是如何启动的?》,探讨BIOS和主引导记录的作用。
那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。
这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。
我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。
第一步、加载内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
以我的电脑为例,/boot 目录下面大概是这样一些文件:
1234567891011121314 $ ls /boot config-3.2.0-3-amd64 config-3.2.0-4-amd64 grub initrd.img-3.2.0-3-amd64 initrd.img-3.2.0-4-amd64 System.map-3.2.0- ...
MySQL在5.6版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事物是谁产生,产生多少事物,非常直接的标识出来。
今天将讨论一下 关于从库show slave status 中的Retrieved_Gtid_Set 和 Executed_Gtid_Set.
Retrieved_Gtid_Set : 从库已经接收到主库的事务编号
Executed_Gtid_Set : 从库自身已经执行的事务编号
下面将解释这两列的含义:
首先看看master和slave的server-uuid
Master:
[root@localhost][db1]> show variables like '%uuid%';
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------- ...
redis
未读本篇博客我们就来详细介绍Redis中五大数据类型的底层实现。
1、演示数据类型的实现 上篇博客我们在介绍 key 相关命令的时候,介绍了如下命令:
1OBJECT ENCODING key
该命令是用来显示那五大数据类型的底层数据结构。
比如对于 string 数据类型:
我们可以看到实现string数据类型的数据结构有 embstr 以及 int。
再比如 list 数据类型:
这里我们就不做过多的演示了,那么上次出现的 embstr 以及 int 还有 quicklist 是什么数据结构呢?下面我们就来介绍Redis中几种主要的数据结构。
2、简单动态字符串 第一篇文章我们就说过 Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。
SDS 定义:
123456789struct sdshdr{ ...
dict,又称字典(dictionary)或映射(map),是集合的一种;这种集合中每个元素都是KV键值对。字典dict在各编程语言中都有体现,面向对象的编程语言如C++、Java中都称其为Map。
Redis的KV存储结构Redis内存数据库,最底层是一个redisDb;
redisDb 整体使用 dict字典 来存储键值对KV;字典中的每一项,使用dictEntry ,代表KV键值;类似于HashMap中的键值对Entry。
why dict/map?dict是一种用于维护key和value映射关系的数据结构,与很多编程语言中的Map类似。为什么dict/map 这么受欢迎呢?因为dict/map实现了key和value的映射,通过key查询value是效率非常高的操作,时间复杂度是O(C),C是常数,在没有冲突/碰撞的情况下,可以达到O(1)。
dict本质上是为了解决算法中的查找问题(Searching),一般查找问题的解法分为两个大类:一个是基于各种平衡树,一个是基于哈希表。
平衡树,如二叉搜索树、红黑树,使用的是“二分思想”;如果需要实 ...
redis
未读源码版本:redis-4.0.1源码位置:
adlist.h : listNode、list数据结构定义。
adlist.c:函数功能实现。
一、adlist简介Redis中的链表叫adlist(A generic doubly linked list implementation 一个通用的双端链表实现),和普通单链表相比,它的方向可以向前或者向后,这是由于数据结构中定义了next和prev两个指针决定的,下面看下它的数据结构实现。
二、数据结构定义123456789101112131415typedef struct listNode { struct listNode *next; //next指针,指向下一个元素 struct listNode *prev; //prev指针,指向上一个元素 void *value; //void *类型的数据域} listNode;typedef struct list { struct listNode *head; ...
Socket编程
目前较为流行的网络编程模型是客户机/服务器通信模式
客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1、A2和B2提供服务。
Socket概述
① 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
② Socket是连接运行在网络上的两个程序间的双向通信的端点。
③ 网络通讯其实指的就是Socket间的通讯。
④ 通讯的两端都有Socket,数据在两个Socket之间通过IO来进行传输。
套接字socket的类型
(1)流式套接字(SOCK_STREAM)
提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收(TCP协议)
(2)数据报式套接字(SOCK_DGRAM)
提供无连接服务,数据包以独立包形式发送,不提供无措保证,数据可能丢失,并且接收顺序混乱(UDP协议)
(3)原始套接字(SOCK_RAM)
套接字(so ...
Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。
本文介绍它的基本用法,分为上下两篇。今天介绍它的主要命令,下一篇介绍如何用于实战。
一、由来历史上,Linux 的启动一直采用init进程。
下面的命令用来启动服务。
12345$ sudo /etc/init.d/apache2 start# 或者$ service apache2 start
这种方法有两个缺点。
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
二、Systemd 概述Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。
(上图为 Systemd 作者 Lennart Poettering)
使用了 Systemd,就不需要再用init了。System ...
上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务。
一、开机启动对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。
如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。
123$ sudo systemctl enable httpd
上面的命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的httpd.service文件。
这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。
二、启动服务设置开机启动以后,软件并不会立即启动,必须等到下一次开机。如果想现在就运行该软件,那么要执行systemctl start命令。
123$ sudo systemctl start httpd
执行上面的命令以后,有可能启动失败,因此要用systemctl sta ...
8月份的午后,小满睡醒后,我带着她和往常一样来到家附近的小树林玩耍。找到她的好伙伴涵涵,俩孩子开心的在周边你追我赶。我见俩孩子挺开心,就坐在树下和一群老太太们聊天。
约莫半个多小时后,涵涵姥姥说,她俩拾了一块糖分吃了,我一听火就不打一出来,一方面担心糖有问题,另一方面觉得那么大的孩子,捡东西吃,不能被理解。于是,我把小满拉过来,一边问她一边打她屁股,越打越来气。小满也知道自己错了,不像以前那样嚎啕着哭,一直说”以后不这样了,妈妈我错了“。我当时就跟中了邪一样,控制不住一直重复问她,为什么捡糖吃,在家东西别说掉在地上,就是掉沙发上她都会说,我是小孩不能吃。
回到家,我对小满说,说说吧,为什么捡糖吃。她却说,今天累了,明天再谈。感觉不像4岁孩子的说话语气。我说,以后家里再也没有糖了,你也不允许再吃糖。她很硬气的说,不吃就不吃。我越问越没底气,觉得自己已经被小满打败,但是出于一个大人的面子,还得继续坚持下去。把家里的糖及巧克力都丢进了垃圾桶,小满一直在边上哭着说,不吃了,以后都不吃了。以前觉得4岁是知道吃喝玩乐,天真无邪的年纪,但是此刻发现,我错了。看着她那小大人似的的样子,我不停的自我反思 ...

