《操作系统》OS学习(十):进程控制

进程切换(上下文切换):

  • 定义:暂停当前运行进程,从运行状态变成其他状态,调度另一个进程从就绪状态变成运行状态
  • 要求:切换前,保存进程上下文;切换后,恢复进程上下文;快速切换
  • 进程存储的生命周期的信息:寄存器(PC,SP,...);CPU状态;内存地址空间

进程控制块PCB:内核的进程状态记录

  • 内核为每个进程维护了对应的进程控制块PCB
  • 内核将相同状态的进程的PCB放置在同一队列

进程控制块结构:

  • 进程标识信息
  • 进程状态信息
  • 进程占用的资源(存储资源、内核堆栈等)
  • 保护现场用的内容
  • 当前进程在哪个队列

其中内存地址空间结构中会包含:有哪些内存块及地址空间,第一级页表起始地址,置换相关结构

进程创建:

  • Windows进程创建API:CreateProcess
  • Unix进程创建系统调用:fork/exec。fork()把一个进程复制成两个进程,父子进程有各自的PID;接下来的exec()用新程序来重写当前进程,PID不改变。

空闲进程创建

当用户代码执行完之后,系统将在空闲进程中执行。

第一个内核线程的创建:

fork()的开销:

  • 对子进程分配内存
  • 复制父进程的内存和CPU寄存器到子进程里
  • 开销昂贵

99%调用fork是为了接下来调用exec,考虑到fork()操作中内存复制是没有作用的,子进程可能会关闭打开的文件和连接,因此考虑将其合并到一个调用中,于是出现了vfork()。

vfork():

  • 创建进程时,不再创建一个同样的内存映像,而是当调用exec()时才开始复制,而要被覆盖或者关闭的资源不再进行复制
  • 一些时候称为轻量级fork()
  • 子进程应该几乎立刻调用exec()
  • 现在使用Copy on Write(COW)技术

进程加载exec

  • exec调用成功时:是相同的进程,运行了不同的程序
  • exec()允许一个进程加载一个不同段程序,并在MAIN执行,(_start)
  • 允许一个进程指定参数的数量argc和字符串参数数字argv
  • 允许进程指定不同的控制流,OS中可指定不同的应用程序,即调用成功=相同进程,运行的是不同的程序!
  • Code(代码段)stack(堆栈)heap(堆)等完全重写

进程等待与退出:

父进程等待子进程:

1. wait()系统调用用于父进程等待子进程的结束

  • 子进程结束时通过exit()向父进程返回一个值
  • 父进程通过wait()接受并处理返回值

2. wait()系统调用的功能

  • 有子进程存活时,父进程进入等待状态,等待子进程的返回结果。当某子进程调用exit()时,唤醒父进程,将exit()返回值作为父进程中wait的返回值
  • 有子进程调用exit()而父进程还未调用wait()处理时,子进程被称为僵尸进程。如果此时父进程调用wait()则直接处理并返回
  • 无子进程或无子进程存活时,wait()也是立刻返回

3. exit()用于进程的有序终止

  • 进程结束执行时调用exit(),完成进程资源回收。

4. exit()系统调用的功能

  • 将调用参数作为进程的结果返回
  • 关闭所有打开的文件等占用资源
  • 释放内存
  • 释放大部分进程相关的内核数据结构
  • 检查是否父进程是存活的:如果父进程存活,保留结果的值直到父进程用wait()处理,进入僵尸状态;如果父进程不存活,则子进程为孤儿进程,直接释放所有数据结果,进程结束
  • 清理所有等待的僵尸进程

其他进程控制系统调用

  • 优先级控制:nice()指定进程的初始优先级;unix系统中进程优先级会随执行时间而衰落
  • 进程调试支持:ptrace()允许一哥进程控制另一个进程的执行;设置断点和查看寄存器
  • 定时:sleep()可以让进程在定时器的等待队列中等待指定。

为什么要让父进程等?而不是直接结束?

当进程执行完毕退出后,几乎所有资源都回收到OS中。但有个资源很难回收,就是PCB,PCB是代表进程存在的唯一标识,OS要依据PCB执行回收。这个功能由父进程完成。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GCC 命令选项使用详解

GCC 命令行详解[转帖] 1、gcc包含的c/c编译器 gcc、cc、c、g gcc和cc是一样的,c和g是一样的,一般c程序就用gcc编译,c程序就用g编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为t…

mvn 打包_Spark源码打包编译的过程

前言上篇文章介绍了下 安装sbt环境 启动scala项目安装SBT环境运行Scala项目为什么要弄这个 因为我本来是想对spark源码编译部署spark是用scala语言编译的spark源码https://gitee.com/pingfanrenbiji/sparkspark提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

清华大学《操作系统》(十一):处理机调度

一、处理机调度概念 进程切换(上下文切换):切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文 CPU调度:从就绪队列中挑选一个进程/线程作为CPU…

对称加密与非对称加密

(一)对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key&#xff…

清华大学《操作系统》(十二):临界区与锁

多进程并发运行,导致多个进程间有资源共享,比如CPU、内存,因此存在不确定性和不可重现,可能导致多次运行结果不一致。因此操作系统需要利用同步机制在并发执行的同时,保证一些操作是原子操作。 互斥是指一个进程占用了…

清华大学《操作系统》(十八):管程于信号量

信号量与管程也是进程间通信的方式。信号量是与锁在同一层级实现的,是操作系统提供的一种协调共享资源访问的方法。信号量由操作系统管理,操作系统作为管理者地位是高于进程的。 一、信号量 1、信号量(semaphore):是操…

Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址

今天发现Qmail邮件系统的maillog里面有大量的“user not found”信息,通过下面的日志不难发现,是来自同一IP的很多不同的用户连接Qmail邮件系统认证失败的信息。黑客试图通过这种方式来破解Qmail邮件系统的用户名和密码,从而来发送大量的垃圾…

安装Postman

在web和移动端开发时,常常会调用服务器端的restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用。 这里介绍一下如何在chrome浏览器利用postman应用进行restful api接口请求测试。 因为&#…

清华大学《操作系统》(二十):死锁和进程通信

一、死锁 死锁:一组阻塞的进程(两个或多个),持有一种资源,等待获取另一个进程所占有的资源,而导致谁都无法执行。 可重复使用的资源: 在一个时间只能一个进程使用,且不能被删除。…

清华大学《操作系统》(二十二):文件系统

文件系统和文件: 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能,组织、检索、读写访问数据。文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件…

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

清华大学《操作系统》(二十三):I/O子系统

常见设备接口类型: 1、字符设备:键盘鼠标、串口 a.以字节为单位顺序访问 b.I/O命令通常使用文件访问接口和语义 2、块设备:磁盘、磁带、光驱 a.均匀的数据块访问 b.I/O命令通常使用文件系统接口,也可以使用内存映射访问 3、网络…

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK? 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口,您能够通过该套接口实现主要的地图功能,而且能够定制地图样式,实现个性化地图。 该接口提供下面功能&#xff…

mysql读写分离_MySQL基于amoeba读写分离实验

主从复制只是一个同步数据的方式读写分离:只在主的上面写,只在从的上面读读写分离方案:【1】基于程序代码内部 (生产环境中应用最广泛,性能最好,需要开发人员来实现)【2】基于中间代理层的实现amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成python自己的一个类。然后在python Django框架其他代…

Python内存管理以及垃圾回收机制

垃圾回收:用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表,这个链表就比较厉害了,因为Python程序中一旦创建对象都会把这个对象添加到refchain这个链表中。也就是说他…

【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的开源Web控件,包含有丰富的Ajax运用,其前身是Coolite。 下载地址:http://www.ext.net/download/ 示例地址:http://examples.ext.net/ 1.首先下载Ext.Net,地…

面试之操作系统

基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程,使得程序能够并发运行。 2. 共享 共享是指…

mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了:传统情况下,为表添加列需要对表进行重建腾讯团队为 MySQL 引入了 Instant Add Column 的方案(以下称为 "立刻加列" 功能)可以快速完成 为表添加列 的任务…

GCC for Win32开发环境介绍

GCC for Win32开发环境介绍(1) 第一章 在视窗操作系统下的GCC 第一节GCC家族概览 GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。所以,也许对于许多Windows开发者来说,GCC还是一个比较陌生的东西…