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

网站模板 商标wordpress添加作者信息

网站模板 商标,wordpress添加作者信息,比较火的小程序购物平台,网页设计案例收集目录 一、通过系统调用创建进程-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.dnsts.com.cn/news/190346.html

相关文章:

  • 河源哪里做网站wordpress修改文字内容
  • 自己网站建设容易吗网页制作模板和库的联系与区别
  • 长沙模板网站长沙网站建设江苏城乡建设职业学院网站
  • 如何夸奖客户网站做的好做网站需要下载哪些软件
  • 安康网站设计百度投放广告流程
  • 周口网站建设73data怎么创建一个平台
  • wordpress建站博客北京国贸网站建设
  • 婚纱网站页面设计图片哪些网站可以下载视频
  • 单网页网站制作重庆营销网站建设
  • 怎么做网站注册登入页面四川电大住房和城乡建设厅网站
  • 如何做聚合类网站珠海哪个建设网站建设好
  • 大连网站建设好的公司南京网站设计哪家公司好
  • 广州网站设计制作公司重庆装修公司十大排名
  • 网站推广联盟双鱼儿 网站建设
  • 新媒体营销岗位招聘四川最好的网络优化公司
  • 企业商城网站建设方案旅游网站制作教程
  • 虚拟空间软件下载网站排名优化的技巧
  • 全球最新数据消息网站优化软件排名优化
  • 中国中建设计集团有限公司网站什么平台可以做引流推广
  • 腾讯云wed服务器做网站建站方法
  • 儒枫网网站建设江苏省建设工程网
  • 定制化网站开发报价wordpress如何设置页面布局
  • 做网站台式还是笔记本网站开发好还是app好
  • 苏州做网站陕西省安康市建行 网站
  • 东莞网站建设营销的企业广州工商局官网
  • 常熟制作网站的地方学生管理系统 网站开发
  • 公积金门户网站建设方案wordpress 明月浩空
  • 厦门市建设与管理局 官方网站成都住建局官网怎么查询楼盘剩余房
  • 遇到灾难网站变灰怎么做广州营销型网站制作
  • 企业网站建设报价单网站建设 成都今网科技