我就看看操作系统的书,不要求看懂,进程篇

进程管理和调度

进程类型:二进制代码的应用程序、单线程、分配给应用程序的资源;新进程是fork和exec系统调用产生,还有clone用于实现线程。

命名空间:

概念

C++的命名空间给了用户不同的接口界面。在虚拟化的系统中,一台物理计算机可以运行多个内核。全部资源都通过命名空间抽象起来。本质上,命名空间建立了系统的不同视图。

实现

UTS命名空间,用户命名空间

进程ID号

UNIX进程总是会分配一个号码用于在其命名空间唯一地标识它们,该号码被称作进程ID号,简称PID。

进程ID

除了PID,还有其他的几个ID。

命名空间增加了PID管理的复杂性。

管理PID

内核需要找一个办法来管理所有命名空间内部的局部变量,以及其他ID。

数据结构

函数

生成唯一的PID

为跟踪已经分配和仍然可用的PID内核使用一个大的位图,其中每个PID由一个比特标识。

2.3.4 进程关系

父进程,子进程

2.4 进程管理相关的系统调用

这部分讨论fork和exec系列系统调用的实现。

通常这些调用不是由应用程序直接发出的,而是通过一个中间层调用,即负责与内核通信的C标准库。

从用户态切换到核心态的方法,依不同的体系结构而各有不同。

就目前而言,将内核视为由C标准库使用的“程序库”即可。(虽然内核是个很复杂的东西,但是这里以库调用的视角来看,瞬间就简单了许多,就像java调用包一样简单。)

2.4.1 进程复制

传统的UNIX中用于复制进程的系统调用是fork,但是Linux实现了3个。

(1)fork是重量级调用,创建父进程的一个完整副本

(2)vfork,父子进程间共享数据

(3)clone,产生线程,父子进程之间的共享、复制进行精确控制。

1. 写时复制

复制数据时,进程通常只使用了其内存页的一小部分。(那你怎么知道该复制哪一部分呢?)

2. 执行系统调用

fork、vfork和clone的系统调用的入口点分别是sys_fork、sys_vfork和sys_clone函数。上述函数的任务是从处理器寄存器中提取由用户空间提供的信息,调用体系结构无关的do_fork函数,后者负责进程复制。(这个后者指的是do_fork吧?)

3. do_fork的实现

所有3个fork机制最终都调用了kernel/fork.c中的do_fork(一个体系结构无关的函数)。

4. 复制进程

复制进程的具体工作是在do_fork里面完成。

5. 创建线程时特别问题

用户空间线程库使用clone系统调用来生成新线程。但有一点应该记住,在Linux内核中,线程和一般进程之间的差别不是那么刚性,这两个名词经常用作同义词。

2.4.2 内核线程

内核线程是直接由内核本身启动的进程。

内核线程实际上将内核函数委托给独立的进程,与系统中其他进程“并行”执行。

2.4.3 启动新程序

1. execve实现

该系统调用的入口点是体系结构相关的sys_execve函数,该函数很快将其工作委托给系统无关的进程do_execve例程。

search_binary_handler用于在do_execve结束时查找一种适当的二进制格式,用于所要执行的特定文件。

2. 解释二进制格式

2.4.4 退出进程

进程必须用exit系统调用终止,使得内核有机会将该进程使用的资源释放回系统。

该调用的入口点是sys_exit函数,需要一个错误码作为其参数,以便退出进程。其定义是体系结构无关的,见kernel/exit.c。我们对其实现没什么兴趣,因为它很快将工作委托给do_exit。

简而言之,该函数的实现就是将各个引用计数器减1,如果引用计数器归0而没有进程再使用对应的结构,那么将相应的内存区域返还给内存管理模块。

2.5 调度器的实现

内存中保存了对每个进程唯一描述,并通过若干结构与其他进程连接起来。调度器面对的情形就是这样,其任务是在程序之间共享CPU时间,创造并行执行的错觉。正如以上的讨论,该任务分为两个不同的部分:一个涉及调度策略,另一个设计上下文切换。

时间: 2024-08-04 03:12:27

我就看看操作系统的书,不要求看懂,进程篇的相关文章

看懂UML类图和时序图

内容目录: 从一个示例开始 类之间的关系 时序图 附录:<图说设计模式> 看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码对应起来: 有了这些知识,看后面章节的设计模式结构图就没有什么问题了: 本章所有图形使用Enterprise Architect 9.2来画,所有示例详见根目录下的design_patterns.EA

(好文推荐)一篇文章看懂JavaScript作用域链

闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: 1 var name = "stephenchan"; 2 var age = 23; 3 function myFunc() { 4 alert(name); 5 var name = "endlesscode"; 6 alert(name); 7 alert(age); 8 alert(weight); 9 } 10 myFunc(); 11 myFunc(); 上述代码

看懂Gradle脚本(5)- 跟Gradle学领域驱动设计

领域驱动设计(DDD) 如果第一次听说领域驱动设计,那么赶紧买一本,或借一本Eric Evans写的那么同名经典书补一下课.Gradle是一个自动化build工具,所以Gradle面对的领域就是自动化构建这一领域.Gradle是按照DDD的思想设计和开发的,所以自动化构建领域里的大部分概念,在Gradle的源代码里都有一个接口或类与之对应.本文介绍对Gradle新手来说最重要的三个领域对象:Project.Task.Action. Project Project是Gradle最重要的一个领域对象

只有程序员可以看懂的笑话 大全集(2)

1.程序猿最烦两件事,第一件事是别人要他给自己的代码写文档,第二件呢?是别人的程序没有留下文档. 2.程序猿的读书历程:x 语言入门 -> x 语言应用实践 -> x 语言高阶编程 -> x 语言的科学与艺术 -> 编程之美 -> 编程之道 -> 编程之禅-> 颈椎病康复指南. 3.还没上大学的时候,高三暑假,跑到家那边的图书城想买传说中的C++的书,然后看到一本C#,我一看,嘿,这个++还写得挺艺术的,重叠起来了,于是把C#买了回来-- 4.问:程序猿最讨厌康熙

[转]关于深度学习,看这一篇就够了

关于深度学习,看这一篇就够了 原文地址:http://www.dlworld.cn/XueXiSuanFa/13.html [日期:2016-04-26] 来源:36氪  作者: [字体:大 中 小] 编者按:本文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信号9935070,36 氪经授权转载自其个人微信公众号 investguru. 一 2016 年一月底,人工智能的研究领域,发生了两件大事. 先是一月二十四号,MIT 的教授,人工智能研究的先驱者,Marvin Minsky 去

只有程序员可以看懂的笑话 大全集(1)

宪法顶个球!中国的法律都是.txt文件,不是.exe文件. 程序员:三年前,当我写下这个的时候,只有上帝和我能够看懂. 现在,只有 上帝能看懂了. 同事说,他在写i++的时候总觉的自己写的是 我艹.........有木有同感??? ? 程序员,年二十有二,始从文,连考而不中. 遂习武,练武场上发一矢,中鼓 吏,逐之出. 改学IT,自撰一函数,用之,堆栈溢出. <桃花庵--程序员版>写字楼里写字间,写字间中程序员: 程序人员写程序, 又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠: 酒醉酒醒日

关于反爬虫,看这一篇就够了

编者:本文来自携程酒店研发部研发经理崔广宇在第三期[携程技术微分享]上的分享,以下为整理的内容概要.墙裂建议点击视频回放,“现场”围观段子手攻城狮大崔,如何高智商&高情商地完美碾压爬虫...关注携程技术中心微信公号ctriptech,可获知更多微分享信息. 你被爬虫侵扰过么?当你看到“爬虫”两个字的时候,是不是已经有点血脉贲张的感觉了?千万要忍耐,稍稍做点什么,就可以在名义上让他们胜利,实际上让他们受损失. 一.为什么要反爬虫 1.爬虫占总PV比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬

【 全干货 】5 分钟带你看懂 Docker !

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者丨唐文广:腾讯工程师,负责无线研发部地图测试. 导语:Docker,近两年才流行起来的超轻量级虚拟机,它可以让你轻松完成持续集成.自动交付.自动部署,并且实现开发环境.测试环境.运维环境三方环境的真正同步.本文从Docker定义,作用,技术架构,安装和使用等全方位带你看懂Docker. Docker是啥? 打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装

关于反爬虫,看这一篇就够了 (转)

https://segmentfault.com/a/1190000005840672 者:本文来自携程酒店研发部研发经理崔广宇在第三期[携程技术微分享]上的分享,以下为整理的内容概要.墙裂建议点击视频回放,"现场"围观段子手攻城狮大崔,如何高智商&高情商地完美碾压爬虫...关注携程技术中心微信公号ctriptech,可第一时间获知微分享信息~ 你被爬虫侵扰过么?当你看到"爬虫"两个字的时候,是不是已经有点血脉贲张的感觉了?千万要忍耐,稍稍做点什么,就可以在

软件必备模块-如何看懂代码

为什么写这一篇?因为上班了以后写代码是一个技能,不过大多数时候也时常是现用现差,这个说出来也是丢人.不过生活就是这样吧,不过积累的很重要的一个东西是什么呢,就是运行,调试,搜索相关历史.我们入职一家公司或者接手一个新的项目面临很重要的一个问题就是看懂代码. 找人教,找资料 新接手一个代码,怎么看最快?看书?自己调试?都不是,是找之前写这个代码的人耐心讲给你,不过工作了就发现大家不一定都这么好心.不过万一呢,万一你遇到好人了呢,先找人,再找文档.怎么找人?查看git历史,查看代码中的注释.看开源代