无题
I/O复用的基本概念
多进程/线程并发模型,为每个socket分配一个进程/线程。(来一个客户端,分配一个进程/线程)
I/O(多路)复用,采用单个进程/线程就可以管理多个socket。
多路: 指的是多个socket网络连接;
复用: 指的是复用一个进程/线程;
I/O复用的三种方案:select、poll、epoll,因应用场景不同而采取不同方案。
一、select模型
在集合中挑选有事件发生的socket
select服务端
1.初始化服务端用于监听的socket。initserver()函数包括了创建socket、绑定socket、开启监听。
int listensock = initserver(atoi(argv[1]));printf("listensock=%d\n",listensock);
2.创建读事件集和,用于储存监听的socket和用于客户端连接的socket。fd_set为select模式自带结构体
fd_set readfdset; // 读事件的集合,包括监听socket和客户端连接上来的socket。int maxfd; // ...
无题
多进程网络编程
Linux下查看系统进程命令:ps -ef
查看进程ID的函数:在主函数中调用getpid()函数(头文件包含<sys/types.h>、<unstd.h>)
1. 多进程
一个程序运行中,使用fork()函数,就可以产生另一个进程,这也就是“分叉”。
函数声明:
pid_t fork();
返回值pid_t是一个整数(int 别名),在父进程中返回值是进程编号,在子进程中返回值是0。所以fork()>0走的就是父进程,否则走的就是子进程。子进程拷贝了一份父进程的数据,也就是父进程中定义的变量子进程会复制一份。fork之后两者对自己变量进行操作,互不影响。
int ipid = fork(); //创建进程if(ipid>0) {走父进程代码};else {走子进程代码} //两段代码都会执行
2. 僵尸进程:
子进程比父进程先结束,而父进程没有回收子进程资源,该子进程将成为一个僵尸进程。若父进程先退出,子进程被init接管,子进程结束后会释放资源,不会产生僵尸进程。
避免方法:在程序一开 ...
无题
一、socket 简介
套接字,运行在计算机中的两个程序通过socket建立通道,数据在通道中传输。
流socket:基于TCP协议,建立通道(主要)
数据报socket:基于UDP协议,无需建立和维持连接,无通道(比较少)
流socket通信流程:
二、主机字节序与网络字节序
网络字节序: 采用大端字节排序(将高序字节存于起始位置),网络间通信统一采用网络字节序。
主机字节序: 可能为小端字节排序(将低序字节存于起始位置),需转化成网络字节序然后进行通信。
两者之间转换函数: htons() //host to network short s->短(16位),同理其它函数htonl(),ntohs(),ntohl()。l->长(32位)
如图为小端转大端(32位):
三、网络编程中的结构体
struct sockaddr{ //不常用结构体 unsigned short sa_family; //地址类型,AF_xxx IPv4 char sa_data[14]; //14字节供端口和地址使用};str ...
无题
windows VSCode配置C/C++开发环境
安装扩展
创建一个空文件夹,确保这个文件夹所在的文件路径没有中文字符哈,不然会报错的。
目前版本为1.8.4,最新的版本好像无法自动生成launch.json文件
Code Runner安装后可以出现运行代码的按钮,很方便,该插件在settings.json中配置运行g++的命令就能实现多文件编译了
安装完成之后,直接在VsCode中按 ctrl+shift+p快捷键
出现以下界面: 直接搜索C/C++即可,我是因为已经搜过了。
搜到后点进去:
修改生成的Json配置文件
用VsCode 打开这个空文件夹,新建一个test.cpp文件哈。
#include <stdio.h>#include <windows.h>int main(){ printf("Hello\n"); system("pause"); // 保持窗口不被关闭 return 0;}
之后我直接放图哈。点击运行–>以非调试模式运行。
点击后, ...
无题
有时候我们希望给某个文件取个别名,那么在 Linux 中可以通过硬链接(Hard Link) 和软链接(Symbolic Link) 的方式来实现,它们都是比较特殊的文件,但是实现方式也是不相同的。
可结合操作系统中的索引节点来理解
硬链接是多个目录项中的「索引节点」指向一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的,每个文件系统都有各自的 inode 数据结构和列表,所以硬链接是不可用于跨文件系统的。由于多个目录项都是指向一个 inode,那么只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。
软链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
vscode终端中文乱码问题的解决方案合集c++
vscode终端中文乱码问题的解决方案合集c++
IO管理
IO设备基本概念
什么是I/O设备?
I/O设备的分类
按使用特性分类
按传输速率分类
按信息交换单位分类
IO控制器
I/O设备的组成
机械部件
电子部件—I/O控制器的功能
I/O控制器的组成
注意:
I/O控制器的两种寄存器编址方式
内存映像—独立编址
IO控制方式
程序直接控制方式
key word : 轮询
完成一次读/写操作的流程图(以读操作为例)
下面以C语言代码和流程图来剖析,程序直接控制方式
分析一下在思维导图中提到的几个问题:
中断驱动方式
由于程序直接控制方式CPU利用率低,忙等,所以提出了中断驱动方式。
分析一下在思维导图中提到的几个问题:
DMA方式
虽然中断驱动方式解决了程序直接控制方式的问题,但是每一次只能读/写一个字,导致CPU频繁切换,耗费了很多时间。于是人们又发明了DMA方式。
DMA控制器:
分析一下在思维导图中提到的几个问题:
通道控制方式
通道控制方式是为了解决DMA方式连续存储的问题
分析一下在思维导图中提到的几个问题:
四种方式总结一下
I/O软件层次结构
用户层软件
设 ...
文件管理
文件管理的概念和功能
文件的属性
文件内部的数据如何组织起来?
文件之间应该如何组织起来?
操作系统应该向上提供哪些功能?
从上往下看,文件应该如何存放在外存?
其他需要由操作系统实现的文件管理功能
文件的逻辑结构
无结构文件
有结构文件
定长记录:
不定长记录:
有结构文件的逻辑结构
顺序文件
索引文件
不经意间让我想起了数据库的索引,聚簇索引和唯一索引等,有了更进一步的理解,而且知道了它的时间空间效率。
索引顺序文件
索引顺序文件的效率分析:
多级索引顺序文件
文件目录结构
文件控制块(FCB)
对目录的操作
单级目录结构
两级目录结构
多级目录结构(树形目录结构)
无环图目录结构解决文件共享
无环图目录结构
索引节点(FCB的改进)瘦身
文件物理结构
文件块、磁盘块
连续分配
连续分配优点:
连续分配缺点:
链接分配
隐式链接
显式链接
链接分配总结
索引分配
如何实现逻辑块号到物理块号的转换?
数据太大,一个索引表装不下那么多的映射怎么办?
链接方案
多层索引 ...