操作系统
文章平均质量分 90
_200_
这个作者很懒,什么都没留下…
展开
-
进程虚拟地址空间区域划分
进程虚拟地址空间区域划分在我们用一门语言写一个程序,会产生两种东西:指令和数据。在我们进行编译链接后,生成一个可执行文件存放在我们的磁盘上,运行这个程序时,会把这个程序加载到内存中。而在加载的过程中,把可执行文件的哪些内容加载到了内存?加载到内存当中是如何存放的?分为哪些区域?具体如何划分?在此之前我们需要知道,程序不可能直接加载到物理内存!下面以X86 32位Linux环境下为例进行分析。在程序执行时,Linux系统会给当前进程分配一个2^32(4G)大小的一块空间,这块空间就是进程的虚拟地址空原创 2022-04-23 00:03:33 · 1344 阅读 · 0 评论 -
socket I/O模型
socket I/O模型在Linux环境下,阻塞和非阻塞的概念能应用于所有文件描述符,socket也是如此。阻塞的文件描述符称为阻塞I/O,非阻塞的文件描述符称为非阻塞I/O。socket在创建的时候默认是阻塞的,可以通过socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或通过fcntl系统调用的F_SETFL命令,将其设置为非阻塞的。针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。比如,客户端通过connect向服务器发起连接时,connec原创 2022-02-07 14:55:47 · 1052 阅读 · 0 评论 -
Linux下零拷贝技术
Linux下零拷贝技术为什么提出零拷贝为什么提出零拷贝通常我们会有这样的需求:将本地磁盘上的一个文件通过网络发送给远端的另一个服务。在传统的I/O中,会经过下面几个步骤:发出read()系统调用,这时处理器会从用户空间切换至内核空间;向磁盘请求数据;通过DMA将文件从磁盘上读取到内核空间缓冲区;read()系统调用返回,将数据从内核空间缓冲区拷贝至用户空间缓冲区,这时候处理器会从内核空间切换至用户空间;发出write()系统调用,并将数据从用户空间缓冲区拷贝至目标socket在内核空间的缓冲原创 2022-02-07 12:33:08 · 700 阅读 · 0 评论 -
Linux进程间通信之消息队列
Linux进程间通信之消息队列消息队列的介绍消息队列函数msgget函数msgsnd函数msgrcv函数msgctl函数编程实例msg1.cmsg2.c程序分析消息队列的介绍消息队列与有名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性。但使用消息队列并未解决我们在使用命名管道时遇到的一些问题, 比如管道满时的阻塞问题。消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能原创 2022-01-15 20:07:07 · 215 阅读 · 0 评论 -
Linux进程间通信之信号
Linux进程间通信之信号信号的基本概念信号处理函数signal发送信号函数kill和alarm信号的基本概念信号是UNIX和Linux系统响应某些条件而产生的一个事件。 接收到该信号的进程会相应地采取一些行动。我们用术语生成(raise) 表示一个信号的产生,使用术语捕获(catch) 表示接收到一个信号。信号是由于某些错误条件而生成的,如内存段冲突、浮点处理器错误或非法指令等。它们由shelI和终端处理器生成来引起中断,它们还可以作为在进程间传递消息或修改行为的一种方式, 明确地由一个进程发送给另原创 2022-01-15 11:22:35 · 686 阅读 · 0 评论 -
Linux进程间通信之共享内存
Linux进程间通信之共享内存shmget函数shmat函数shmdt函数shmctl函数共享内存允许两个不相关的进程访问同一块逻辑内存,是在两个正在运行的进程之间传递数据的一种非常有效的方式。大多数共享内存的具体实现,都把由不同进程之间共享的内存安排为同一段物理内存。共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。 如果某个进程向共享内存写入原创 2022-01-13 19:15:30 · 688 阅读 · 0 评论 -
Linux进程间通信之信号量
Linux进程间通信之信号量当我们编写的程序使用了线程时,不管它是运行在多用户、多进程、多用户多进程系统上,我们通常会发现,程序中有一部分临界代码,我们需要确保只有一个进程(或线程)可以进入这个邻居代码并拥有对资源独占式的访问权。要想编写通用的代码,以确保程序对某个特定的资源具有独占式的访问权是非常困难的。虽然有一个名为Dekker算法的解决方法,但这个算法依赖于“忙等待”或“自旋锁”。也就是说,一个进程要持续不断地运行以等待某个内存位置被改变。在像Linux这样的多任务环境中,人们并不愿意使用这种原创 2022-01-12 21:54:04 · 745 阅读 · 0 评论 -
Linux进程间通信之有名管道编程
Linux进程间通信之有名管道编程有名管道的创建访问FIFO文件命令行访问程序中访问FIFO文件使用open打开FIFO文件无名管道虽然可以在两个进程间交换数据,但也仅限于在相关的程序之间传递数据,即这些程序是由一个共同的祖先进程启动的。但如果我们想在不相关的进程间交换数据,这还是很不方便。我们可以用有名管道来完成这项工作。有名管道(FIFO)是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但它的行为却和无名管道类似。有名管道的创建我们可以在命令行上创建命名管道,也可以在程序中创建它。命令行原创 2022-01-11 13:20:17 · 561 阅读 · 0 评论 -
Linux进程间通信之管道编程实例
Linux进程间通信之管道编程实例popen函数和pclose函数popen函数pclose函数实例1:读取外部程序的输出实例2:将输出送往popenpopen函数的优缺点pipe调用fork不exec时的pipe调用fork+exec时的pipe调用当从一个进程连接数据到另一个进程时,我们通常是把一个进程的输出通过管道连接到另一个进程的输入。Linux环境下可以把shell命令连接在一起,就是把一个进程的输出直接传递给另一个进程的输入。对于shell命令来说,命令的连接是通过管道字符来完成的,如下所示原创 2022-01-10 11:20:25 · 946 阅读 · 0 评论 -
进程间通信的方式
进程间通信的方式一、进程通信的类型1. 共享存储器系统2. 管道通信系统3. 消息传递系统4. 客户机服务器系统二、常见的通信方式管道有名管道套接字信号信号量共享内存消息队列进程通信是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,不少学者也将它们归为进程通信,但只能把它们称为低级进程通信。它们之所以低级的原因在于:效率低,例如在生产者消费者问题中,生产者和消费者只能互斥的向缓冲池投放或取得一个产品通信对用户不透明,OS只为进程之间的通信提供了共享存储器。而关于进程之间通信原创 2022-01-08 17:48:58 · 1083 阅读 · 0 评论 -
操作系统引论
操作系统引论一、操作系统的作用操作系统(Operating System, OS),是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。其主要作用是管理好这些设备,提高他们的利用率和系统的吞吐量,并为用户和应用程序提供一些简单的接口,便于用户和开发人员使用。OS是现代计算机系统中最基本和最重要的系统软件,而其他的诸如编译程序、数据库管理系统等系统软件,以及大量的应用软件,都直接依赖于操作系统的支持,取得它所提供的服务。OS已经称为现代计算机、多处理机系统、计算机网络中都必须配备的系统软件。一、操作原创 2021-12-15 16:21:21 · 2578 阅读 · 1 评论