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

网站模板 商标遂宁市做网站的公司

网站模板 商标,遂宁市做网站的公司,邯郸seo,app制作软件手机版下载目录 一、通过系统调用创建进程-fork 1.fork的介绍 2.fork的理解 3.fork常规用法 4.fork的三个问题 5.创建多个子进程 二、进程状态 #xff08;1#xff09;Linux内核源代码 #xff08;2#xff09;进程的状态 R运行状态(运行态#xff09; S 睡眠状态1Linux内核源代码 2进程的状态  R运行状态(运行态 S 睡眠状态sleeping和 D 磁盘休眠状态disk sleep T 停止状态stopped Z 僵尸状态zombie-- 僵尸进程  孤儿进程 三、进程优先级  1基本概念 2查看进程优先级的命令 一、通过系统调用创建进程-fork 1.fork的介绍 平时创建进程一般是通过 ./myproc 运行某个存储在磁盘上的可执行程序来创建。而我们还可以通过系统调用接口来创建进程。 pid_t是无符号整型。我们先看一段代码。 1 #includestdio.h2 #include unistd.h3 int main()4 {5 printf(I am a father: %u\n, getpid());6 fork();7 8 while(1)9 {10 printf(I am a process, pid: %u, ppid: %u\n, getpid(), getppid());11 sleep(1);12 }13 14 return 0; 15 } pid为31318即为创建的子进程id 当我们查看进程 此时有三个进程分别为父进程和fork创建的子进程和grep进程 2.fork的理解 从代码的角度看 父子进程共享用户代码代码是只读的不可写而用户数据各自私有一份为了不让进程互相干扰采用写时拷贝技术。 fork 之后子进程会被创建成功然后父子进程都会继续运行但谁先运行是不确定的由系统调度优先级决定。 从内核的角度看  对于操作系统来说通过fork后系统多了一个进程。 具体是fork后以父进程为模板操作系统创建新的PCB把父进程PCB的内容属性拷贝过来他们共享代码和数据。 3.fork常规用法 我们创建子进程的目的是为了让子进程给我们完成任务所以 fork 之后通常要用 if 进行分流让父子进程执行不同的代码实现一个并行的效果。比如父进程播放音乐子进程下载文件 通过 fork 的两个返回值来进行分流 如果 fork 执行成功在父进程中返回子进程的 pid在子进程中返回 0。如果 fork 执行失败在父进程中返回 -1不创建子进程并适当地设置 errno。 #include stdio.h #include sys/types.h // getpid, getppid #include unistd.h // getpid, getppid, forkint main() { printf(Im a father: %u\n, getpid());pid_t ret fork();if (ret 0){ // child processwhile (1){printf(child process, pid:%u, ppid:%u\n, getpid(), getppid());sleep(1);}}else if (ret 0){// father processwhile (1){printf(father process, pid:%u, ppid:%u\n, getpid(), getppid());sleep(1);}}else{// failureperror(fork);return 1;}return 0; } 这一份代码为什么会出现父进程和子进程一起循环呢 这里给大家抛出三个问题 fork为什么有两个返回值为什么上述代码中fork 的返回值 ret 有两个值既等于 0 又大于 0 呢fork 之后父子进程如何做到共享用户代码如何做到用户数据各自私有的呢如果 fork 执行成功为什么在父进程中返回子进程的 pid在子进程中返回的是 0 呢 4.fork的三个问题  1两个返回值问题 fork函数一直往下执行 在执行到最后ret之前子进程已经被创建出来了在上面我们说父进程和子进程的代码是共享的那么这个return ret是不是一份代码呢答案肯定是的那么是代码子进程也会执行return ret。所以这就是为什么有两个返回值 2一个变量为什么会存在两个值呢  这个在我们后面讲进程地址空间的时候会给大家介绍暂时不多做解释。 3) 为什么在父进程中返回子进程的 pid在子进程中返回的是 0 呢 举一个例子一位父亲有很多孩子那么该怎么辨别这些孩子呢这就需要给孩子标识并记住它。而每个孩子只有唯一一个父亲所以能很好的辨别父亲。 所以在父进程中需要返回子进程的 pid因为得让父进程知道自己的子进程儿子是谁。 而子进程只需要知道自己被创建成功了就行所以在子进程中返回 0 即可。 5.创建多个子进程  #include stdlib.h68 void runchild()69 {70 int cnt10;71 while(cnt)72 {73 printf(i am a child:%d,ppid:%d,getpid(),getppid());74 sleep(1);75 cnt--;76 }77 }78 int main()79 {80 int i0; 81 for(i0;i5;i)82 {83 pid_t idfork();84 if(id0)85 {86 runchild();87 exit(0);88 }89 sleep(100);90 }91 }二、进程状态  进程的状态体现一个进程的生命状态。 1Linux内核源代码 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运行状态running: 并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里。 S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠 interruptible sleep。 D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的进程通常会等待IO的结束。 T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。 X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态 2进程的状态  R运行状态(运行态 当我们写一段代码为什么状态时是S而不是R呢 因为CPU的运行速度非常快而进程绝大多数时间都在休眠(sleep1只有极少数的时间在运行 。因为 printf 是往显示器上打印涉及到 IO所以效率比较低该进程需要等待操作系统把数据刷新到显示器中。 那有一个问题了如果该进程的状态是R那它一定在CPU上运行吗 不一定在CPU上运行一定是R状态但一个进程状态是R也有可能在运行队列中。  如果想看到R状态我们只需要写一个while1即可。 S 睡眠状态sleeping和 D 磁盘休眠状态disk sleep S休眠状态sleeping也可以叫阻塞状态 表示进程虽然是一种休眠状态但随时可以接受外部的信号处理外部的请求被唤醒。 当键盘还未输入数据时却在内存中如图在等待队列中等待可以叫做阻塞状态可以随时接受外接的信号被唤醒。 当在等待队列中如果操作系统内部的内存资源严重不足时在保证正常的情况队列中只存在PCB把对应的代码和数据返回到外设中当存在响应的时候再把代码和数据换入再放到运行队列中。这种状态叫做挂起状态  D磁盘休眠状态disk sleep深度休眠  比如进程 A 想要把一些数据写入磁盘中因为 IO 需要时间所以进程 A 需要等待。但因为内存资源不足在等待期间进程 A 被操作系统 kill 掉了而此时磁盘因为空间不足写入这些数据失败了却不能把情况汇报给进程 A那这些数据该如何处理呢很可能导致这些数据被丢失操作系统 kill 掉进程 A 导致了此次事故的发生。所以诞生了 D 状态不可以被杀掉即便是操作系统。只能等待 D 状态自动醒来或者是关机重启 S状态和S状态有什么区别呢 S 状态表示前台进程。前台进程一旦运行bash 就无法进行命令行解释使用 CtrlC 可以终止前台进程 S 状态表示后台进程。后台进程在运行时bash 可以进行命令行解释使用 CtrlC 无法终止后台进程 T 停止状态stopped 我们可以通过kill命令让进程进入T状态也就是停止状态停止运行了。 举个例子 我们给进程发 19 号信号 SIGSTOP可以让进程进入 T 停止状态。停止运行。 我们给进程发 18 号信号 SIGCONT可以让进程停止 T 停止状态。恢复运行。 Z 僵尸状态zombie-- 僵尸进程  我们先看一段代码 #include stdio.h #include stdlib.h // exit #include sys/types.h // getpid, getppid #include unistd.h // getpid, getppid, fork, sleepint main() {// 创建5个子进程for (int i 0; i 5; i){pid_t ret fork();if (ret 0){// child processprintf(child%d, pid:%u, ppid:%u\n, i, getpid(), getppid());sleep(1);exit(1); // 子进程退出}}getchar(); // getchar()目的是不让父进程退出则无法回收子进程。return 0; } 成功创建了 5 个子进程。但程序会一直卡在这里不会自己退出。 我们发现五个子进程全部变僵尸进程了(Z状态  那什么是僵尸状态呢 要知道进程退出一般不是立马就让操作系统回收进程的所有资源。 因为创建进程的目的是为了让它完成某个任务和工作。当它退出时我们得知道它把任务完成的怎么样所以需要知道这个进程是正常还是异常退出的。 如果进程是正常退出的那么交给进程的任务有没有正常完成呢 所以进程退出时会自动将自己的退出信息保存到进程的 PCB 中供 OS 或者父进程来进行读取。 进程退出但父进程还没有读取进程此时就处于僵尸状态。 读取成功后该进程才算是真正的死亡变成 X 死亡状态。 僵尸状态的概念 僵死状态Zombies是一个比较特殊的状态。当子进程退出并且父进程没有读取到子进程退出时的返回代码时就会产生僵死(尸)进程。父进程使用系统调用 wait() 让 OS 回收子进程僵死进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出代码。所以只要子进程退出父进程还在运行但父进程没有读取到子进程状态子进程就会进入 Z 状态。 父进程通过调用 getchar() 函数来等待用户输入这样做可以防止父进程过早退出在大多数情况下这也意味着父进程不会立即回收结束的子进程资源因为没有调用 wait / waitpid 函数来等待子进程结束。 虽然父进程通过 getchar() 等待但这并不是处理僵尸进程已结束但未被父进程回收的子进程的正确做法。在实际应用中父进程应该使用 wait / waitpid 函数来等待子进程结束并回收它们的资源以避免僵尸进程的产生。进程处于Z状态资源会被一直占用进程相关资源task_struct不能被释放导致内存泄漏。等后面给大家介绍进程等待能很好的解决内存泄露问题。 孤儿进程 若子进程先退出父进程没回收则子进程为僵尸进程。 若父进程先退出子进程将被1号进程领养父进程改为1号进程子进程称作孤儿进程。 我们能看到父进程退出后子进程的父进程变成了1。  我们能看到1号进程就是我们的操作系统。 三、进程优先级  优先级 vs 权限两者有什么区别呢 优先级在资源有限的前提下确立多个进程中谁先访问资源谁后访问资源。权限决定能不能得到某种资源。 1基本概念 在 Linux 或者 Unix 系统中使用命令 ps -al 查看当前系统进程的信息 PRI优先级值越小优先级越大。NInice进程优先级的修正数据范围调整[-20,19]。UID用户的ID名执行者ID。 进程新的优先级PRI(new) PRI(old, 默认都是 80) nice 优先级不可能一味的高也不可能一味的低。因为 OS 的调度器也要考虑公平问题。进程的 nice 值不是进程的优先级他们不是一个概念但是进程的 nice 值会影响到进程的优先级变化。 2查看进程优先级的命令 通过 top 命令类似于 Windows 的任务管理器更改已存在进程的 nice 执行 top 命令后按 r 键输入进程的 PID输入 nice 值。 每次输入 nice 值调整进程优先级都是默认从 PRI 80 开始调整的。 输入的 nice 值如果超过 [-20, 19] 这个范围默认是按照最左/最右范围来取的。 为什么每次都要默认从 PRI 80 开始调整呢 有一个基准值方便调整。在设计上实现比较简单。 为什么 nice 值的范围是 [-20, 19] 呢 是一种可控状态保证了进程的优先级始终在 [60, 99] 这个范围内保证了 OS 调度器的公平。但公平并不是平均。根据每个进程的特性尽可能公平的去调度它们而不是指每个进程的调度时间必须完全一样。  竞争性系统进程数目众多而 CPU 的资源很少甚至只有一个所以进程之间是具有竞争属性的。为了更高效的完成任务更合理的竞争相关资源便有了优先级。独立性多进程运行需要独享各种资源多进程运行期间互不干扰。这也是 OS 设计进程的一个原则并发多个进程在一个 CPU 下采用进程切换的方式在同一段时间内让多个进程都得以推进。描述的时间段并行多个进程在多个 CPU 下同时运行。描述的是时刻任何一个时刻都可能有多个进程在运行
http://www.eeditor.cn/news/126620/

相关文章:

  • 文章类网站后台1个空间做两个网站
  • 行业网站设计公司用html5做课程教学网站
  • 建设银行企业网站首页新开网站seo
  • 潍坊网站建设熊掌号汽车保养网站模板
  • 网站技术支持是什么山东定制版网站建设公司
  • 建设信用卡申请官方网站建网站投放广告赚钱
  • 哈尔滨网站建设网络优化重庆免费网站推广软件
  • 大连网站开发 简维科技深圳做营销网站制作
  • 哪家建设公司网站网站建设进度汇报
  • 网站开发有前途么c2c模式在我国开始于1999年的
  • 楚风网站建设工作室wordpress怎么写接口
  • 内江建设局网站陕西煤化建设集团铜川分公司网站
  • 打开有些网站显示建设中搭建网站要用到的工具
  • 找最新游戏做视频网站有哪些2014网站seo
  • 专业酒店建设信息网站西安好的设计公司
  • 德州哪里有学做网站的手机版网页制作软件
  • 手机网站metaasp网站合法
  • 团购网站怎么运营网站制作公司小邓
  • 如何提高网站的用户粘度玉溪建设网站
  • 衡阳退休职工做面膜网站126企业邮箱注册申请
  • 网站版面布局设计的原则厦门建设局官方网站
  • 海洋网络提供网站建设做美食网站的目的
  • 网站验收流程成都百度推广联系方式
  • 医院网站建设策划方案wordpress利用视频引流
  • 网站做整站做优化18款禁用软件黄a免费
  • 网站建设技术线路选择安阳网站制作价格
  • 开一家网站建设公司要多少钱网页制作公司介绍图片
  • 优秀网页设计网站中英文网站建设 大概要多久
  • 怎么看网站关键词排名如何制作大气网站
  • 宁波专业网站营销wordpress dux使用