技术标签: 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、内存信息
以下图片都来自于相关链接上的资料。
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.那进程状态是如何转化的呢?
该图片来源网络截图
3.进程是如何调度?
在现代操作系统中,我们是不能够通过让一个进程去对应一个核心,这就表示这时候管理进程就需要添加一个能够控制它的管理单元。即是进程调度器。
调度器分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。
调度器分配的时间也不能太短,每次调度会导致上下文切换,这种切换开销很大。
调度器的结构:
进程调度并不是什么时候都可以,前面也说过,系统会有一个周期调度器,根据频率自动调用schedule_tick函数。其主要作用就是根据进程运行时间触发调度;在进程遇到资源等待被阻塞也可以显示的调用调度器函数进行调度;另外在有内核空间返回到用户空间时,会判断当前是否需要调度,在进程对应的thread_info结构中,有一个flag,该flag字段的第二位(从0开始)作为一个重调度标识TIF_NEED_RESCHED,当被设置的时候表明此时有更高优先级的进程,需要执行调度。另外目前的内核支持内核抢占功能,在适当的时机可以抢占内核的运行。
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
Android Http 标准框架,底层 OkHttp,与 RxJava 完美结合,比 Retrofit 更简单易用。
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 使用MSDN Windows10 32位旗舰版为源盘制作,新增AMD四核CPU优化补丁,支持新型号主板开启SATA AHCI/RAID安装,支持I5、I7、I9平台。系统针对最新主流高端配置机型进行优化,专业驱动匹配,另外,PE中的部分破解软件可能会被个别杀毒软件误报,用户可放心使用。 系统更新优化 1、系统启动出错禁止弹出错误信息。 2、开启自动刷新、自动释放不使用的DLL。 3、关闭Smartscreen应用筛选器。
通常网站或平台为了安全性考虑,会增加验证码的功能,以防遭遇恶意机器注册或软件暴力对密码刷字典破解,这里采用的是google的kaptcha进行了简单封装;创建验证码图片操作工具类; pom.xml增加jar依赖 <!-- 成生图片验证码依赖 --> <d...
我想,看到我这篇文章的,一定和我一样是一名程序员。那就请你耐心的读下去,然后问问自己,你是“程序员”么? 随着整个时代的进步,计算机不断的侵入着人们的生活,伴随而来的是大批大批(你可以停下来想想,这个大批现在有多大)的程序员,可以说是个大学,学院就要开一个计算机专业/软件专业。更别提,这几年如雨后杂草般冒出来的IT培训机构。很多程序员们都会自嘲为“码农”,“代码民工”等等。多多少少有...
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 ...
Android 启动的四种模式分析+图
错误没有这样的文件或目录,gdb如果错误消息来自emacs,则表示未安装 gdb . 要解决此问题,请安装 gdb . 请注意 gdb 不是emacs的一部分,它是一个单独的程序 . 如果你得到一个包的 gdb ,它通常是 gcc ,GNU编译器集合的一部分,而不是Emacs . 来源是相同的 - FSF(自由软件基金会)/ GNU项目(GNU不是Unix),但它是不同的/单独的包 .如果错...
工业交换机因为应用及市场定位的关联,差别于普通交换机,它更关心可靠性,稳定性,耐热,耐震动,抗腐蚀等一些工业生产特点。工业生产以太网交换机因其较高的防护等级(一般IP40)、较强的电磁兼容性(EMS 四级)、好的工作特性而运用在一些自然环境标准严格的制造业当场,为工业生产通讯给予充分的确保。工业交换机具体应用在智慧能源、城市轨道、综合管廊、智能交通、聪慧城市、挖矿冶金工业、原油石油化工、新能源技术、智能工厂、船只、军用、楼宇安防等行业。电力行业现如今社会发展电力工程已变成日常生活不可缺少的一部.
在实际开发中,我们常常会用到线程池,但任务一旦提交到线程池之后,如果发生异常之后,怎么处理? 怎么获取到异常信息?而不是任务提交之后,消失的无影无踪。要知道以上答案,先看下 线程池里面的线程发生异常之后会发生什么。我们先通过工具类Executors创建一个简单的线程池,里面核心线程数为1 ExecutorService executorService=Executors.newFixedT...
|--需求说明|--实现方式在run()方法里面写一个while循环,循环体里面执行一个加过synchronized的方法,这个方法下面加一个判断语句,当线程名为“黄牛党”的时候,退出这个线程|--代码内容 1 package cn.thread1; 2 3 import java.util.Enumeration; 4 ...
在postGresql中如果关键字和自定义的字段重名即使使用[ ](中括号)或者 ' '(单引号)都没有用,经本人实验。如果使用" "(双引号),则可以。转载于:https://www.cnblogs.com/sparkbj/p/6952841.html...