Linux 内核 同步和异步操作

0

进程的概念,一定存在于多任务分时操作系统中。当然这也不是非常准确。因为如果多个CPU上同时运行不同的进程,则似乎不存在分时的问题。因此这里假设,所有问题均是在一个CPU上进行。此时,还是需要分时来完成多个进程的各自工作。同时,这种微观上分时完成不同工作的操作机制从宏观上看,每个工作又可等效于同时进行

  • 阻塞(block)概念:指进程或线程在执行设备操作或管道,或则网络时,不能获取到资源就被挂起,
    直到满足可操作的条件后在进行操作,被挂起的进程进入休眠状态,从运行队列移走,直到
    等待的条件满足才继续执行。也就是执行到某些函数时必须等待某个事件发生函数才返回。
  • 非阻塞(non_block):进程就算没有获取到资源或没有等到事件发生时不挂起,通常会直接放弃或不断查询,
    直到可以进行的位置。也就是函数的执行不必等待事件发生,一旦执行肯定返回,用返回值来反应函数执行情况。

**例如:**read读取输入输出设备/dev/tty:

int fd = open("/dev/tty",O_RDONLY); //打开标准输入输出文件,此时为阻塞
read设备文件时发生阻塞。

int fd = open("/dev/tty", O_RDONLY | O_NONBLOCK); // O_NONBLOCK 设置文件输入输出为非阻塞

同步与异步

原来一直以为同步是同时进行的。这是个错误的概念。曾经看到有人举例,打电话是同步,相对于发消息,我觉得似乎不妥。打电话,如果你说你的,我说我的,则就不是同步,是标准的异步模式,而发消息,比如短信,一问一答,OK,这是标准的同步模式。有人说,阻塞是同步模式,非阻塞是异步模式,这样的解释似乎有点问题。同步不一定需要阻塞。自然非阻塞也不一定是异步

概念: 当一个进程A存在一个必须执行的操作点,同时该操作点,与另一个进程B的某个操作点存在因果时序关系,则A相对B为同步。反之为异步。

需要注意几点:
1、 **A相对B同步,未必B相对A同步。**最明显的例子是,客户段请求和对反馈的处理是相对于服务端同步的。在服务段接受客户段信息后,到服务段数据没有完全给予客户端之前,这段时间客户端需要等待,也就是阻塞,以同服务器端运行同步。而服务器端并不存在这个问题。如果这个客户端不给服务器发送请求,服务器会转向响应其他客户端的请求。则服务器端相对客户端并不是同步的。
之所以出现这种不对称的更本原因,是 A,B进程工作目标,或工作性质决定的。
2、 **AB两个进程之间必须存在操作点之间的因果关系,才叫同步。**如果说两个进程抢打印机,则不叫同步。虽然可能存在某个操作点上的相互影响。虽然他们之间可能出现阻塞。但和同步异步没联系。
这一条,实际上也是说扩展说明了。讨论到同步异步,均是指:AB协同完成一个整体任务,缺一不可的情况下。如果两个毫无联系,毫无因果关系,老死不相往来的进程,则不存在同步和异步的讨论。虽然你可以说他们是绝对异步。但没有必要通过同步和异步的分析方法来处理和约束这两个进程的设计。
3、 A相对B同步,则一定存在一个严格按照{ 请求–>等待–>接受 }的时序过程进行。 这种工作在软件设计时是显式存在的(即你在代码中可以看到)。也就是说,存在因果关系的阻塞才是同步。
例如,机器A向机器B传输数据。采用对信息分块,并打包,包前缀含有同步信息的时候,或许有人说。此时不需要等待,因为存在同步头。这种观点本身没有错。如果仅放在传输之段执行时间内来看。但考虑一下传输前的工作。机器A可以在任何情况下,直接传递信息吗?不需要建立信道(通过握手,或查询缓冲区是否清空的各种方式)?考虑一下握手动作,A发送请求REQ,B接受,返回ACK。这就是请求,等待,接受,而采用缓冲方式,A要查询缓冲区是否空(即上一次信息是否被B全部获取),这实质是个等待过程,而发现缓冲区为空,这实质是通过缓冲区的情况,来实现机器B向机器A发送接受信息。
4、 **同步和异步都是相对的。在不同的尺度下,可能产生变化。**而同步代码的设计和异步代码的设计存在本质差异,因此,分割尺度形成模块化设计,才是程序设计的大学问。至于采用什么函数,什么调用方式,这本身不是一个程序员的价值所在。你能背下所有的C的标准库的函数及参量不代表你能成为一个合格的程序员。

分析同步和异步,既要考虑任务切割后,每个子部分的工作特性,又要考虑每个子部分及整体的运行参数和目标要求。

**绝对同步是存在的,绝对异步是不存在的。除非两个任务丝毫没有联系。**但不代表异步工作毫无意义。 UDP与TCP就可以看作,在针对消息传递这个工作上,前者是异步模式,后者是同步模式。很多情况下,无法做到完全同步(这需要硬件支持),也有些情况下,不需要做到完全同步(例如广播消息,没有收到的信息,并不是重要的,不会对系统产成影响)

侵删
转载参考:https://blog.csdn.net/bytxl/article/details/22778969

おすすめ

転載: blog.csdn.net/weixin_44576259/article/details/120381386
おすすめ