[操作系统]进程

news2024/12/25 9:03:42

目录

  • 1.进程的概念
  • 2.如何管理进程
  • 3.进程的调度
  • 4.并行和并发
  • 5.进程调度需要使用的属性
  • 6.进程之间的通信
  • 7.进程和线程的区别

    操作系统是一个软件,对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境.这篇博客主要讲解操作系统如何管理进程。

1.进程的概念

    进程就是跑起来的程序,如下图的两个的程序,后缀都是以exe结尾,.exe称为可执行文件.
    这些可执行文件都是文件,当你没有点击的时候,就会待着硬盘里面,不会对系统有任何影响.当你双击exe文件之后,操作系统就会把exe文件加载到内存,并让CPU开始执行exe文件内部的一些指令,exe文件中存放了很多这个程序的内部指令,双击之后就会开始工作,这些运行起来的可执行文件就叫做进程.
在这里插入图片描述
在这里插入图片描述
    下图就是当前电脑上运行的进程:
在这里插入图片描述

    线程是进程内部的一个部分,进程包含线程,如果把进程想象成是一个工厂,那么线程就是工厂里的生产线, 一个厂里面可以有一个生产线或者也可以有多个生产线,对于 java 代码来说,最终都是通过 java 进程来跑起来的,此处的这个java进程就是jvm。

2.如何管理进程

 操作系统是如何管理进程的呢?

  1.先描述这个进程(明确出进程上的一些相关属性).

  2.再组织若干个进程(使用一些数据结构,把很多描述进程的信息放到一起,方便增删改查),典型的实现就是使用双向链表,把每个PCB组织起来

  操作系统主要是通过C/C++来实现的,C语言中的结构体用于描述操作系统中进程的结构体,叫做PCB,也就是进程控制块.

  “创建进程”,就是先创建出 PCB,然后把PCB加到双向链表中

  “销毁进程”,就是找到链表上的 PCB,并且从链表上删除.

  “查看任务管理器”就是遍历链表.

  PCB中的一些属性:

  1.pid(进程id),进程的身份标识

  2.内存指针
    指明了这个进程要执行的代码/指令在内存的哪里,以及这个进程执行中依赖的数据在哪里。当运行一个exe时,操作系统就会把这个exe加载到内存中,变成进程.

  3.文件描述符表
    程序运行过程中,经常要和文件打交道(文件存放在硬盘上),进程每次打开一个文件,就会在文件描述符表上多增加一项.
    文件描述符表就可以视为是一个数组,里面的每个元素是一个结构体,就对应一个文件的相关信息,一个进程只要一启动,不管你代码中是否写了打开/操作文件的代码,都会默认的打开三个文件,三个文件是系统自动打开的:标准输入(System.in),标准输出(System.out),标准错误System.err),文件描述符表的下标,就称为文件描述符.

3.进程的调度

    进程的调度是说无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
 就是说电脑执行的进程数量很多,但是CPU核数只有6核或者8核,是怎么样分配给进程是运行呢?进程的调度其实就是操作系统在考虑 CPU 资源如何给各个进程分配。
内存资源又是如何分配的呢?利用虚拟地址空间,当处理器读取或写入内存位置时,它会使用虚拟地址。 在读取或写入操作过程中,处理器会将虚拟地址转换为物理地址,由于操作系统上,同时运行着很多个进程,如果某个进程,出现了bug,进程崩溃了,是否会影响到其他进程呢? 现代的操作系统(windows, linux, mac…).能够做到这一点就是“进程的独立性”来保证的.就依仗了“虚拟地址空间”

4.并行和并发

  并行和并发:

  并行:微观上,两个 CPU 核心,同时执行两个任务的代码

  并发:微观上, 是一个CPU 核心,先执行一会任务1,再执行一会任务2,再执行一会任务3,再执行一会任务1,只要切换的足够快,宏观上看起来, 就好像这么多任务在同时执行一样。

  并行和并发这两件事,只是在微观上有区分,宏观上区分不了,微观上的区分都是操作系统自行调度的结果.

  假设CPU有6个核心,同时跑20个任务,这 20个任务,有些是并行的关系,有些是并发的关系可能任务A 和 任务B,一会是并行,一会是并发,都是微观上操作系统在控制的,在宏观上是感知不到

  正因为在宏观上区分不了并行并发,在写代码的时候也就不去具体区分这两个词,实际上通常使用“并发”这个词,来代指并行 + 并发.

 

5.进程调度需要使用的属性

  进程调度需要使用的属性:

  1.状态,状态就描述了当前这个进程接下来应该怎么调度,就绪状态: 随时可以去 CPU 上执行.阻塞状态/睡眠状态: 暂时不可以去 CPU 上执行。

  2.优先级:先给谁分配时间,后给谁分配时间.以及给谁分的多,给谁分的少.

  3.上下文:表示上次进程被调度出 CPU 的时候当时程序的执行状态,下次进程上 CPU 的时候就可以恢复之前的状态,然后继续往下执行.
  进程被调度出 CPU 之前,要先把 CPU 中的所有的寄存器中的数据都给保存到内存中(PCB 的上下文字段中),下次进程再被调度上 CPU 的时候就可以从刚才的内存中恢复这些数据到寄存器中.就相当于游戏中的读档了

  4.记账信息: 统计每个进程都分别被执行了多久,分别都执行了哪些指令,分别都排队等了多久了,给进程调度提供指导依据的.

在这里插入图片描述

  进程的状态:

  1.创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

  2.就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行

  3.执行状态:进程处于就绪状态被调度后,进程进入执行状态

  4.阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

  5.终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行

6.进程之间的通信

    进程之间现在通过虚拟地址空间,已经各自隔离开了,但是在实际工作中,进程之间有的时候还是需要相互交互的.
 操作系统提供了类似的“公共空间",进程A就可以把数据见放到公共空间上.进程B再取走.操作系统中,提供的“公共空间”有很多种并且各有特点,有的存储空间大,有的小,有的速度快,有的慢,操作系统中提供了多种这样的进程间通信机制现在最主要使用的进程间通信方式有两种1.文件操作2.网络操作(socket)

    为啥要有进程?因为我们的系统支持多任务了,程序通过多进程,是完全可以实现并发编程的,但是有点小问题如果需要频繁的创建/销毁进程,这个事情成本是比较高的.如果需要频繁的调度进程,这事情成本也是比较高的,创建进程就得分配资源,销毁进程也得释放资源对于资源的申请和释放本身就是一个比较低效的操作,
如何解决这个问题?思路有两个:
1.进程池(数据库连接池字符串常量池)
进程池虽然能解决上述问题,提高效率,同时也有问题,池子里的闲置进程,不使用的时候也在消耗系统资源.消耗的系统资源太多了
2.使用线程来实现并发编程
线程比进程更轻量每个进程可以执行一个任务.每个线程也能执行一个任务(执行一段代码),也能够并发编程.创建线程,的成本比创建进程要低很多,销毁线程的成本也比销毁进程低很多在 Linux 上也把 线程 称为 轻量级进程(LWP light weight process),调度线程的成本也比调度进程低很多
 为啥线程比进程更轻量?进程重量是重在哪里? 重在资源申请释放(在仓库里找东西…)线程是包含在进程中的.一个进程中的多个线程,共用同一份资源(同一份内存+文件)只是创建进程的第一个线程的时候(由于要分配资源),成本是相对高的,后续这个进程中再创建其他线程,这个时候成本都是要更低一些, 不必再分配资源了
 多加一些线程是不是效率就会进一步提高呢?一般来说是会,但是也不一定,如果线程多了,这些线程可能要竞争同一个资源,这个时候,整体的速度就收到了限制.

7.进程和线程的区别

  谈谈进程和线程的区别和联系

  1.进程包含线程一个进程里可以有一个线程,也可以有多个线程

  2.进程和线程都是为了处理并发编程这样的场景,但是进程在频繁创建和释放的时候效率低,相比之下,线程更轻量,创建和释放效率更高,因为进程少了申请和释放资源的过程

  3.操作系统创建进程要给进程分配资源,进程是操作系统分配资源的基本单位操作系统创建的线程,是要在CPU 上调度执行.线程是提作系统调度执行的基本单位,每个进程里,只有一个线程,可以视为是在调度进程.但是如果进程里有多个线程.更严谨的说法还是以线程为单位进行调度

  4.进程具有独立性,每个进程有各自的虚拟地址空间,一个进程挂了,不会影响到其他进程同一个进程中的多个线程,共用同一个内存空间, 一个线程挂了,可能影响到其他线程的,甚至导致整个进程崩溃.

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

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

相关文章

Golang - 时间处理总结

Golang - 时间处理总结1 获取时间对象1.1 获取当前对象对象1.2 根据指定时间返回 time.Time 类型1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作1.3 日期字符串解析成 time.Time 类型解析的时候需要特别注意时区的问题:2 时间对象转时间字符串3 时区4 时间…

严格模式和高阶函数

1、什么是严格模式 JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。 ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支…

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前,C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道,在一台运行着的现代计算机上会发生很多事情:应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前,不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因: 2、消失的梯度问题 3、不稳定的梯度问题 参考文章:为什么很难训练深度神经网络? - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因: 训练速度慢 在深度网络中,不同的层学习…

《UEFI内核导读》UEFI Firmware Storage简介

敬请关注:“固件C字营 UEFI固件一般存储在被称之为“固件仓库”的非易失性存储器中,简称为FD(固件设备),当前主流的存储介质是NorFlash它拥有非易失性、XIP以及可二次编程的特性。 固件设备可以分为物理设备和逻辑设备…

linux如何发送查收邮件的详解

一,linux用户发送给linux中的其它用户 1,使用命令 yum install sendmail -y安装sendmail软件 2,使用yum install mailx -y安装 mailx软件 3,使用命令systemctl start sendmail启动sendmail(此过程消耗时间&#xff09…

你在项目里遇到的最大困难是什么,如何解决的?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点,欢迎star~ Github地址:https://github.com/Tyson0314/Java-…

Weiler-Atherton 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Weiler Atherton多边形裁剪算法是一种允许裁剪凹面算法的算法。与 Sutherland-Hodgman 多边形裁剪算法最主要的区别是,该算法能够裁剪凹多边形,并不留下任何残留物。 裁剪示意图&#xff1…

关于微服务,这些你都了解吗-微服务介绍

文章目录一 认识微服务1.1 什么是微服务1.2 微服务的特点1.3 微服务诞生背景1.4 微服务架构的优势二 微服务生态1.1 硬件层1.2 通信层1.3 应用平台层1.4 微服务层三 微服务详解1.1 微服务架构1.2 服务注册和发现1.3 rpc调用和服务监控四 微服务与DDD1.1 什么是DDD1.2 DDD作用1.…

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1,先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我,文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来,C其实隐藏了非常多的东西,很多事情它会在编译的时候包揽,那么作为最为重要的类和对象,它是不是还隐含了更多我们平常看不到的东西呢? 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器(Extension ClassLoader) 应用程序类加载器(系统类加…

阿里云计算工程师ACP考题归类解析

目录考纲答题技巧四式记的牢三妙招一、对象存储OSS二、专有网络VPC三、服务器ECS四、安全五、阿里云弹性伸缩Auto Scaling五、内容分发网络CDN总结考纲 重点学习ECS、VPC、OSS三部分。 答题技巧四式 战略是先做简单后做难度高的。 一、简化 做题问三个问题,按回答…

【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布

目录 通过 Ingress-nginx 实现灰度发布 一、Ingress Controller 多种发布策略介绍 场景一:将新版本灰度给部分用户 场景二:切一定比例的流量给新版本 二、模拟部署生产测试版本 Web 服务 2.1 部署一个 v1 版本: 2.2 再部署一个 v2 版本: 2.3 再…

论文投稿指南——中文核心期刊推荐(化学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

本地方法接口

什么是本地方法 简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,…

AQS核心原理之

AQS系列 1、AQS核心原理之 2、ReentrantLock 原理及示例 文章目录AQS系列一、什么是AQS?二、AQS特性三、AQS内部维护 state四、队列4.1 同步等待队列4.2 条件等待队列5、总结一、什么是AQS? AQS全称是 AbstractQueuedSynchronizer(抽象对了同步器)&am…

Cento6从零开始用Nginx+mysql+php搭建Discuz在线论坛系统

首先我的liunx使用版本是 centos6.5 32位 discuz版本是Discuz_X3.2_SC_UTF8.zip Xshell版本是6 xftp是7版本 mysql也是是这个版本:mysql这里写目录标题1.yum安装php2.安装nginx包3.安装php-fpm4.安装php-mysql5. 安装Discuz在线论坛系统由于目前yum源已经无法使用需…