《CSAPP》笔记——系统级IO、网络编程、并发编程

news2024/11/18 4:21:49

文章目录

  • 传送门
  • 系统级IO
    • Unix输入和输出
      • Unix文件
      • Unix文件操作
    • Unix管理打开文件
      • 打开文件流程
      • 文件共享
      • 重定向文件
    • 标准IO
      • 标准IO流
      • 标准IO的缓冲机制
    • RIO(Robust IO)
    • 对比与总结
  • 网络编程
    • 历史
    • 从头构建互联网
      • 网络层次
        • 以太网段
        • 网桥连接的以太网段
        • 互联网
      • 网络协议
      • 互联网应用的软硬件组织
    • 互联网的程序员视图
      • IP地址
      • 域名系统(DNS,Domain Naming System)
      • 互联网通信
        • 基础
        • 连接过程
        • 套接字
        • 套接字编程——回声服务器架构
        • 套接字地址结构
  • 并发编程

传送门

此系列文章分为三篇,本文对应CSAPP的第三卷:程序间的交流与通信。现代程序不再是单纯的独立执行,而是要进行协作,这其中就涉及到了系统内通信,系统间通信,并发控制

第一卷:程序结构与执行——信息表示、指令、处理器、性能优化、储存层次
第二卷:在系统上运行程序——链接、异常控制流、虚拟内存
第三卷:程序间的交流与通信——系统级IO、网络编程、并发编程

系统级IO

Unix输入和输出

Unix系统中,接口分为三类:

  1. 基础:Unix系统级IO函数,只能通过系统调用访问
    • C语言标准IO:是系统IO的封装
    • RIO函数:是特殊封装的,具有健壮性的IO函数

在这里插入图片描述

Unix文件

Unix中文件具有高度的统一性:

  1. 文件:字节序列
    • 普通文件:分为文本文件和二进制文件。注意,内核不会区分这两种文件,需要程序员手动调用相对应的IO函数。
      • 文本文件以ASCII形式储存,以换行符分割
      • 二进制文件的字节不一定是ASCII,可以存放任何信息,包括文本
    • 目录:索引一组文件
      • 记录文件的索引。分软链接和硬链接
      • 目录至少有两个文件,分别是.和…
    • 套接字:用于网络通信
  2. 所有的IO,全部变成文件映像
  3. 甚至内核也可以是文件

文件的目录按照树状结构组织,通过路径名逐层访问。每个进程有一个cwd,即工作目录。

在这里插入图片描述

Unix文件操作

注意,Unix的文件操作都是系统调用。

  1. 打开open
    • 返回文件标识符
    • Linux shell打开的进程默认有三个打开文件,0,1,2对应stdin,stdout,stderr
  2. 关闭close
    • 重复关闭文件会在线程化的程序中导致灾难
  3. 读read
    • 读取若干字节到buf数组中
    • 没有自动处理不足值(比如EOF)的机制,不会报错,要小心使用
  4. 写write

不足值发生的情况:

  1. EOF
  2. 从中断读文本行
  3. 读写网络套接字

Unix管理打开文件

打开文件流程

Unix打开文件的流程如下:

  1. 每个进程都有一打开的文件表
    • 文件表里默认有0,1,2三个文件
    • 文件表描述符指向打开的文件。
  2. 文件描述符。
    • 文件描述符指向元数据。
    • 每一次open都可以生成一个打开的文件,但是多次打开一个文件,打开的文件都是指向同一个元数据的,元数据只能有一个。
  3. 元数据。文件都有元数据,元数据与文件一一对应,由内核维护。用户用stat和fstat函数访问。

在这里插入图片描述

文件共享

共享文件有两种方式:

  1. 平等进程之间共享:各自有一个打开的文件,指向同一个元数据。(上图)
  2. 父子进程之间共享:描述符表指向同一个打开的文件。(下图)

父子进程这种共享很合理,而且和父子进程资源独立并不冲突。虽然子进程复制了一份文件描述符表,但是指向的确是同样的位置,所以子进程其实只是复制了一份指针表,指向的空间还是共享的。

在这里插入图片描述

重定向文件

C编程中,常用freopen将txt文件的内容重定向到stdin里,取代手工输入。Linux中,通过dup函数实现重定向。

dup函数修改文件描述符表,dup(a,b)是将a写入到b中。
下图,调用dup(4,1)后,原来的1就被4覆盖。

在这里插入图片描述

举个例子。下图中,进程打开了三次文件,生成三个打开文件,此时三个文件指针都指向文件开头互不干扰。之后,使用dup(fd2,fd3),则将fd3覆盖为fd2,此时,原来的fd3和fd2同时指向一个打开文件,相当于公用一个文件指针了。

读取fd1,输出a
读取fd2,fd3,其实都是在读取fd2,所以输出ab。

在这里插入图片描述
下图展示了父子进程的文件共享。可以看到,父子进程指向的空间是公用的。s的不同会导致父子进程其中一个休眠。

  1. 如果s=1,则子进程先读,父进程后读取
  2. 如果s=0,则父进程先读,子进程后读取。

因为两个进程是共享文件的,所以三次读取,一定是abc。

在这里插入图片描述

标准IO

在这里插入图片描述

标准IO流

标准IO打开的文件都称作流(stream)。这是文件描述符和内存缓冲区的抽象。

(此处是我的个人理解:IO流和Unix有什么区别呢?Unix读取是读取到char数组中的,而C语言IO流默认输入就是字节的形式,不去管你怎么编码的,就顺着读。那怎么知道要读多少呢,读的又是什么东西?通过fscanf和fprintf的格式控制符来实现即可。所以,流读写比Unix的IO更加方便,形式多样)

同Unix一样,C程序也会有默认的打开文件,分别是stdin,stdout,stderr,但是这三个文件已经是流了。

标准IO的缓冲机制

标准IO的基础是Unix的IO,也就是说,即使你只用一个getc函数读取一个字符,你也是进行了一次系统调用。系统调用要消耗1w个时钟周期,是非常费时的。反而是系统调用以后的IO比较快。所以,为了加速,应该尽可能减少系统调用的次数。

标准IO采用缓冲机制,读的时候,先一次性读取一个比较大的字节块到IO缓冲区,然后用户输入再从缓冲区读你想要的东西。当缓冲区没有的时候,再进行Unix系统调用读取一个字节块。

在这里插入图片描述
写的时候,也是先写到IO缓冲区,最后一次性输出。可以使用fflush手动刷新缓冲区,当然,在碰到"\n"的时候也会自动刷新。
在大一的时候,写C语言会碰到各种读写的问题,很多都是缓冲区在作祟,比如缓冲区里剩下一个换行符,你得手动刷新才不影响下次读取。

在这里插入图片描述

RIO(Robust IO)

RIO是一组特殊封装的IO函数。与Unix的读写类似,但是具有高度的健壮性,特别适合从网络套接字读取文本行。

对比与总结

Unix IO:

  1. 优点:
    • 通用,额外开销最低
    • 是其他IO的基础
    • 底层:可以访问元数据
    • 安全:可以用于异步信号处理
  2. 缺点:
    • 太原始,没有自动处理不足值的机制,也没有自动缓冲的机制

标准IO:

  1. 优点:
    • 高效:通过缓冲区技术减少系统调用次数
    • 省心:自动处理不足值
  2. 缺点:
    • 封装:不能访问元数据
    • 危险:异步情况下不安全,不能用于信号处理程序

三种IO各有千秋,要根据情况进行选自:

  1. 一般情况:标准IO,但是要理解标准IO的底层原理,比如IO缓冲区
  2. Unix IO
    • 信号处理程序
    • 需要极限的性能
  3. RIO
    • 网络套接字(注意,标准IO不适用于网络套接字,其流格式与网络套接字冲突)

网络编程

历史

最开始是ARPA,这是互联网的前身。ARPA中有IMP,通过简单的网络协议通信。后来发展到了大学之间的组网。此后发展非常迅速,很快遍布全球。

在这里插入图片描述

当节点数量够多的时候,僵尸网络就出现了。有人被不知不觉中控制,成为肉鸡,用于实行ddos攻击。

网络不是凭空传递的,无论是最开始还是现在,通过线缆是最稳定的方法,所以现在世界上有大量的海底线缆。

在这里插入图片描述

客户-服务器事务。

这个就是我们当时写C++大作业,做简化版QQ的时候,用的通讯模型。

主机和客户可以在一台电脑上。

在这里插入图片描述

硬件是网络的基础,而网络还是依附于原有的计算机架构的。

注意,适配器其实就是网卡,挂在计算机总线上。(我自己装的台式机,主板上用PCIE-x1总线就可以接网卡)

在这里插入图片描述

网络,本质上就是若干节点之间通过电线链接。这种链接是分层的,比如我家里几台设备连到一个路由器上,然后这个路由器挂到网线上,我家里的设备就是更底层的。按照层次来说,有如下级别:

  1. LAN(局域网,local area network),这种网络可以跨越建筑物,校园
    • 以太网(Ethernet)是经典的网络,校园网就是以太网
  2. WAN(广域网,wide area network),遍布全国,全世界
    • 通常是高速点对点链路(光纤)

在LAN和WAN之间,其实还有不同的层级,但是都类似。

从头构建互联网

网络层次

以太网段

以太网是房间,楼层级别的。

多个主机,通过集线器,链接到一个hub上,一个hub用一个port标识。

线缆速度不高,但是对一台机器来说够用,也有100Mb/s了。

每一个以太网适配器(对应一台主机上的网卡)都有一个唯一的mac地址。

在这里插入图片描述

在这里插入图片描述

主机以帧为单位向其他主机发送bit,一个主机向集线器发送,其他所有主机都可以看到。

集线器是过时的东西。现在是通过网桥(交换机、路由器)来链接的。

网桥连接的以太网段

hub可以覆盖的距离非常短,通常就是一个房间。后面出现了网桥连接(此时是交换机),就可以跨越房间,楼层,建筑物了。

集线器不具有选择性,发出去都可以收到。而网桥具有选择性:

  1. 在发送的时候,网桥会网信息中打上标记,表明是从哪里来,到哪里去
  2. 另一个网桥接收的时候,解析出到哪里去的信息,发送给某个hub

在这里插入图片描述

互联网

前面的以太网和桥接网络都是局域网,为了便于描述,局域网都用下面这种模式描述:一根线上面搭了若干主机。

在这里插入图片描述

局域网之间通过广域网链接。

不同的局域网,往往并不兼容,所以在局域网之间的交换设备要更加复杂,即路由器:

在这里插入图片描述

到了路由这一层,网络的链接关系就比较混乱了,也就是所谓的自组织互联,实际上就是没有固定的拓扑结构,广域网通信要通过若干个节点多次跳转。

因此,从一个局域网通过广域网发送到另一个局域网的路径是多种多样的,如何选择最优的道路(路由),是很多人研究的课题。

在这里插入图片描述

网络协议

局域网和广域网之间互不兼容,如何发送信息,就需要制定一个统一的标准,这就是网络协议。协议由软硬件协作构成,主要解决两个问题:

  1. 命名方案
    • 网络协议使用地址区分主机,地址有统一的标准(IP地址)
    • 每个主机和路由器都会有一个唯一地址
  2. 传递规则。一条网络信息称为一组信息,由元数据和数据组成。
    • 分组头部。有分组大小,源地址,目标地址
    • 有效信息载荷。储存了信息本身

举个例子:

  1. client发出信息
  2. 局域网网络协议包装:
    • 给信息加装分组头部PH,组成一组数据
    • 给一组数据加局域网帧头部FH1
  3. 广域网网络协议转换。将一个局域网的FH1头部转换成另一个局域网的FH2头部
  4. 局域网网络协议解包:
    • 解析FH2
    • 解析PH
    • 收到信息。

在这里插入图片描述

现在的网络协议是TCP/IP协议族:

  1. IP:网络协议。提供了基本命名方案和主机之间的基本传输能力
  2. 传输协议
    • UDP:传输协议。IP之间不可靠的数据报文传输
    • TCP:传输协议。IP之间可靠的通讯字节流

以上的传输,在软件上要通过混合Unix文件IO和套接字接口函数来访问。

互联网应用的软硬件组织

从宏观的角度来说,互联网应用有三层组织:

  1. Client用户层。通过套接字调用系统功能
  2. TCP/IP内核层。系统级的协议层
  3. 硬件和固件层。网络通信的硬件。硬件平台通过全球IP互联网互联
    在这里插入图片描述

互联网的程序员视图

一组:内网ip,外网ip

域名解析:字符解析成IP

进程可以通过网络通信

IP地址

IPV4,分层,所以还没有爆满

32位4字节,以大端法储存在内存中。
常用点分十进制记法。

分层结构:

一级域名都是公益的,往下分支。有一个公益组织,维护三级域名。

北京的局域网出口是清华。比如北理工校园网,先要连到清华,之后清华才连接到第三级域名上。VPN软件是跳过了清华,直接连到了第三级别域名上。

在这里插入图片描述

IPV6,128位,未来要替代。

域名系统(DNS,Domain Naming System)

DNS可以将字符串映射为IP,DNS只是为了方便实用,所以实际使用其实不一定要DNS,比如校园网的10.0.0.55。

这个映射,物理上基于一个巨大的全球分布式DNS数据库。从逻辑上说,DNS可以简单理解为一张表,里面有上百万个主机字符串与IP的映射条目。

通过工具可以查看IP和域名之间的映射关系:

在这里插入图片描述
在这里插入图片描述
可以看到,多个域名可以映射到同一个IP。更加复杂的情况下,可以把一个域名池映射到一个IP池中,用于负载均衡,在解析的时候,优先解析负载比较轻的IP,让系统均摊流量。

在这里插入图片描述
还有一种是,有合法域名但是没有IP映射。可能是预留的域名,也可能是隐藏了。

在这里插入图片描述

互联网通信

基础

通常是用TCP进行客户端和服务器链接。TCP的特点:

  1. 点对点。一对一的链接
  2. 全双工。可以同时双向传输
  3. 可靠。只要不断掉,就一定可以被接收

使用TCP协议编程的时候,要构建对应于某个IP的套接字,套接字格式为IP:port对。

在网络通信中,端口是16位整数,用于表示进程。

有的是临时端口,用于普通的通信,内核自动分配。有的是预留端口,与特定服务有关,比如80端口是web服务器端口,22是SSH端口,21是ftp文件传输端口。

连接过程

套接字这个名字取得很形象。客户端有一个ip:port对,服务器也有ip:port对,就像是两方各给一个接口,两个接口可以套在一起,形成一个套接字对。

在这里插入图片描述
在这里插入图片描述
下图说明了,端口与进程一一对应。切换不同的端口可以访问一台主机上的不同任务。

在这里插入图片描述

套接字

套接字是一组与Unix IO结合的系统级函数,用于在Client级别编写通信程序。套接字起源很早,适用于现在所有系统。

  1. 从系统来看:套接字可以看做是系统对外通信的点,两个系统的点之间形成套接字对进行连接
  2. 从应用来看:套接字可以看做文件,通过对套接字文件的读写实现远程网络的通信

套接字编程——回声服务器架构

具体编程基本就是下面的流程,思想很朴素,代码就不帖了,到时候学计网自然会学:

  1. 先建立TCP连接
  2. 再执行套接字双向通信
    1. 客户端发送请求
    2. 服务器接收请求,解析,做处理,返回响应
    3. 客户端收到响应
  3. 最后再关闭套接字连接

在这里插入图片描述

逻辑上的视图如下:

在这里插入图片描述

套接字地址结构

前面是套接字的宏观逻辑,这里讲更精细的。套接字有两种,底层的数据是一样的,只不过是两种不同的视图,所以可以互相强制转换:

  1. 通用套接字地址。是一个结构体,family表示协议类型,14字节储存了地址的数据
    在这里插入图片描述
  2. IPv4套接字地址。这一层是给用户用的,分为协议类型(2字节),ip(4字节)和port(2字节)
    在这里插入图片描述

并发编程

这章不学了,就看懂几个公式,猜出来是什么意思就行:

  1. 并行加速后的时间=串行时间比例+并行部分比例/加速因子
  2. 加速比:1/加速后的时间
  3. 并行效率:加速比/处理器数量*100%

在这里插入图片描述

在2022年12月28日的晚上23:48分,明天考试。但是,该睡觉了,也学不完了,后面也没必要学了。

故本章略。

明早起来看看例题,就准备考试了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程代码执行渗透与攻防(一)

目录 前言 远程代码执行:Remote Code Execute 远程命令执行:Remote Command Execute 为什么要远程执行代码? 漏洞危害 近几年影响比较大的RCE漏洞 PHP RCE涉及函数 代码code注入: 命令command注入 : 靶场案…

Word控件Spire.Doc 【评论】教程(4):C#、VB.NET如何在Word的评论中插入图片

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

认真学习MySQL中锁机制(二)

接上文认真学习MySQL中锁机制(一)我们继续学习MySQL中的锁机制。 【5】按加锁的方式划分:显示锁、隐式锁 ① 隐式锁 一个事务在执行insert操作时,如果即将插入的间隙已经被其他事务加了gap锁,那么本次insert操作会阻…

分类算法KNN的python实现

作者:刘凡 KNN算法介绍 KNN算法是有监督学习中的分类算法,它是一种非参的,惰性的算法模型。非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我…

隐语任务调度

隐语目前暂定支持的设备列表: 一 PYU 数据所有者是SecretFlow中的PYU设备,明文并成为PYU Objects一个PYU object(明文)可以被转化为秘密分享,被叫做SPU Object。Python函数可以被发送至SPU设备执行,背后是…

人工智能:图像数字化相关的知识介绍

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

只从 2022 年算起,谷歌就向社会输送了至少 26 位高端 AI 人才。

2022 年,人工智能在 AIGC、AI for science 等领域持续发展,一些工作也在知识型模型方面做出了探索。除了这些研究成果,我们还会发现这一年人工智能从业者的工作情况也有比较大的变化。 例如,Meta 等大型科技公司进行了大规模的裁…

【 shell 编程 】第1篇 变量

变量 文章目录变量一、前言二、变量1.变量的类型2.变量的运算一、前言 1.什么是 shell 简介: SHELL是UNIX系统的用户与操作系统之间的一种接口。它既是UNIX系统的命令解释程序,又是一种高级的命令程序设计语言。 作为命令解释程序,SHELL接收…

Windows/Mac/Ubuntu环境下安装Dokcer

前提概要: 注意:安装虚拟环境的步骤我放到另外一个文章里面啦,有需要的可以看看哦 Docker介绍:1、Docker 并⾮是⼀个通⽤的容器⼯具,它依赖于已存在并运⾏的 Linux 内核环境。2、Docker 实质上是在已经运⾏的 Linux 下…

智慧养老系统(社区+居家+机构养老)

智慧养老是一个新的养老模式,信息化医疗服务,不仅能够提高养老产业的质量,提高养老成本降低,而且能够提高老人的身体健康,提高养老人的老年生活质量。 智慧养老系统解决方案提供完整的机构养老系统、社区养老系统&…

在项目中使用——newFixedThreadPool线程池

newFixedThreadPool线程池前言newFixedThreadPool的介绍使用newFixedThreadPool的步骤实例化一个固定线程大小线程池创建一个用于启动新线程的类使用submit提交线程最后关闭关闭线程池CountDownLatch配合线程池使用构造CountDownLatch计数器减一使调用该方法的线程处于等待状态…

推荐 12 月 yyds 的开源项目

本期推荐开源项目目录:1. 面向 API 的低代码平台2. 京东抢购自动下单助手3. 开发人员使用的低代码平台4. 好用又强大的开源建站工具5. OCR 图片转文字识别软件6. 互联网仍有记忆01面向 API 的低代码平台APITable 一个面向 API 的低代码平台,用于构建协作…

推荐系统从入门到入门(2)——简单推荐系统构建(无框架、Tensorflow)

本系列博客总结了不同框架、不同算法、不同界面的推荐系统,完整阅读需要大量时间(又臭又长),建议根据目录选择需要的内容查看,欢迎讨论与指出问题。 系列文章梗概 本次大作业主要是以电影推荐系统为例,介绍…

GIC V3 V4 逻辑组件

GIC V3 & V4 逻辑组件1 GIC V3逻辑组件2 GIC 各组件的介绍2.1 Distributor2.2 Interrupt translation service, ITS2.3 Redistributor2.4 CPU interface1 GIC V3逻辑组件 The GICv3 architecture consists of a set of logical components: • A Distributor.• A Redist…

C++ 实现Manacher算法

前言 Manacher算法是一种回文串查找算法,专门用于处理查找字符串中的回文子串操作。虽然这个算法本身只是用于查找回文子串,但是它的查找思想还是非常值得学习的。由于Manacher算法是基于暴力解法优化而来的,所以在阅读正式的算法之前&#…

arthes—线上debug好帮手

arthes简介 以下是arthes官网原文: 通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂…

粒子滤波原理和MATLAB代码实现

理论基础1: (a) Prediction Use the transition equation to propagate the particles: (b) Update Use the measurement equation to obtain measurements of the propagated particles and their standard deviations: (in the case of our program, ym is obt…

如何在 Manjaro Linux 上安装 ONLYOFFICE 桌面编辑器

ONLYOFFICE 桌面编辑器是一款免费开源办公套件,其中包括适用于文本文档、电子表格与演示文稿的离线编辑器。同时,您还可将应用程序连接至云端(ONLYOFFICE、Nextcloud 等)以便在线开展文档协作。该应用的源代码已根据 AGPL v.3.0 许…

业务中台10讲2.0合辑(推荐收藏)

目录V3.0迭代内容: 增加最近更新的中台系列文章至本目录;根据最新热点修订并调整部分未更新内容方向;为各文章标注《中台产品经理宝典》书中原文出处;本目录使用方法: 本目录推文为中台内容系列中的业务中台子类新原…

华润微功放CS3850EO,2×40W D 类音频功率放大电路,替换:智浦芯CS8673,TI的TAS5780、TAS5754,国产功放

1、概述 CS3850EO 是一款典型输出功率为 40W 立体声的 D 类音频功率放大电路,适用于拉杆音箱、高级桌面音响等场合。 特点 ● 工作电压范围:8V~26V ● 典型输出功率:30W2 20V、8Ω、THD10% 40W2 18V、4Ω、THD10% 50W2 26.5V、8Ω、…