《操作系统》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,一经查实,立即删除!

相关文章

日志管理

1、错误日志配置 错误日志属于核心功能模块的参数 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置这一行即可 events {worker_connections 1024; }语法规则:error_log file level 错误的日志级别有[debug|info|notice|warn|err…

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提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

审计日志功能监控

背景:公司的审计日志经常出现不记录命令的情况,但是又无法监控到审计功能是否正常。所以我们思路是,每天从CMDB服务器 ssh登录到每一台主机。如果审计功能正常,则一定会在auditlog.info文件中有登录的记录。如果24小时内这个文件没…

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

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

通过纯css实现图片居中的多种实现方式

html结构&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 实现img位于外层div的居中显示…

GCC 命令行详解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c编译器 gcc,cc,c,g,gcc和cc是一样的&#xff0c;c和g是一样的&#xff0c;(没有看太明白前面这半句是什 么意思:))一般c程序就用gcc编译&#xff0c;c程序就用g编译 2。gcc的基本用法 gcc test.c这样将编译出一个…

Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名

该方法可以得到远程主机的域名&#xff0c;也可以得到本机名。getHostName方法的定义如下&#xff1a; publicString getHostName() 下面是三种创建InetAddress对象的方式&#xff0c;在这三种方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿辅导python面试_猿辅导面试经历—个人感受

今天参加了猿辅导的二面&#xff0c;无数槽点&#xff0c;不知道是不是很多公司都是这样&#xff0c;但是我还是忍不住要逼逼叨。6月10号&#xff0c;我向猿辅导投了简历&#xff0c;想做招聘邀约专员这个岗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份简历之后通知我…

对称加密与非对称加密

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

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

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

gcc生成静态库和动态库

gcc生成静态库和动态库一、库文件简介简单地说&#xff0c;库&#xff08;Library&#xff09;就是一组已经写好了的函数和变量、经过编译代码&#xff0c;是为了能够提高开发效率和运行效率而设计的。库分为静态库&#xff08;Static Library&#xff09;和共享库&#xff08;…

python 流式计算框架_流式计算的三种框架:Storm、Spark和Flink

我们知道&#xff0c;大数据的计算模式主要分为批量计算(batch computing)、流式计算(stream computing)、交互计算(interactive computing)、图计算(graph computing)等。其中&#xff0c;流式计算和批量计算是两种主要的大数据计算模式&#xff0c;分别适用于不同的大数据应用…

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

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

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

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

安装Postman

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

python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区

6 词频统计完成分词以后&#xff0c;词频统计就非常简单了。我们只需要根据分词结果把片段切分开&#xff0c;去掉长度为一的片段(也就是单字)&#xff0c;然后数一下每一种片段的个数就可以了。这是出现次数排名前 20 的单词&#xff1a;(括号内为频数)可以跟之前只统计出现次…

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

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

python操作redis实例_Java,php,Python连接并操作redis实例

1、Java连接并操作redis在Eclipse里新建一个java project&#xff0c;导入jedis-*.jar包。示例代码&#xff0c;其他对应的操作类型见&#xff1a;http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代码public class RedisTest {public sta…

java: cannot execute binary file 如果遇到这个错,一般是操作系统位数出问题了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后来检验&#xff0c;检查了一段时间&#xff0c;没有问题&#xff0c;最后有高人提示经验证&#xff0c;是64位版本移到32位上。本文转自 jxwpx 51CTO博客&…