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

动感网站模板wordpress 透明背景图片

动感网站模板,wordpress 透明背景图片,邯郸设计公司有哪些,seo外贸网站建设#x1f31f; 各位看官好#xff0c;我是#xff01; #x1f30d; Linux Linux is not Unix #xff01; #x1f680; 今天来学习Linux中理论上进程状态及linux中的进程状态是如何设计的。 #x1f44d; 如果觉得这篇文章有帮助#xff0c;欢迎您一键三连#xff0…  各位看官好我是  Linux Linux is not Unix  今天来学习Linux中理论上进程状态及linux中的进程状态是如何设计的。  如果觉得这篇文章有帮助欢迎您一键三连分享给更多人哦 理论进程状态 状态决定了进程接下来要做的工作就像我们人一样吃饱了才有力气干活 那么该怎样表示一个进程的状态呢 状态在我们看来实际上就是一个数字一个状态对应一个数字。 #define BUNNING 1 #define BLOCK 2 #define ... 3struct task struct {int status; } 理论上进程状态设计  但实际上Linux的设计与上图不是一模一样的因为理论是要用来指导实践的而实践当中必会碰到一些困难这些都是要进行修正的。 接下来我们来看看Linux的进程状态是如何设计的。 双链表链接进程 我们学习数据结构的时候是通过定义两个前后next和prev指针进行双链表的链接从而可以指向下一个进程的起始地址随意访问结构体里面的数据。 struct task_struct {struct list_node *next;struct list_node *prev;//... }而Linux中的源码设计并不是这样子的那它又是设计的呢 struct task_struct {struct list_node node;//... }struct list_node {struct list_node *next;struct list_node *prev; } linux中将prev和next进行封装也可以做到链表的前后链接但是并不是指向下一个进程的起始地址那又该如何随意访问结构体中的任意元素呢 既然我想要访问结构体中的任意元素那么我就要得到该结构体的起始位置从而做到访问任意元素的目的。 计算偏移量 为什么要这样做呢意义何在 我们实现的双链表再也与类型无关了!可以给每个CPU设置一个调度队列 运行状态 运行状态从计算机的硬件出发我们所写的代码在硬盘中要让程序运行起来就要加载到内存当中 每一个程序进程都会有一个属于自己的PCB通过PCB来进行排队等待CPU的调度为了方便调度管理操作系统会维护一个运行队列所有就绪状态的进程的PCB会被加入到这个队列当中 CPU在调度执行时就会通过这个运行队列拿到进程的PCB进而调度执行该进程在排队的时候就是运行状态。 我们说过输入、输出属于外设运算器、控制器属于CPU而这些都属于资源。而进程的本质是要竞争这些资源无疑就两类资源 CPU资源外设资源 有些人认为只有将PCB放在调度队列运行起来才能称作运行状态。 这里我们规定运行状态 --该进程的PCB必须处在CPU的调度队列runqueue中只要运行状态在调度队列中该进程就叫做运行状态 --随时等待CPU调度执行! 阻塞状态 阻塞状态在CPU执行一个进程的时候可能会需要访问系统的某些资源就比如在C语言中写的scanf()在使用这个函数的时候需要调用键盘等待键盘输入数据当进程需要键盘资源的时候会将进程的PCB加入到硬件设备结构描述的等待队列当中并且把PCB设置为阻塞状态当PCB在这个等待队列中等待数据资源时这个状态就叫做阻塞状态。 int main() {int a 0;scanf(%d,a);return 0; } 操作系统是软硬件资源的管理者那么它就需要管理硬件。那该如何管理硬件呢 先描述再组织 当程序跑到scanf时此时就会等待键盘的响应这就是典型的阻塞状态。 那如果键盘迟迟没有就绪呢 操作系统会直接把当前进程从调度队列runqueue里断链将PCB移动到键盘的结构体的等待队列里如上所示。而我们把这种等待设备资源 -- 这种状态称为阻塞状态 一旦键盘设备就绪时谁最清楚键盘上有数据呢?操作系统最清楚因为它是软硬件资源的管理者。此时会再把设备的等待队列放到CPU的调度队列中 本质上 从阻塞到运行:把设备的等待队列放到CPU的调度队列中从运行到阻塞:把CPU的调度队列放到设备的等待队列中 挂起状态阻塞/运行 内存资源是有限的而进程加载到内存是要消耗内存的。那么有没有一种可能内存资源会存在不足呢这显然有可能。 内存资源不足时操作系统是如何做的呢 阻塞挂起状态 操作系统在内存中发现有一些进程会很晚才会放到cpu中进行调度此时会将该进程的task_struct放入到设备的等待队列当中在这又不干啥占着内存资源的位置不如先给其他人运行等你就绪时再重新把你唤回到内存当中。 运行挂起状态  当内存资源严重不足时  挂起状态内存满负荷时又要增加新的进程显然是不行的。所以操作系统会观察内存中的哪些进程没有被放在任何一个队列里面(在内存里面啥也不干)找到以后就把此进程的代码和数据短期内置换到磁盘上仅保留此进程的PCB。腾出的这一块空间供新的进程使用。针对于这种情况操作系统会将阻塞进程的代码和数据置换到外设此时该进程的状态就被称为挂起状态其中阻塞进程的代码和数据一般会存放在磁盘的swap分区当进程被操作系统调度时被置换到外设的代码和数据又会重新加载到内存一般情况下swap分区的大小不会太大大概等于内存的大小过大的swap分区会导致操作系统过于依赖swap分区导致效率变低 Linux进程状态 为了弄明⽩正在运⾏的进程是什么意思我们需要知道进程的不同状态。⼀个进程可以有⼏个状 态在Linux内核⾥进程有时候也叫做任务。 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 */ }; R状态 R运⾏状态running: 并不意味着进程⼀定在运⾏中它表明进程要么是在运⾏中要么在运⾏ 队列⾥。 S状态 S睡眠状态 sleeping): 意味着进程在等待事件完成有时候也叫做可中断睡眠interruptible sleep简称 浅度休眠它能够响应外部的事件 。 int main() {while(1){printf(hello status\n);sleep(1);} } 在上面这段程序中按照我们的理解应该是R状态才对但我们看看下图结果。 不对啊不应该是R状态吗这是出错的吗实际并不是。 大部分时间都是显示器不就绪状态计算机一秒可能上亿次大量时间都在运行队列和显示器这个外设的这个等待队列里来回放(外设太慢了CPU很快)。大量打印在显示器本质在访问外设。  D状态 D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个 状态的进程通常会等待IO的结束。深度睡眠不能响应外部事件 在这里分享一段职场的小故事 进程要将用户的1GB数据含有1亿写入到磁盘中此时把自己设为s状态等待磁盘的反馈成功/失败。此时的情况是内存资源严重不足了操作系统本来因为内存资源严重不足而在烦恼看到该进程正翘着二郎腿、磕着瓜子占着内存资源的位置。本来就烦恼的操作系统看到该进程的行为更加来气说到我内存资源都快不足了你还有空再这吹着凉风为了保全自己二话不说直接把该进程杀掉了。此时磁盘正在写入用户的1GB数据但是以失败告终那么它就要向该进程反馈写入失败但是找不到该进程了啊该进程被操作系统杀掉了啊那么磁盘该不该丢掉这1GB数据呢该磁盘还要写入其他用户的数据不得不丢掉该用户得的1GB数据。 这段小故事中是谁犯错了呢 操作系统说没看到内存资源严重不足了吗如果我不杀掉该进程那么我们可能损失损失的价钱就不只1亿了。要问就去问进程和磁盘。 内存说我在将用户的1GB数据交给磁盘进行写入啊此时我再等待磁盘给我反馈结果你操作系统二话不说就把我杀掉了好意思说 磁盘说我只是执行进程吩咐给我的命令罢了此时我写入失败了向进程反馈结果但是找不到了啊。而我还有其他用户的数据需要写入啊我也不得不丢掉该数据这能赖上我 那么我今后赋予你这个进程一种能力叫做 D状态。你可以不被OS杀掉除非你自己醒来 T状态 T停⽌状态stopped 可以通过发送 SIGSTOP 信号给进程来停⽌T进程。这个被暂停的 进程可以通过发送 SIGCONT 信号让进程继续运⾏。 该指令可以向进程发出信号 停止状态  t状态 进程被追踪因为断点而停下来 可以看到实际上gdb是创建了个子进程进行调试 X状态 X死亡状态dead这个状态只是⼀个返回状态你不会在任务列表⾥看到这个状态。 Z状态 僵尸进程 为什么要创建进程?进程被创建出来就是为了完成任务的。 既然有创建那么就有销毁。因此进程结束是进程创建的反过程。 进程结束的时候我们需要知道任务完成的怎么样?因此不能立即释放进程的所有资源。 进程结束时需要现处于一种“僵尸状态”目的就是为了获取信息。代码数据会被释放掉但是会把task _struct保留。 为什么要保留task_struct呢 该进程记录着进程退出的退出信息方便父进程读取出退出码。 僵死状态Zombies是⼀个⽐较特殊的状态。当进程退出并且⽗进程使⽤wait()系统调⽤,后面讲没有读取到⼦进程退出的返回代码时就会产⽣僵死进程。僵死进程会以终⽌状态保持在进程表中并且会⼀直在等待⽗进程读取退出状态代码。模拟僵尸状态只要⼦进程退出而⽗进程还在运⾏但⽗进程没有读取⼦进程状态⼦进程就会进⼊Z状态。  孤儿进程 前面说的是子进程先退出了但父进程一直在运行没有读取子进程状态。 那如果父进程先退出了呢子进程又该怎么办呢 #include stdio.h #include unistd.h #include stdlib.hint main() {pid_t id fork();if(id 0){perror(fork);return 1;}else if(id 0){//childprintf(I am child, pid : %d\n, getpid());sleep(10);}else{//parentprintf(I am parent, pid: %d\n, getpid());sleep(3);exit(0);}return 0; } 僵尸进程危害 进程的退出状态必须被维持下去因为他要告诉关⼼它的进程⽗进程你交给我的任务我办的怎么样了。可⽗进程如果⼀直不读取那⼦进程就⼀直处于Z状态是的 维护退出状态本⾝就是要⽤数据维护也属于进程基本信息所以保存在task_struct(PCB)中换句话说Z状态⼀直不退出PCB⼀直都要维护是的 那⼀个⽗进程创建了很多⼦进程就是不回收是不是就会造成内存资源的浪费是的因为数据结构对象本⾝就要占⽤内存想想C中定义⼀个结构体变量对象是要在内存的某个位置进⾏开辟空间
http://www.dnsts.com.cn/news/189830.html

相关文章:

  • 网站中全景是怎么做的unity可以做网站吗
  • 实验教学中心网站建设网站页中繁体转移代码
  • 各种网站解决方案陕西省建设信息网站
  • 北京做网站软件wordpress生成站点地图
  • 做网站各个流程目前推广软件
  • 新浪门户网站是谁做的做网站怎么租个域名
  • 北京企业网站优化网站做edi认证有用没
  • 电子商务网站建设需要做好哪些准备惠州网站建设多少钱
  • 那些网站可以做反链大商创源码
  • 律师做网络推广最好的网站有哪些平凉哪有做网站的
  • 玩具网站建设在上海做家教的网站
  • 舞蹈东莞网站建设上海谷歌seo推广公司
  • 天猫与京东的网站建设管理浙江省住建厅四库一平台
  • 企业网站最底下做的是什么PHP网站开发有哪些框架
  • 做国外直播网站资兴市住房和城乡建设局网站
  • 网站首页被降权携程网站模板
  • 如何搭建网站eclipse模仿网站开发源代码
  • 备案网站制作上虞网站设计
  • 专门做高仿的网站手机网站建设语言
  • c 网站开发网易云课堂百度云下载wordpress 小程序源码
  • 教育网站如何做seo微网站界面设计基础
  • 陕西建设监理证书查询网站做网站学习
  • 视频网站直播怎么做红木家具网站模板
  • 中国交通建设网官方网站房地产网站建设
  • 在网上做效果图的网站大连省建设厅网站
  • 给缅甸公司网站做维护工作时间段做网站软文怎么弄
  • 单页网站在线生成产品销售网站模块如何设计
  • 温州网站建设优化公司网络营销思想的网站改版计划
  • 建材城电商网站建设百度seo排名优化公司
  • qq炫舞做浴缸的网站文创产品设计包括哪些方面