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

简介:

本节书摘来自华章计算机《Linux嵌入式实时应用开发实战(原书第3版)》一书中的第3章,第3.4节,作者:(美)Doug Abbott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 Linux进程模型

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


<a href=https://yqfile.alicdn.com/5f2dc7001d6602e11ebd42171ec66615575c13dd.png" >

一个线程只有代码。线程只存在于进程内部,一个进程中的所有线程都共享资源。因此所有的线程都可以同样地访问数据存储器和文件描述符。这个模型有时叫做轻量级多任务以与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函数调用的一个小例子。


<a href=https://yqfile.alicdn.com/12432b9be37112b4a0bd649cc5c19bccf744c1bf.png" >

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


<a href=https://yqfile.alicdn.com/f900e63585c73b45d306ae82b72b9a5882ad9734.png
" >

如果这是普通的前景命令,则命令解释器必须等到命令执行完毕。这是通过waitpid()来完成的,该函数阻塞调用进程直到与pid参数匹配的进程结束。注意,大部分的多任务操作系统没有能力阻塞一个挂起了另一个进程的进程或任务。
如果execve()成功了,它没有返回值,而是将控制传递至新载入的程序。
相关文章
|
3月前
|
安全 应用服务中间件 网络安全
在Linux环境部署Flask应用并启用SSL/TLS安全协议
至此,你的Flask应用应该能够通过安全的HTTPS协议提供服务了。记得定期更新SSL证书,Certbot可以帮你自动更新证书。可以设定cronjob以实现这一点。
212 10
|
3月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
353 13
|
2月前
|
存储 数据采集 监控
ubuntu(linux)系统主要应用于哪些工业场景中?研维三防ubuntu系统的手持工业三防平板电脑在哪些行业中有实际应用
Ubuntu 系统凭借其独特的优势,在众多工业场景中得到了广泛应用,为工业数字化、智能化发展提供了有力支持。而研维三防基于 Ubuntu 定制系统的手持工业三防平板电脑,更是将 Ubuntu 系统的优势与工业级的性能、坚固耐用性完美结合,在电力、物流、制造等多个行业中展现出强大的应用价值,助力企业提高生产效率、优化管理流程、提升产品质量,成为推动工业现代化发展的重要力量。随着技术的不断进步与创新,相信 Ubuntu 系统以及研维三防这类工业级设备将在更多的工业领域中发挥更大的作用,为工业发展带来更多的机遇与变革。
|
6月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
250 67
|
5月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
138 16
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
108 20
|
4月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
86 0
|
4月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
118 0
|
4月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
84 0
|
4月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
82 0