linux 如何组织进程的,第一次作业:深入分析Linux系统进程_weixin_39619174的博客-程序员秘密

技术标签: linux 如何组织进程的  

前言:在现在的操作系统中有很多种,我主要是讲讲Linux操作系统的,首先我们了解一下Linux系统,Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这都是参看百度网页上的解释。

1.Linux系统是如何组织进程的?

首先我们了解一下进程是什么?

1.1程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。来自于百度网页上的解释。

1.2Linux 系统创建进程都是用 fork() 系统调用创建子进程由 fork() 系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号。

1,3 Linux的进程控制块为一个由结构task_struct所定义的数据结构,task_struct定义在在/include/ linux/sched.h 中,其中包括管理进程所需的各种信息。

task_struct结构描述

所属头文件include\linux\sched.h。

每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,

在任何时候操作系统都能跟踪这个结构的信息。

这个结构是linux内核汇总最重要的数据结构,下面我们会详细的介绍。

这个结构的主要信息:

1、进程状态 ,将纪录进程在等待,运行,或死锁

2、调度信息, 由哪个调度函数调度,怎样调度等

3、进程的通讯状况

4、因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型

5、时间信息, 比如计算好执行的时间, 以便cpu 分配

6、标号 ,决定改进程归属

7、可以读写打开的一些文件信息

8、 进程上下文和内核上下文

9、处理器上下文

10、内存信息

以下图片都来自于相关链接上的资料。

4cae3ead6eff4e1c33a84a8f63002346.png

a7d60f290bdb4db8d5d6b7b07e8cd0d7.png

1d6612ec1ebb830e9f841200e8fa1b57.png

05b165a2a208166c53e703bd556e3e45.png

6fa570109a56a07ed9ad20f0953f0a2a.png

1.进程状态(State)

进程执行时,它会根据具体情况改变状态 。进程状态是调度和对换的依据。Linux中的进程主要有如下状态

内核表示

含义

TASK_RUNNING

可运行

TASK_INTERRUPTIBLE

可中断的等待状态

TASK_UNINTERRUPTIBLE

不可中断的等待状态

TASK_ZOMBIE

僵死

TASK_STOPPED

暂停

TASK_SWAPPING

换入/换出      Linux进程的状态

·可运行状态

处于这种状态的进程,要么正在运行、要么正准备运行。正在运行的进程就是当前进程(由current所指向的进程),而准备运行的进程只要得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。在后面我们讨论进程调度的时候,可以看到运行队列的作用。当前运行进程一直处于该队列中,也就是说,current总是指向运行队列中的某个元素,只是具体指向谁由调度程序决定。

·等待状态

处于该状态的进程正在等待某个事件(event)或某个资源,它肯定位于系统中的某个等待队列(wait_queue)中。Linux中处于等待状态的进程分为两种:可中断的等待状态和不可中断的等待状态。处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被打断,只能用特定的方式来唤醒它,例如唤醒函数wake_up()等。

·暂停状态

此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。

·僵死状态

进程虽然已经终止,但由于某种原因,父进程还没有执行wait()系统调用,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。

2.那进程状态是如何转化的呢?

9d292a62e553766d636506a1ce64420d.png

该图片来源网络截图

3.进程是如何调度?

在现代操作系统中,我们是不能够通过让一个进程去对应一个核心,这就表示这时候管理进程就需要添加一个能够控制它的管理单元。即是进程调度器。

调度器分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。

调度器分配的时间也不能太短,每次调度会导致上下文切换,这种切换开销很大。

调度器的结构:

f551dbd2a1253c1b8c16d5225a9a9289.png

进程调度并不是什么时候都可以,前面也说过,系统会有一个周期调度器,根据频率自动调用schedule_tick函数。其主要作用就是根据进程运行时间触发调度;在进程遇到资源等待被阻塞也可以显示的调用调度器函数进行调度;另外在有内核空间返回到用户空间时,会判断当前是否需要调度,在进程对应的thread_info结构中,有一个flag,该flag字段的第二位(从0开始)作为一个重调度标识TIF_NEED_RESCHED,当被设置的时候表明此时有更高优先级的进程,需要执行调度。另外目前的内核支持内核抢占功能,在适当的时机可以抢占内核的运行。

1358bd60ca9e73ad15a2905925ea4e6d.png

462094a88832bc3694256814b7f230c5.png

f6999848dcbe29af248bcdb8e99e6555.png

e63271ae0de0a0457c982e2164572726.png

4.对于Linux系统进程模型的看法:

每个系统都相似之处也·有其不同之处。LINUX的核心就是UNIX。UNIX还有很多其他的分衍操作系统。

系统进程的状态就在各种不同的小状态中不断的切换,不断唤醒或者停止某一个状态。还有不可能让一个进程去对一个核心,这样就得需要一小助手去帮助管理一下即进程调度器,想要了解更多还的深入研究。

参考链接

https://www.cnblogs.com/ck1020/p/6089970.html

https://www.cnblogs.com/hanxiaoyu/p/5549212.html

https://blog.csdn.net/wodeqingtian1234/article/details/54178770

https://blog.csdn.net/myarrow/article/details/7035684

dd534e322193e76b879f35d9d344ece1.gif

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39619174/article/details/116574871

智能推荐

Android Http 标准框架,底层 OkHttp,与 RxJava 完美结合,比 Retrofit 更简单易用。_Wei_Leng的博客-程序员秘密

Android Http 标准框架,底层 OkHttp,与 RxJava 完美结合,比 Retrofit 更简单易用。

Spring Boot之Validation自定义实现_不会程序的JAVA程序媛的博客-程序员秘密

Spring Boot之Validation自定义实现起因项目里面有一个要求是: xx字段只能输入15个中文字符,30个英文字符一开始我使用了@Pattern正则表达式匹配@Pattern (regexp = "[\\u4E00-\\u9FA5]{0,15}|[a-zA-Z]{0,30}", message = "歌名最多写15个中文字符,英文字符30个")但是测试了一下,当同时含有中文和英文的时候,这个正则不符合我的要求于是我写了以下工具类来校验public static boolean

番茄花园 GHOST WIN10 32位优化正式版 V2020.08_juzixt的博客-程序员秘密

番茄花园 GHOST Win10 32位优化正式版 V2020.08 使用MSDN Windows10 32位旗舰版为源盘制作,新增AMD四核CPU优化补丁,支持新型号主板开启SATA AHCI/RAID安装,支持I5、I7、I9平台。系统针对最新主流高端配置机型进行优化,专业驱动匹配,另外,PE中的部分破解软件可能会被个别杀毒软件误报,用户可放心使用。  系统更新优化  1、系统启动出错禁止弹出错误信息。  2、开启自动刷新、自动释放不使用的DLL。  3、关闭Smartscreen应用筛选器。

JAVA造轮子之-验证码图片生成操作工具类_chouchidong0519的博客-程序员秘密

通常网站或平台为了安全性考虑,会增加验证码的功能,以防遭遇恶意机器注册或软件暴力对密码刷字典破解,这里采用的是google的kaptcha进行了简单封装;创建验证码图片操作工具类; pom.xml增加jar依赖 <!-- 成生图片验证码依赖 --> <d...

你是真正的“程序员”么?_weixin_30570101的博客-程序员秘密

  我想,看到我这篇文章的,一定和我一样是一名程序员。那就请你耐心的读下去,然后问问自己,你是“程序员”么? 随着整个时代的进步,计算机不断的侵入着人们的生活,伴随而来的是大批大批(你可以停下来想想,这个大批现在有多大)的程序员,可以说是个大学,学院就要开一个计算机专业/软件专业。更别提,这几年如雨后杂草般冒出来的IT培训机构。很多程序员们都会自嘲为“码农”,“代码民工”等等。多多少少有...

linux创建交换分区设置_如何在Linux上创建交换文件_culiuman3228的博客-程序员秘密

linux创建交换分区设置zentilia/Shutterstock.comzentilia / Shutterstock.com Add swap space to a Linux computer, or increase the swap space that’s already present, without messing about with partitions. We show ...

随便推点

gdb java,调用gdb来调试java程序_风月不相干的博客-程序员秘密

错误没有这样的文件或目录,gdb如果错误消息来自emacs,则表示未安装 gdb . 要解决此问题,请安装 gdb . 请注意 gdb 不是emacs的一部分,它是一个单独的程序 . 如果你得到一个包的 gdb ,它通常是 gcc ,GNU编译器集合的一部分,而不是Emacs . 来源是相同的 - FSF(自由软件基金会)/ GNU项目(GNU不是Unix),但它是不同的/单独的包 .如果错...

工业交换机应用场景解析_什么企业会用交换器_普天信科的博客-程序员秘密

工业交换机因为应用及市场定位的关联,差别于普通交换机,它更关心可靠性,稳定性,耐热,耐震动,抗腐蚀等一些工业生产特点。工业生产以太网交换机因其较高的防护等级(一般IP40)、较强的电磁兼容性(EMS 四级)、好的工作特性而运用在一些自然环境标准严格的制造业当场,为工业生产通讯给予充分的确保。工业交换机具体应用在智慧能源、城市轨道、综合管廊、智能交通、聪慧城市、挖矿冶金工业、原油石油化工、新能源技术、智能工厂、船只、军用、楼宇安防等行业。电力行业现如今社会发展电力工程已变成日常生活不可缺少的一部.

线程池异常处理详解,一文搞懂_qq_20009015的博客-程序员秘密

在实际开发中,我们常常会用到线程池,但任务一旦提交到线程池之后,如果发生异常之后,怎么处理? 怎么获取到异常信息?而不是任务提交之后,消失的无影无踪。要知道以上答案,先看下 线程池里面的线程发生异常之后会发生什么。我们先通过工具类Executors创建一个简单的线程池,里面核心线程数为1 ExecutorService executorService=Executors.newFixedT...

Java 多线程练习 三人共抢10张票 限制黄牛党只能抢到一张票_weixin_30517001的博客-程序员秘密

|--需求说明|--实现方式在run()方法里面写一个while循环,循环体里面执行一个加过synchronized的方法,这个方法下面加一个判断语句,当线程名为“黄牛党”的时候,退出这个线程|--代码内容 1 package cn.thread1; 2 3 import java.util.Enumeration; 4 ...

postGresql关键字字段重名_a313469292的博客-程序员秘密

在postGresql中如果关键字和自定义的字段重名即使使用[ ](中括号)或者 ' '(单引号)都没有用,经本人实验。如果使用" "(双引号),则可以。转载于:https://www.cnblogs.com/sparkbj/p/6952841.html...