首页 > 编程知识 正文

linux内核进程调度函数,linux内核调度机制

时间:2023-05-05 03:21:06 阅读:38930 作者:1942

进程间通信概述关于Linux内核通信的视频讲座:实现Linux内核、进程间通信组件

linux内核、进程调度器实现和内核源分析

传输进程通信的目的数据一个进程必须将该数据发送到另一个进程。 发送的数据量在1字节和几MB之间

共享数据的多个进程尝试操作共享数据,一个进程共享数据

通知进程必须向其他进程或组发送消息。 通知发生了某些事件,如在进程结束时通知父进程。

资源共享在多个进程之间共享相同的资源。 为此,内核必须提供锁定和同步机制。

进程控制一些进程希望完全控制其他进程(如调试进程)的运行。 在这种情况下,控制进程希望阻止其他进程中的所有陷阱和异常,并及时了解状态的变化。

Linux进程间通信(IPC )的发展Linux上的进程通信手段基本上来自Unix平台上的进程通信手段。 为Unix的发展做出了巨大贡献的两大主力ATT的贝尔研究所和BSD (加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的重点不同。 前者对Unix早期的进程间通信手段进行了系统的改进和扩展,形成了“系统v IPC”。 通信过程限定在单个计算机上,后者可以跳过该限制,并通过套接字形成进程间通信机制。 Linux继承了两者

早期UNIX进程间通信

基于系统v进程间通信

基于套接字进程间通信

POSIX进程间通信。

UNIX进程间通信方式包括管道、FIFO和信号。

系统v进程间通信方式包括系统v消息队列、系统v信号和系统v共享存储器

POSIX进程间通信包括POSIX消息队列、POSIX信号和POSIX共享内存。

由于Unix版本号的多样性,电子电气project协会(IEEE )开发了独立的Unix标准。 这个新的ANSI Unix标准被称为计算机环境的可移植操作系统接口(PSOIX )。 目前,大多数Unix和热门版本号都符合POSIX标准。 Linux从一开始就符合POSIX标准;BSD并不是不参与独立进程间通信(套接字本身可以用于独立进程间通信)。 实际上,在非常多Unix版本号的独立IPC上留下了BSD的痕迹。 例如,4.4BSD支持的匿名内存映射、4.3 BSD实现可信信号语义等。

在linux上使用的进程间通信方式管线(pipe )、流管线(s_pipe )、有名管线(FIFO ) )。

信号(signal )

消息队列

共享内存

信号量

插座)插座

管道(pipe )

这种流水线的通信方式有两个限制:半双工通信、数据单向流动和只能在有亲缘关系的进程之间使用。 进程的亲缘关系一般是指亲子进程关系。

流管s_pipe:消除了第一种限制,并可以双向传输。

管道可以用于有亲缘关系的进程之间的通信。 为管道命名的:name_pipe除了管道具有的功能外,还可以克服管道没有名称的限制。 我也同意没有亲缘关系的进程之间的通信

C/C Linux服务器开发的精彩内容包括:C/C、Linux、Nginx、ZeroMQ、MySQL、Redis、MongoDB、ZK、流传输、P2P、Linux内核、DOD

信号主页(信号)信号是用于控制多个进程对共享资源的访问的计数器。

它经常被用作锁定机制。 防止进程访问共享资源时。 其他进程也访问此资源。 因此,它主要成为进程之间以及同一进程内不同线程之间的同步手段。

信号以相对复杂的通信方式用于通知过程发生了一些事件,并且除了进程间通信之外,该过程还可以向自身发送信号。 linux除了Unix的初始信号语义函数sigal之外,还支持语义符合Posix.1标准的信号函数sigaction。 (实际上,该函数基于BSD,这是为了BSD实现可靠的信号机制。 另外,可以统一对外接口,用sigaction函数再次实现了signal函数)

“消息队列”(message queue )消息队列是消息的链表,存储在内核中,由消息队列标识符标识。

消息队列克服了消息传递信息少、只能包含管道未格式化的字节流、缓冲区大小受限等缺点。

消息队列是消息的链表。 系统v消息队列,包括Posix消息队列。 具有足够权限的进程可以向队列中添加消息,具有读取权限的进程可以读取队列中的消息。

消息队列克服了信号承载信息量的不足,管道与未格式化的字节流

缓冲区大小受限等缺点。

信号 ( singal )

信号是一种比較复杂的通信方式,用于通知接收进程某个事件已经发生。

主要作为进程间以及同一进程不同线程之间的同步手段。

共享内存( shared memory )

共享内存就是映射一段能被其它进程所訪问的内存。这段共享内存由一个进程创建。但多个进程都能够訪问。共享内存是最快的 IPC 方式,它是针对其它进程间通信方式执行效率低而专门设计的。

它往往与其它通信机制。如信号量,配合使用。来实现进程间的同步和通信。

使得多个进程能够訪问同一块内存空间。是最快的可用IPC形式。

是针对其它通信机制执行效率较低而设计的。往往与其它通信机制,如信号量结合使用。来达到进程间的同步及相互排斥。

套接字( socket )

套接口也是一种进程间通信机制,与其它通信机制不同的是。它可用于不同机器间的进程通信

更为一般的进程间通信机制。可用于不同机器之间的进程间通信。

起初是由Unix系统的BSD分支开发出来的,但如今一般能够移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

进程间通信各种方式效率比較

注:无连接: 指无需调用某种形式的OPEN,就有发送消息的能力流控制: 假设系统资源短缺或者不能接收很多其它消息,则发送进程能进行流量控制

各种通信方式的比較和优缺点

管道:速度慢。容量有限,仅仅有父子进程能通讯

FIFO:不论什么进程间都能通讯,但速度慢

消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题

信号量:不能传递复杂消息,仅仅能用来同步

共享内存区:能够非常easy控制容量,速度快,但要保持同步,比方一个进程在写的时候。还有一个进程要注意读写的问题,相当于线程中的线程安全。当然。共享内存区相同能够用作线程间通讯,只是没这个必要,线程间本来就已经共享了同一进程内的一块内存

假设用户传递的信息较少或是须要通过信号来触发某些行为.前文提到的软中断信号机制不失为一种简捷有效的进程间通信方式.

但若是进程间要求传递的信息量比較大或者进程间存在交换数据的要求,那就须要考虑别的通信方式了。

无名管道简单方便.但局限于单向通信的工作方式.而且仅仅能在创建它的进程及其子孙进程之间实现管道的共享:

有名管道尽管能够提供给随意关系的进程使用.可是因为其长期存在于系统之中。使用不当easy出错.所以普通用户一般不建议使用。

消息缓冲能够不再局限于父子进程。而同意随意进程通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接收之间的同步,从而使得用户在使用消息缓冲进行通信时不再须要考虑同步问题,使用方便。可是信息的复制须要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制。快捷、信息量大是其长处。

可是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此。这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其它同步工具解决。另外,因为内存实体存在于计算机系统中。所以仅仅能由处于同一个计算机系统中的诸进程共享。

不方便网络通信。

共享内存块提供了在随意数量的进程之间进行高效双向通信的机制。

每一个使用者都能够读取写入数据。可是全部程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现。

不幸的是,Linux无法严格保证提供对共享内存块的独占訪问,甚至是在您通过使用IPC_PRIVATE创建新的共享内存块的时候也不能保证訪问的独占性。 同一时候,多个使用共享内存块的进程之间必须协调使用同一个键值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。