【笔试题面试题】IO类 知识点汇总(笔试面试题)

管道读写的特点

1、当管道读端存在时,写管道有多少写多少,直到写满64k为止
2、当管道读端不存在时,写管道写入数据时,会出现管道破裂,此时内核空间会向用户空间发送一个SIGPIPE信号
3、当写端存在时,读管道有多少读多少,没有数据会在read处阻塞
4、当写端不存在时,读管道有多少读多少,没有数据也不会再read处阻塞

什么是IO以及标准IO和文件IO的区别

 IO全称为Input/Output,即输入/输出,它指的是计算机系统中数据的输入和输出过程。


1、标准IO属于库函数,调用封装好的相关库函数,来实现数据的输入输出;文件IO属于系统调用,调用系统(内核)提供的相关函数,来实现数据的输入输出
2、标准IO操作的是文件指针,文件IO操作的是文件描述符
3、标准IO有缓冲区,文件IO没有缓冲区

进程和线程的区别

进程

1> 进程是程序的一次执行过程

2> 进程是程序资源分配的基本单位,系统会给每个进程分配4G的虚拟内存,分为0--3G的用户空间和3--4G的内核空间

多个进程共享内核空间,用户空间相互独立

3> 进程是一个动态的过程,有生命周期的概念,分为创建态、就绪态、运行态、阻塞态、死亡态

4> 进程在内核空间中存储在一个名为task_struct的结构体中(PCB)

  1. 进程描述符:task_struct包含了描述一个进程所需的所有信息。
  2. 进程状态:包括运行、就绪、阻塞等状态。
  3. 进程标识符:如进程ID(PID)。
  4. 进程调度信息:如优先级、调度策略等。
  5. 内存管理信息:如虚拟地址空间、页表等。
  6. 文件系统信息:如打开的文件、文件系统根目录等。
  7. 信号处理:包括待处理信号和信号处理函数。
  8. 进程间通信:如消息队列、共享内存等IPC机制相关信息。
  9. 时间和定时器:如进程创建时间、CPU使用时间等。
  10. 线程信息:在Linux中,线程被视为轻量级进程,也用task_struct表示。

5> 单核cpu处理多任务是,一般使用的是时间片轮询机制

6> 进程与程序的区别:程序是静态的,是存储在磁盘上的二进制代码

进程是动态的,是有生命周期的

7> 进程的组成:进程控制块(PCB)、数据段、程序段

线程

1> 线程:也称为轻量版的进程(LWP),是更小的任务执行单元,是进程的一个执行路径

2> 线程是任务器调度的最小单位

3> 一个进程中可以包含多个线程,多个线程共享进程的资源。

4> 线程几乎不占用资源,只是占用了很少的用于线程状态的资源(大概有8k左右)

5> 由于多个线程共同使用进程的资源,导致,线程在操作上容易出现不安全的状态

6> 线程操作开销较小、任务切换效率较高

7> 一个进程中,至少要包含一个线程(主线程)

8> 在有任务执行漫长的IO等待过程中,可以同时执行其他任务

9> linux中不直接支持线程相关的支持库,需要引入第三方库,线程支持库

sudo apt-get install manpages-posix manpages-posix-dev

如果程序中使用的线程支持库中的函数,编译程序时,需要加上 -lpthread 选项

阻塞IO和非阻塞IO,并发和并行,同步通信与异步通信

阻塞IO(Blocking IO):

当一个线程发起IO请求时,如果数据还没有准备好,这个线程会被挂起,直到数据准备好并被读取完毕。
在这个过程中,线程不能进行其他操作,直到IO操作完成。
这种方式简单直观,但效率较低,特别是在高并发场景下,因为每个IO操作都需要等待,导致线程资源的浪费。
非阻塞IO(Non-blocking IO):

当线程发起IO请求时,如果数据还没有准备好,该请求会立即返回,通常返回一个错误码,表示数据未准备好。
线程不需要等待IO操作完成,可以继续执行其他任务或再次尝试IO操作。
这种方式可以提高线程的利用率,适用于高并发场景,但编程模型相对复杂,需要处理更多的边界情况


并发是指在计算机系统中,多个任务或进程在宏观上同时执行,但在微观上是交替执行的。
并发可以在单核处理器上实现,通过时间分片或多任务处理来实现任务的快速切换。
 

并行是指在计算机系统中,多个任务或操作在物理上同时执行。
并行可以显著提高计算效率,因为多个任务可以同时进行,而不是交替执行。
简单来说,并发是逻辑上的“同时”,而并行是物理上的“同时”。并发可以通过操作系统的调度机制在单个处理器上实现,而并行则需要多个处理器或核心来实现。两者都是提高系统性能和资源利用率的重要概念。


同步通信(Synchronous Communication):

在同步通信中,发送方和接收方在数据交换时是同步进行的。
发送方发送数据后,必须等待接收方处理完毕并返回响应,这个过程中发送方不能进行其他操作。
同步通信通常用于需要即时反馈的场景,例如请求-响应模式的HTTP通信。
异步通信(Asynchronous Communication):

在异步通信中,发送方发送数据后不需要等待接收方的响应即可继续执行其他任务。
接收方在接收到数据后,会在适当的时候处理数据,并通过回调、事件、消息队列等方式通知发送方。
异步通信适用于处理大量并发请求的场景,可以提高系统的响应性和吞吐量。

什么是死锁,如何避免死锁

   在多线程编程中,死锁是一种情况,其中两个或多个线程被永久阻塞,因为每个线程都在等待其他线程释放它们需要的资源,在C语言中,这通常涉及互斥锁(mutexes),当多个互斥锁被不同的线程以不同的顺序获取时,很容易发生死锁

避免死锁的方式:
        1. 避免持有和等待:尽可能让线程在开始执行前一次性获取所有必需的资源。
        2. 资源排序:规定一个全局顺序来获取资源,并且强制所有线程按这个顺序获取资源。
        3. 使用超时:在尝试获取资源时使用超时机制,这样线程在等待过长时间后可以放弃,回退,并重新尝试。
        4. 检测死锁并恢复:运行时检测死锁的存在,一旦检测到死锁,采取措施(如终止线程或回滚操作)来解决。

进程间的通信有哪些,分别是怎样的

1、内核提供的原始通信方式

无名管道

有名管道

信号

2、system V提供三种

消息队列

共享内存

信号量集

为什么引入同步互斥机制,详细描述同步互斥机制的内容

1>    竞态:同一个进程的多个线程在访问临界资源时,会出现抢占的现象,导致线程中的数据错误的现象称为竞态
2>    临界资源:多个线程共同访问的数据称为临界资源,可以是全局变量、堆区数据、外部文件
3>    临界区:访问临界资源的代码段称为临界区
4>    粒度:临界区的大小
5>    同步:表示多个任务有先后顺序的执行
6>    互斥:表示在访问临界区时,同一时刻只能有一个任务,当有任务在访问临界区时,其他任务只能等待

同步互斥机制是确保多线程程序中数据一致性、任务正确顺序执行、系统性能优化以及防止死锁等关键问题的重要技术手段。

同步是指在不同任务之间协调执行顺序,确保任务按照特定的顺序执行。

互斥则是指在任何时刻,只允许一个任务访问特定的资源或执行特定的代码段(称为临界区)。这是为了防止多个任务同时访问同一资源,从而避免数据不一致或竞态条件的发生

标准IO的缓冲区种类有哪些,分别对于的刷新时机是什么

 标准IO提供了三种缓冲区:行缓存,全缓存,不缓存

1、行缓存:有关标准输入、标准输出指针对应的缓冲区,其大小为1024字节
        【关于行缓存的刷新时机】
        1、换行会刷新行缓存
        2、程序结束后,会自动刷新行缓存
        3、当文件指针关闭后,会刷新行缓存
        4、当使用fflush函数刷新文件指针时,会刷新行缓存
        5、当输入输出切换时,会刷新行缓存
        6、当缓存区满了后,再放数据时,会刷新行缓存

2、全缓存:有关普通文件指针对应的缓冲区,其大小为4096字节
       【关于全缓存的刷新时机】
        1、程序结束后,会自动刷新全缓存
        2、当文件指针关闭后,会刷新全缓存
        3、当使用fflush函数刷新文件指针时,会刷新全缓存
        4、当输入输出切换时,会刷新全缓存
        5、当缓存区满了后,再放数据时,会刷新全缓存

3、不缓存:有关标准出错文件指针对应的缓冲区,其大小为0

进程的状态有哪些

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值