当前位置: 首页 > news >正文

广州 网站建设 行价软件大全

广州 网站建设 行价,软件大全,网站规划建设与管理维护答案,wordpress在线扫描文章目录 前言一.进程状态 进程的优先级二.环境变量总结前言 本篇文章是接着上一篇【linux】:进程概念的后续#xff0c;对于有基础的同学可以直接看这篇文章#xff0c;对于初学者来说强烈建议大家从上一篇的概念开始看起#xff0c;上一篇主要解释了冯诺依曼体系以及操…   文章目录 前言一.进程状态    进程的优先级二.环境变量总结前言 本篇文章是接着上一篇【linux】:进程概念的后续对于有基础的同学可以直接看这篇文章对于初学者来说强烈建议大家从上一篇的概念开始看起上一篇主要解释了冯诺依曼体系以及操作系统的概念还有在linux系统中进程是什么样的如何去查看一个进程如何给一个进程多开一个子进程以及为什么fork()函数可以有两个返回值的问题。 一、进程状态 为了能更深刻的理解linux中的进程状态我们把linux中的内核源代码拿出来看一下 /* * The task state array is a strange bitmap of * reasons to sleep. Thus running is zero, and * you can test for combinations of others with * simple bit tests. */ static const char * const task_state_array[] { R (running), /* 0 */ S (sleeping), /* 1 */ D (disk sleep), /* 2 */ T (stopped), /* 4 */ t (tracing stop), /* 8 */ X (dead), /* 16 */ Z (zombie), /* 32 */ }; task_struct是一个结构体内部会包含各种属性其中就包括状态如下图 我们先来讲解阻塞和挂起这两个重要的概念阻塞就是进程因为等待某种资源就绪而导致的一种不推进的状态。我们经常可以看到不管是手机还是电脑当打开的软件很多的时候就有出现应用卡顿的情况这是因为当我们打开很多的软件的时候进程也变多了操作系统调度不过来了这个时候卡的那个进程就是阻塞了。再比如说我们下载一个软件下载了一半没网了这个时候下载进度就不动了这个时候这个进程就变成了阻塞状态只有当网络好了能继续下载了CPU才会继续调度这个进程所以这个进程卡住了是在等待某种资源就绪当资源就绪了就会被CPU调度取消阻塞状态。所以进程要通过等待的方式等具体的资源被别人用完之后再被自己使用。那么进程等待某种资源就绪的过程中资源指什么呢这里的资源指软硬件资源比如磁盘显卡网卡等各种外设。下面我们用图解释一下阻塞的过程 我们前面讲过操作系统对于软硬件的管理是先描述在组织所以对于网卡磁盘等也是通过struct来描述的当CPU正在跑一个进程的时候这个进程突然没网了这个时候就将这个进程先变成阻塞状态然后看下图 这个时候因为网络的问题进程需要等待网络恢复才能继续在CPU上运行所以这个进程就会链接在网卡的尾部等待网卡资源就绪也就是网络恢复才可以正常运行。所以PCB是可以被维护在不同的队列中的。 阻塞阻塞就是不被CPU调度。一定是因为当前进程需要等待某种资源就绪。一定是进程task_struct结构体需要在某种被OS管理的资源下排队。 下面我们解释一下挂起的概念 上图是一个进程正在被CPU调度然后突然没网了看下图 这个时候进程进入阻塞状态等待网卡设备就绪由于内存中空间有限所以对于阻塞状态的进程的代码和数据来说无疑是浪费空间的所以操作系统会先将阻塞状态的进程的代码和数据放入磁盘中将内存中的代码和数据释放掉。 等过了一段时间网卡设备就绪了这个时候进程会继续被CPU调度在这之前需要把磁盘中的代码和数据继续放入内存中 以上的将代码和数据先放入磁盘等待网卡设备就绪然后就绪后再将磁盘中的代码和数据放入内存的过程就叫做挂起。 在这里问一个问题进程是R状态一定是在CPU上运行吗答案是不一定。进程一般是什么状态要看这个进程在哪里排队看下图 首先我们创建一个.c文件然后写一个死循环代码然后创建Makefile文件 接下来我们直接运行并且查看当前进程状态 我们先用ps axj | head -n1指令调出进程属性然后后面加上grep mytest过滤出mytest可执行程序的进程后面加的grep -v grep是过滤掉grep自己本身的进程最后成功的显示出这个进程我们可以很清楚的看到这个正在运行的程序的状态并不是R而是SS代表休眠状态接下来我们将打印注释掉试一下是什么状态 我们可以看到当将打印代码注释掉后这个进程的状态变成了R这个时候为什么是运行状态了呢因为printf打印需要打印到屏幕上而屏幕就是一种外设频繁的往屏幕打印进程会等待屏幕就绪才可以打印而CPU的运算非常快外设的速度却很慢所以CPU早就跑完了代码接下来将进程状态设为阻塞状态让这个进程去屏幕后面等待屏幕就绪当屏幕就绪后又会重新被CPU调度然后执行重复的操作。 所以进程是R状态不代表进程在运行而代表该进程在运行队列中排队。 S状态是休眠状态可中断休眠。而S状态就是一种阻塞状态。 接下里我们演示一下首先修改一下代码 这个时候我们去看进程状态。 为什么是S状态呢因为进程会等待键盘资源就绪也就是说只有键盘输入了才叫键盘资源就绪这个时候才会被CPU调度  当我们终止程序后程序就结束了这个进程也结束了对应了S状态是可中断休眠状态。 D状态也是一种休眠状态D状态是不可休眠状态。D状态在生活中我们基本不会遇到就是磁盘基本快满了还在往磁盘存数据这个时候你就会发现你的电脑非常卡而且不能强制进行任何关闭操作如果关电源会导致资料丢失所以不可中断只能等磁盘自己恢复。 T状态叫暂停状态下面我们来演示一下T状态 我们先讲代码修改一下方便演示 运行后我们可以看到这个时候的进程状态为S这个时候我们使用一个暂停命令 19号这个命令sigstop为暂停然后我们使用一下 这个时候我们能很清楚的看到进程变为T状态了并且程序确实暂停了这个时候我们如何恢复运行呢 这里的18号代码为sigle continue的简写就是继续的意思 这个时候程序就又可以继续了。但是我们发现这个时候我们用ctrlc关不掉了并且进程状态也变了。 从原来的S变成了S为什么就不能终止程序了呢因为状态后面带号是代表程序在前台运行在前台运行的程序可以ctrl  c结束没有就变成了在后台运行这个时候我们只能通过kill命令杀掉这个进程。 这个时候程序就结束了不管是前台或后台我们都可以用kill杀掉。 X状态被称为死亡状态Z状态称为僵尸状态下面我们解释一下这两个状态 为什么我们要创建进程呢因为我们需要进程为我们做事我们写过C语言代码知道每个main函数没必须返回0这是因为我们要知道函数的结果如果没有返回值我们就无法确定一个函数是否允许所以我们需要进程的返回值来确定进程的状态。那么如果一个进程退出了立马变成X状态作为这个进程的父进程有没有机会拿到结果呢linux当进程退出的时候一般进程不会立即彻底退出而是要维持一个状态叫Z也叫作僵尸状态方便后续父进程OS读取该子进程退出的退出结果。那么如何看到僵尸状态呢子进程退出但是不要回收子进程。下面我们演示一下 这个时候两个进程都处于S状态根据我们刚刚所说的只要让子进程先退出就能看到僵尸状态。 我们可以清楚的看到当我们将子进程杀掉后子进程的状态变成了Z也就是僵尸状态在mytest后面的单词defunct这个单词就有死人的意思那么僵尸状态在这会占用资源吗答案是会的维持僵尸状态会占用资源僵尸状态必须释放如果这样的僵尸状态很多那么机器就很容易卡死。而维护僵尸状态的意义就是让父进程能够读取子进程退出的信息。 僵尸状态的危害 僵死状态Zombies是一个比较特殊的状态。当进程退出并且父进程使用wait()系统调用没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出状态代码。 所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程进入Z状态进程的退出状态必须被维持下去因为他要告诉关心它的进程父进程你交给我的任务我办的怎么样了。可父进程如果一直不读取那子进程就一直处于Z状态。 维护退出状态本身就是要用数据维护也属于进程基本信息所以保存在task_struct(PCB)中换句话 说Z状态一直不退出PCB一直都要维护。那一个父进程创建了很多子进程就是不回收是不是就会造成内存资源的浪费是的因为数据结构对象本身就要占用内存想想C中定义一个结构体变量对象是要在内存的某个位置进行开辟空间 内存泄漏?是的 刚刚我们看到子进程先退就变成僵尸了下面我们看看父进程先退会怎么样。  我们将代码修改一下方便观察下面我们用命令观察一下 我们先用shell编程每隔1秒监测一下进程。然后将进程跑起来 我们可以看到一开始有两个进程当父进程结束后只剩下了子进程这个时候我们发现子进程的状态从S变成S了也就是说从前台变成后台了。 我们可以看到这个时候已经不能用ctrlc终止程序了只能用kill杀掉子进程。那么为什么父进程先退出的时候没有变成僵尸呢这是因为这个先退出的父进程被他的父进程回收了他的父进程就是bash。怎么证明呢在上图中我们发现pid为15529的进程的父进程一开始为15528当15528退出的时候15529这个子进程又重新给自己找了个爹pid为1pid为1的进程我们都知道这就是操作系统也就是说父进程退出子进程会被OS自动领养通过让1号进程成为新的父进程那么这个被领养的进程就被称为孤儿进程。那么为什么我们上面演示子进程退出的时候子进程变成僵尸状态了呢因为上面我们为了演示出僵尸状态故意没有将代码写完因为没有等待所以子进程变成了僵尸状态。那么为什么子进程会被自动领养呢因为如果不领养就导致没人能找到子进程一旦子进程退出就没人回收这个进程了那么这个子进程就是一种游离状态这样就会造成资源浪费也就是内存泄漏。 进程的优先级 cpu资源分配的先后顺序就是指进程的优先权。优先权高的进程有优先执行权力配置进程优先权对多任务环境的linux很有用可以改善系统性能。还可以把进程运行到指定的CPU上这样一来把不重要的进程安排到某个CPU可以大大改善系统整体性能。 优先级和权限有什么区别呢答案是权限代表了能不能的问题而优先级是你执行的先后顺序优先级已经确定了你可以干某件事只是取决于先后问题。那么为什么会有优先级呢因为CPU的资源有限。 我们可以用ps -l命令查看进程中的优先级如下 在上面的图片中PRI代表程序的优先级NI代表进程优先级的修正数据。PRI的值越小进程的优先级越高而NI值可以理解为是改变PRI的值从而修改进程的优先值。PRI新 PRI旧NI 而在linux系统中旧的PRI值一定为80。下面来演示一下 我们先随便写一个死循环程序然后运行起来。 可以看到程序已经跑起来了这个时候用top命令去修改优先级。top进入后输入RR就是renice的意思然后输入pid 接下里让我们输入nice值我们就调整为-20 我们可以看到确实成功修改了这个时候我们再修改为100 为什么是不是180呢因为我们优先级的调整范围是-20到19这个级别也就是说最小是-20最大是19。 进程的优先级在我们平时使用中都不会调整一般都会使用默认的优先级大家知道该怎么修改就可以了。 二、环境变量 环境变量一般是指操作系统中用来指定操作系统运行环境的一些参数比如我们在编写c/c代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。比如我们在linux中写的可执行程序要想这个程序先运行起来必须在前面就是 .   /   ,  . 是在当前路径/ 是路径分隔符而同样为可执行程序的 ls指令等却不需要在前面加上./难道就因为一个是被纳入系统的程序一个是我们自己写的吗其实并不是这样系统的指令之所以不需要在前面加./是因为有环境变量的帮助这个环境变量会帮我们去搜索系统中的ls命令而这个环境变量叫PATH下面我们查看一下这个环境变量 echo是打印一个字符串PATH是环境变量前面加上$符号就是获取环境变量的内容这里与指针解引用相似。 和环境变量相关的命令 1.echo:显示某个环境变量值 2.export:设置一个新的环境变量 3.env:显示所有环境变量 4.unset:清除环境变量 5.set:显示本地定义的shell变量和环境变量 我们之前讲过linux的指令which可以查看指令的路径通过查看我们发现ls指令在usr/bin中而PATH环境变量是根据冒号一个一个路径进行查找当找到usr/bin这个路径的时候就不需要我们在使用的时候加./了。那么如何将我们写的可执行程序添加到环境变量中呢看下图 我们写了一个程序用来演示。接下来我们用命令将我们写的这个程序加入到环境变量中 可以看到我们成功添加然后我们试试可以直接运行吗 我们看到是可以运行的并且不用在输入前面的./了 这个时候我们的其他指令不能使用该怎么办呢这时只需要重新登录xshell即可。 那么我们怎么样才能既使用系统的指令又用自己的呢 我们将刚刚的命令修改一下就可以既使用系统的指令又用自己的。当然除了这一种方式我们还可以直接将要添加的可执行程序的目录拷贝到PATH中而这种方式在linux中相当于软件的安装。 下面我们用env指令查看系统中的环境变量 我们可以看到系统中的环境变量很多当然我们也可以用history指令查看以往我们用过的指令 为什么从10开始呢因为history只会保留最新的1000条指令一旦超过就会删掉原来旧的指令。 下面我们用C语言来获取系统中的环境变量 我们再写c/c的时候从来没有写过main函数的参数而main函数实际上有3个参数这三个参数不需要我们手动去写编译器会默认给我们传参envp这个指针数组中每一个指针都指向一个有效的字符串而最后一个指针必须以NULL结尾。 然后我们将代码写完整如下图 为什么for循环中envp没有写判断呢因为我们刚刚说过envp这个指针数组中最后一个指针指向的一定是NULL而NULL在for循环中对应为假所以不需要写判断语句。 由于使用main函数的三个参数是c99标准下的所以我们在编译后面加上c99。 然后我们直接运行程序发现这里的环境变量与我们用env命令显示的一致。 总结环境变量本质就是内存级的一张表这张表由用户在登录系统的时候进行给特定用户形成属于自己的环境变量表。环境变量中的每一个都有自己的用途有的是进行路径查找的有的是进行身份认证的有的是进行动态库查找的有的是用来进行确认当前路径等等每一个环境变量都有自己特定的应用场景。那么环境变量对应的数据都是从哪来的呢是从系统的相关配置文件中读取进来的。下面我们验证一下 我们先用ctrl ~进入家目录然后输入指令ls -al查找文件 我们可以看到bash的两个shell脚本然后我们用vim打开这个脚本 我们用vim进入etc/bashrc注意在etc目录下bashrc是全局的。 比如我们命令行上的# 或者 $提示符就是这样编写的。  环境变量是通常具有全局属性的当我们写了一个环境变量val100然后这个环境变量就会shell的表中当我们给这个进程在开一个子进程的时候shell中的这张表也会交给子进程这样子进程中也就有了环境变量val100下面我们来证明一下 我们先自己导入一个环境变量然后输入env命令查看 我们看到确实将这个环境变量添加到系统中下面我们修改一下代码进行演示 getenv函数是获取一个环境变量并打印  我们从上图中可以看到成功获取到了我们自己设的环境变量我们前面讲过当我们运行一个进程的时候这个进程的父进程是bash刚刚我们的环境变量是保存在系统中也就是说只有bash可以访问但是现在这个子进程也可以使用就说明了环境变量是全局的会由父进程传给子进程。 我们定义了一个变量前面没有加export然后我们在前面加$符号打印其内容发现也能正常打印 下面我们用getenv获取一下这个环境变量 这个时候我们发现用函数获取环境变量获取不到我们刚刚定义的hello1也就是说不带export定义的环境变量是不可以被getenv()获取到的那么也就不可以被子进程继承那么为什么加了export就能被继承呢因为不加export定义的环境变量是不会被添加到环境变量表中这样的变量被称为shell的本地变量这种变量只能在shell内部有效。 因为hello1已经在shell本地了所以前面加export可以直接将hello1添加到环境变量表也就可以正常被子进程继承了。 接下来我们继续解释刚刚main函数的三个参数中的另外两个。 argv的使用与argc都有一个共同点就是不需要在判断结束条件。 如下图所示 -a -b其实是参数选项my2.24是可执行。那么这个操作有什么作用呢 #include stdio.h #include stdlib.h #include unistd.h #include string.h //int main() //{ // int cnt 10; // while (cnt--) // { // printf(这里在倒计时:%d\n,cnt); // } // return 0; //} void Usage(const char* name) {printf(\nUsage:%s -[a|b|c]\n,name);exit(0); } int main(int argc,char* argv[]) {if (argc!2) Usage(argv[0]);if (strcmp(argv[1],-a)0) printf(打印当前目录下的文件名\n);else if(strcmp(argv[1],-b)0) printf(打印当前目录下的详细信息\n);else if(strcmp(argv[1],-c)0) printf(打印当前目录下的文件名(包含隐藏文件)\n);else printf(其他功能待开发\n); //{ // for (int i 0;argv[i];i) // { // printf(argv[%d]-%s\n,i,argv[i]); // }return 0; } //int main() //{ // printf(myenv:%s\n,getenv(hello1)); // return 0; //}我们重新写一段代码然后我们运行起来。 启动软件后这个软件告诉我们使用方法是./my2.24  abc任意一个字符 这样就能完成一个类似于打印目录的操作这只是简单的演示实际上可以实现一些有用的东西。 总结 本篇文章相较于上一篇进程的概念多了很多需要实践的东西比如测试进程的优先级理解孤儿进程学会理解环境变量并且可以自己添加环境变量环境变量的获取环境变量的修改等。下一篇继续更深入的学习linux的进程即使进程这部分概念多也希望大家可以多多练习才能更深入的理解进程。
http://www.w-s-a.com/news/408873/

相关文章:

  • 重庆装饰公司北京官网seo推广
  • 深圳网站设计灵点网络品牌网站充值接口
  • 建设书局 网站国内国际时事图片
  • 成都 网站建设培训学校屏蔽wordpress自带编辑器
  • 公司网站制作工作室中天建设集团有限公司第五建设公司
  • 网站的网页设计毕业设计苏州宣传册设计广告公司
  • 商城网站优化方案注册公司制作网站
  • 政务服务网站建设整改报告wordpress的导航代码
  • 图片素材网站建设做教育网站用什么颜色
  • 快站淘客中转页wordpress商业插件
  • 可信网站网站认证免费软件下载网站免费软件下载网站
  • 小学生网站制作最新域名网站
  • 奖励网站代码设计制作ppt时
  • 茂名优化网站建设门户网站和部门网站的区别
  • 一尊网 又一个wordpress站点wordpress获取当前文章名称
  • 营销型网站多少钱新建网站的外链多久生效
  • 网站空间怎么选择tp5企业网站开发百度云
  • 网站建设saas排名成立公司的流程和要求及费用
  • 网站建设共享骨科医院网站优化服务商
  • 肯尼亚网站域名万能进销存软件免费版
  • 做商城网站价格上海做网站建设
  • 广州制作外贸网站公司阿里云网站模板
  • 做网站为什么要买服务器十堰城市建设网站
  • 西安网站seo技术厂家东莞如何制作免费的网页
  • 做旅游的网站的目的和意义极限优化wordpress
  • 做美食视频网站有哪些品牌营销策划机构
  • 佛山知名营销网站开发wordpress可视化编辑器排行
  • 石岩做网站哪家好石家庄做网站设计
  • 建设网站需要冠县做网站
  • 保定网站seo哪家公司好wordpress教程视频下载