《Linux嵌入式实时应用开发实战(原书第3版)》——3.4 Linux进程模型

3.4 Linux进程模型

Linux中的基本结构元素是进程,由可执行代码和如数据、文件描述符等组成的资源组合组成。这些资源完全是受保护的,因此一个进程不能直接访问另一个进程的资源。为了使两个进程相互通信,它们必须使用Linux定义的中间进程通信机制,如共享存储区域或管道。
由于它在系统中建立了一个高级别的保护,所以工作良好。错误的进程会被系统检测出来并在它对其他进程造成破坏前将其抛出(图3-7)。但是在创建进程时的过度开销和使用中间进程通信机制的代价是昂贵的。

一个线程只有代码。线程只存在于进程内部,一个进程中的所有线程都共享资源。因此所有的线程都可以同样地访问数据存储器和文件描述符。这个模型有时叫做轻量级多任务以与UNIX/Linux进程模型区分。
轻量级任务的优点是中间线程的通信更有效。它的缺点是任何线程都可以破坏其他线程的数据。多数的RTOS都曾经有类似轻量型的模型。当然最近几年,存储器保护的硬件花费明显下降,因此一些RTOS供应商开始提供他们系统的保护模式版本,这看起来像Linux进程模型。
3.4.1 fork()函数
Linux的生命从一个进程开始,这就是在启动时创建的init进程。系统中其他进程的创建都是通过调用fork()实现的。调用fork()的进程叫父进程,新创建的进程叫子进程。所以每个进程都有父和子,这取决于谁创建谁。
如果你是在一个多任务的操作系统中,这里的任务是函数通过调用任务创建服务生成的,那么fork进程看起来显然很奇怪。fork()函数创建一个父进程的副本——代码、数据、文件描述符和父进程目前拥有的其他任何资源。这可能会增加MB量级存储空间的复制。为避免复制许多可能被覆盖的东西,Linux引入了一个写时复制的策略。
fork()函数从复制进程数据结构和给子进程一个新的进程标识符(PID)开始。然后,复制一个页目录和页表。最开始,PTE均与父进程一样指向相同的物理页面。两个进程的所有页面都设置为只读。当其中的某一个进程试图写时,会引起一个页面错误。这会让Linux给该进程分配一个新页面,并复制现有页面的内容。
因为两个进程都执行同样的代码,所以它们都从fork()的返回值继续执行(这就是为什么很奇怪)。为了区分父进程和子进程,fork()给子进程返回一个函数值0,但是给父进程返回子进程的PID值。表3-1就是fork函数调用的一个小例子。

3.4.2 execve()函数
当然,99%的时间里都是子进程通过调用execve()激活一个新的程序来从磁盘导入一个可执行镜像文件。表3-2给出了一个简单的命令行注释器的架构形式。它从stdin读入一行文本,解析后调用fork()函数创建一个新进程。然后子进程调用execve()导入一个文件并执行之前输入的命令。execve()覆盖了调用进程的代码、数据和堆栈段。

如果这是普通的前景命令,则命令解释器必须等到命令执行完毕。这是通过waitpid()来完成的,该函数阻塞调用进程直到与pid参数匹配的进程结束。注意,大部分的多任务操作系统没有能力阻塞一个挂起了另一个进程的进程或任务。
如果execve()成功了,它没有返回值,而是将控制传递至新载入的程序。

时间: 2024-11-01 03:03:44

《Linux嵌入式实时应用开发实战(原书第3版)》——3.4 Linux进程模型的相关文章

《Linux嵌入式实时应用开发实战(原书第3版)》—— 导读

前 言 使用minix的朋友们,大家好! 我正在为386(486)AT系列编写一个(免费的)操作系统(这仅仅是业余爱好,不会太大,也不会像GNU那样专业).我从4月份开始酝酿,现在快准备好了.我希望得到任何关于minix的反馈,包括你们在使用过程中喜欢和不喜欢的地方.因为我的操作系统和它多少有点类似(比如文件系统具有相同的物理布局(出于实用的原因)). 我目前已经移植了bash(1.08)和gcc(1.40),而且进展好像很顺利.这意味着我将在未来几个月内把这个系统推向应用,所以我想知道大多数人

《Linux嵌入式实时应用开发实战(原书第3版)》——1.5 开源协议

1.5 开源协议 多数软件终端用户协议都明确限制了你只可以使用协议范围内的功能.典型的限制条件是不允许复制或重新发布.你通常会被警告不要试图对软件进行"逆向工程". 相反,开源协议是只要你愿意,就允许使用.修改和复制授权的软件.和权利相伴的是义务.如果你修改并发布了一个开源协议内的软件,你就必须将修改后的源代码也纳入该框架.你的修改就成为"派生的工作",也在该协议的范围内.这就允许其他使用者更好地理解软件,并按他们的意愿做出更多的修改. 开源协议也叫"公共

《Linux嵌入式实时应用开发实战(原书第3版)》——3.2 Linux属性

3.2 Linux属性 下面列出一些Linux和UNIX风格的操作系统常见的重要特性. 多任务.Linux调度器执行真正的.抢占式多任务,就是说当高优先级的进程准备好时,它将产生异步事件中断当前运行的进程.但是尽管它是抢占式的,由于内核中有相对较大的延迟,这使得它不适用于严格的实时应用.另外,默认的调度程序执行公平策略,给每个进程执行的机会. 多用户.UNIX已发展为一个分时系统,允许多个用户共享一台昂贵的(在当时)计算机.因此,该系统有一些属性是支持隐私和数据保护的.Linux保留了这一点,并

《Linux嵌入式实时应用开发实战(原书第3版)》—— 2.4 DVD 还是激活CD

2.4 DVD 还是激活CD 多数的Linux发行版至少可以通过三种途径获得:DVD.CD包(目前最多包含6张CD)或者一张激活CD(Live CD).一张激活CD就是一个最小的可引导Linux系统,可以不用安装Linux就让你有机会体验新的发行版.当然,你不能保存任何数据或修改配置.每次启动它都会恢复到默认配置. 激活CD提供的一个选项是安装发行版.当你选择这个选项时,它将运行和你使用DVD或完整的CD包同样的安装过程.不同之处在于安装包是来自网络而不是来自物理介质.

《Linux嵌入式实时应用开发实战(原书第3版)》——2.3 安装方案

2.3 安装方案 下一步是你想怎样安装Linux,基本上有三种安装方案.2.3.1 单机版如果你可以分配一台机器给Linux,那么这是一个明显的选择.你将允许安装进程格式化整个硬盘.2.3.2 双启动在一些情况下,你可能想把Linux安装到一台已经运行其他Windows系统的机器上.有两种方法可以做到这一点.本节讨论双启动,下一节讨论虚拟化.在双启动方案里,你在开机时要选择启动哪个操作系统.这个操作系统将控制整个机器.Linux的安装将用GRUB(GRand Unified Boot loade

《Linux嵌入式实时应用开发实战(原书第3版)》——1.3 为什么Linux适用

1.3 为什么Linux适用 Linux模仿UNIX的基本架构,在其基础上发展成为一个通用的操作系统.没有人认为UNIX适用于嵌入式或实时操作系统(RTOS).它太大了,占用太多的资源,而且其调度原则是基于顺序而不是优先级.因此,简而言之,它与嵌入式操作系统的要求完全是背道而驰的. 但是Linux有UNIX系统的早期版本所欠缺的几样东西.它是免费的,而且你可以得到源代码,并且有一个拥有大量热情的Linux开发者和使用者的大社区.你在使用中所面临的问题总有人正遇到或曾经遇到过,所有这些都在网络上,

《Linux嵌入式实时应用开发实战(原书第3版)》——1.4 哪里用嵌入式Linux

1.4 哪里用嵌入式Linux 任何地方都在用.2005年7月,LinuxDevices.com网站列出了超过300个运行Linux的商业产品.它们包括手机.个人数字助手(PDA)及通过路由器和网关使用的其他手持设备:精简客户端.多媒体设备.电视机顶盒.机器人和加固的VMEbus:适用于军事和控制应用的机箱.这些只是LinuxDevices网站的编辑们正好知道的产品.首个或许也是最知名的应用嵌入式Linux的家庭娱乐设备是TiVo个人录像机,当它在2000年首次出现时,就引发了电视业的革命.Ti

《Linux嵌入式实时应用开发实战(原书第3版)》——3.5 Linux文件系统

3.5 Linux文件系统 Linux文件系统在很多方面与Windows PC或Macintosh(苹果公司生产的)上的文件系统类似.它是一个等级系统,允许你在"/"标识的根目录下创建任何数量的子目录.和Windows中一样,文件名可以很长.尽管如此,Linux和多数类似UNIX的系统一样,文件的扩展名--文件名中"."后面的那部分--不像它们在Windows中那样有意义.例如,Windows中的可执行文件的扩展名为".exe",但是Linux中

《Linux嵌入式实时应用开发实战(原书第3版)》——3.7 shell

3.7 shell Linux系统启动最后所做的事情之一是调用叫做shell的命令解释程序.它主要的工作是解析你在控制台输入的命令并执行相应的程序.但是shell不仅仅是一个简单的命令解释器.它包含了自己的一个功能强大的表述性解释编程语言,通过整合shell脚本语言和现有的实用程序,使无需写一行C代码就生成一个非常成熟的应用成为可能.事实上,这就是常规的UNIX编程的指导思想.从一组简单的实用程序开始,通过shell脚本语言将它们链接起来. shell脚本语言包括通常的循环.测试.函数等编程结构