一、IO
1. IO的种类
标准IO:库函数
文件IO:系统调用
2. 库函数和系统调用
系统调用:系统调用是从用户空间进入内核空间的唯一方法,它的可移植性差、没有缓冲区,所以效率低。
库函数:库函数=系统调用+缓冲区,它的可移植性比较强、有缓冲区,所以效率高。
3. 标准IO和文件IO的区别
(1)缓冲机制
标准IO具有缓冲机制,自动处理数据的缓冲和刷新,提高IO效率;
文件IO无缓冲机制,需开发者自行处理数据的读写。
(2)函数来源
标准IO的函数接口了来自于C语言的标准库,与操作系统无关,因此具有良好的移植性;
文件IO的函数接口来自Liunx内核,与操作系统紧密相关,移植性差。
(3)操作入口
标准IO操作文件的入口是文件流,通过文件流来进行数据的读写;
文件IO操作文件的入口是文件描述符(fd),通过文件描述符来访问文件。
(4)应用场景
标准IO适用于对文本文件的读写操作,提供了丰富的文件接口和缓冲机制,方便开发者进行文件操作(按字符读取、按行读取等等十几个函数)。
文件IO适用于读二进制文件进行读取,以及对底层设备的访问,如网络套接字、硬件设备等等。
还用于实时性高的场景,如传感器数据的读写。
4. 标准IO缓冲区问题
(1)缓冲区的种类
行缓存:与终端相关的缓冲区(stdin、stdout)
全缓存:与文件相关的缓冲区(fp)
无缓存:标准出错没有缓冲区(stderr)
(2)缓冲区大小
行缓存:1k
全缓存:4k
无缓存:0
(3)缓冲区的刷新方式
行缓存
(1)遇到换行符时
(2)调用fclose()时
(3)程序结束时
(4)输入输出切换时
(5)当行缓冲区满时
(6)用fflush()刷新缓冲区
全缓存
(1)调用fclose()时
(2)程序结束时
(3)输入输出切换时
(4)当行缓冲区满时
(5)用fflush()刷新缓冲区
5. 目录
遍历目录
用opendir打开目录,然后循环调用readdir直到readdir返回NULL
判断每个文件的类型,如果是目录文件,就递归调用当前函数本身来遍历这个目录
如果是普通文件,则输出
二、文件映射虚拟内存
1. 简介
文件映射虚拟内存,是把文件映射到内存中,用操作内存的方式来操作文件,能高效实现文件 I/O 和进程间共享数据。
如果是比较大的文件,可以提高效率。
硬盘操作相对于文件操作,效率低下很多。
2. 编程模型

三、进程
1. 简介
progress 进程,是操作系统资源分配的基本单位,是一个独立运行的程序实例。每个进程拥有独立的内存空间、文件描述符、寄存器状态等系统资源,相当于一个 “独立的程序运行环境”。
线程,是进程内的一个执行单元,是操作系统调度的基本单位(CPU 调度的最小单位)。线程共享所属进程的全部资源(如内存空间、文件句柄),但拥有自己的程序计数器、栈和寄存器状态。
2. 进程的状态
R 运行时状态 S 睡眠状态 T 挂起状态 D 死亡状态 Z僵尸状态
3. 如何创建一个进程
(1)执行程序创建
可执行程序 a.out
(2)exec簇


(3)fork

4. 进程间的通信
进程间的通信,就是不同进程之间传递数据、交换信息或协同工作的机制。由于进程拥有独立的地址空间,无法直接访问彼此的内存,因此需要专门的IPC机制来实现数据交换。
常见的进程间通信方式如下:
(1)管道

(2)命名管道

(3)信号

(4)共享内存

(5)消息队列

(6)信号量

(7)套接字

四、管道
1. 简介
是一种用于进程间通信的机制,它允许一个进程的输出作为另一个进程的输入,实现数据的单向传递。
管道是半双工的,数据只能从一端流入、另一端流出(通常分为「读端」和「写端」)。
(管道传输的都是字符串,如果是其他数据,会转成字符串再进行传输;要注意数据的边界以及格式)
2. 分类
匿名管道
直接就是打开的文件描述符,能且只能在父子进程之间通信。
通过pipe()系统调用创建,没有文件名,仅在进程生命周期内存在,进程退出后自动销毁。
有名管道
通过mkfifo()系统调用创建,有一个可见的文件名存于文件系统中;
可用于无亲缘关系的进程通信,只要知道管道的路径即可访问;
本质是特殊的文件,遵循先进先出原则。
五、信号
1. 简介
是一种用于进程间异步通信的机制,用于通知进程发生了某种事件(如错误、外部中断、用户请求等),促使进程执行预先定义的处理动作。
信号可以理解为操作系统向进程发送的「通知」,它具有异步性(进程无需主动等待,信号可随时到来)和简洁性(主要传递事件类型,不携带复杂数据)。
2. 产生信号
- 按键产生,如:ctrl+c(2 终止/中断)、ctrl+z(20 暂停)、ctrl+\(3 退出)
- 系统(函数)调用产生,如:kill、raise、abort
- 软件条件产生,如:定时器alarm
- 硬件异常产生,如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)
- 命令产生,如:kill命令(给指定进程发送指定信号,不一定是杀死)
3. 信号的处理方式
- 执行默认处理动作(每一个信号都有自己的默认处理动作)
- 忽略(丢弃)
- 捕捉(自定义处理函数)
六、IPC
1. 简介
指多个进程之间传递数据或信号的机制。在多任务操作系统中,进程是资源分配的基本单位,各个进程相对独立,为了协同工作,就需要进程间通信。
IPC有三种:shm--共享内存、msg--消息队列、sem--信号量
基于key,ftok()创建key,区分IPC
2. IPC相关命令
ipcs:查看所有的IC
ipcrm -m:删除共享内存
ipcrm -q:删除消息队列
ipcrm -s:删除信号量
3. 共享内存
创建一块内存段,这块内存段可以让多个进程挂载上去;
挂载上去的进程可以访问这块内存段(读访问、写访问);
共享内存没有先后顺序,然后也无法区分数据来自于哪一个进程;
内存段大小可以指定,访问方式可以限制;
key唯一,通过key来生成的共享内存段唯一。
4. 消息队列
消息队列是创建了一个主机上多个进程都可以访问的队列,实现不同进程间的异步通信;
队列里可以存放多个消息;
消息有数据和类型;
消息的数据长度自行指定;
消息的类型是一个unsigned long。
5. 信号量
信号量本质是个整数。
多个进程都可以对这个整数进行操作(加减)
减法操作比较特殊:如果减到0以下,就会阻塞,直到减法的结果不是0以下为止。
4046

被折叠的 条评论
为什么被折叠?



