1:PCB进程控制块

Task_struct结构体,也就是PCB,存放着这个进程所需要的所有资源的结构的描述。

PCB管理:链表、树、哈希。

2:进程生命周期

六种状态:就绪态、运行态、停止态、深度睡眠态、浅睡眠态、僵尸态。

前三个好理解,主要是后三个:

深睡眠:进程处于睡眠态(调用sleep),等到资源到位,就可以被调度(变成就绪态TASK_RUNNING)。

浅睡眠:进程处于睡眠态(调用sleep),等到资源到位,或者收到信号,就可以被调度(变成就绪态TASK_RUNNING)。

僵尸态:父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息。在 wait 调用之后,僵尸进程就完全从内存中移除。因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。

正常的进程睡眠都是浅睡眠,但是内核中有一些进程处于睡眠态不希望被信号打断,那么它就会处于深睡眠状态。

3:folk创建子进程

举个例子:

int main() {fork();printf("hello\n");fork();printf("hello\n");while (1);return 0;
}

打印几个hello?

一分为2,打印2次;2分为4,打印4次;一共6次。

fork()函数的返回值是返回两次的,在父进程中返回子进程的pid,在子进程中返回0。利用分支识别:

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>int main(){pid_t pid;pid = fork();if(pid==-1){ /* 创建不成功 */perror("Can't creat new process");exit(1);}else if(pid==0){  /* pid==0,子进程运行代码 */printf("a\n");}else {     /* 父进程运行代码 */printf("b\n");}/* 父子进程都运行的代码 */printf("c\n");while(1);
}

Linux中编译执行:gcc 1.c -o 1

再:./1

结果:

b

c

a

c

分析:

父进程返回子进程pid(不为0)输出b,再输出c。

子进程返回0,输出a,再输出c。

4:子死父清场

例如:

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>int main(void)
{pid_t pid,wait_pid;int status;pid = fork();if (pid==-1)    {perror("Cannot create new process");exit(1);} else     if (pid==0) {printf("child process id: %ld\n", (long) getpid());pause();_exit(0);} else {
#if 1 /* define 1 to make child process always a zomie */printf("ppid:%d\n", getpid());while(1);
#endifdo {wait_pid=waitpid(pid, &status, WUNTRACED | WCONTINUED);if (wait_pid == -1) {perror("cannot using waitpid function");exit(1);}if (WIFEXITED(status))printf("child process exites, status=%d\n", WEXITSTATUS(status));if(WIFSIGNALED(status))printf("child process is killed by signal %d\n", WTERMSIG(status));if (WIFSTOPPED(status))printf("child process is stopped by signal %d\n", WSTOPSIG(status));if (WIFCONTINUED(status))printf("child process resume running....\n");} while (!WIFEXITED(status) && !WIFSIGNALED(status));exit(0);}
}

照样gcc 2.c -o 2

./2

输出:

ppid:5715

child process id: 5716

(别结束运行)

在另一终端查看父子进程:命令ps -lA

找到父子进程状态:

然后:

kill -9 5716

再查看状态:

子进程转为僵尸态了。

以上是在#if 1 的情况下

如果修改为 #if 0

那么再次编译运行   结果是:

child process id: 5901

(也别结束运行)

再另一个终端查看父子进程

kill子进程,发现运行的2程序结束运行了,且报告了原因

可以看出父进程可以通过waitpid()函数回收子进程的task_struct结构。

5:总结

这张六种状态图蛮重要,记录下来。

我是小狼程序员,希望在自己在计算机方面的知识懂的越来越多,技术越来越熟练。

欢迎大家加我qq交流:809291807

目前交流方向可以有:数据结构与算法、计算机操作系统、C++编程、Java编程、Linux等。

转载于:https://www.cnblogs.com/westlife-11358/p/10075271.html

Linux进程、线程、任务调度(1)贵在坚持相关推荐

  1. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  2. 32位linux进程线程在内存中的样子

    1.线程诞生史 1.1 线程诞生的原因 早期是没有线程概念的,只有进程的概念,操作系统以进程为调度单位.--可以这么来理解:早期进程相当于现在的单线程的进程(只有一个线程的进程,创建进程时,里面有一个 ...

  3. 观察Linux进程 线程的异步并发执行,操作系统linux版实验报告.doc

    操作系统linux版实验报告.doc (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 操作系统实验报告(Linux版)网络142 ...

  4. 【Linux进程/线程间通信】实现荔枝派zero与电脑串口通信

    本文采取两种方法来实现: <1>System V IPC 的消息队列(message queue) <2>有名信号量/灯的同步操作(semaphore) 一.System V ...

  5. linux进程线程视频百度云,linux 进程线程时间片

    aero 回复于:2003-08-10 21:01:44 偶觉得,已经不菜了. 如果你菜,那偶就还是鸟蛋了. coolhome 回复于:2003-08-10 20:27:00 [code:1:334e ...

  6. linux进程线程协程的区别,进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中也有协程库,tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区别. 一.概念 1.进程 ...

  7. linux进程线程同步之 - POSIX线程互斥锁

    POSIX线程互斥锁 使用范围:线程同步 本文转自:http://blog.csdn.net/jiebaoabcabc/article/details/37914769 一.函数介绍 1.初始化互斥锁 ...

  8. linux 进程线程拓展

    依次参考: 多线程和多进程的区别(小结) Linux内核源代码分析--fork()原理&多进程网络模型 Linux写时拷贝技术(copy-on-write) linux内核 do_fork 函 ...

  9. linux 进程线程限制,LINUX停每进程限制线程数量

    参考: http://stackoverflow.com/questions/344203/maximum-number-of-threads-per-process-in-linux 理论上相关限制 ...

  10. 【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

最新文章

  1. poj 3348(求凸包面积)
  2. SAP标准培训课程C4C10学习笔记(四)第四单元
  3. VBA中使用EXCEL工作表函数
  4. 小猿圈python之python期末考试测试题(二)_小猿圈python之练习题
  5. 关于空间复杂度,你可能有几个疑问?
  6. 致运维——运维军团告诉你如何走过七年之痒
  7. Java基于WEB的学生考勤管理系统
  8. Windows 程序设计应用开发(上部)
  9. SQLserver 获取当前时间戳
  10. 北京大学c语言题库,北大acm题库1002题
  11. 2022/8/8测试总结
  12. 总结下几个有漏洞第三方插件
  13. ASML的EUV光刻机卖不动?
  14. 最新AZ自动发卡网源码-全网首发
  15. i5处理器做java够用吗,一般的游戏玩家用i5处理器就够了,这是真的吗?
  16. 64位系统编译32位文件 -m32
  17. Word模板生成C#源码
  18. WinRAR 去广告的姿势
  19. Make Clobber 和 Make Clean
  20. 「 周末去哪儿」安卓版免费下载 - 豌豆荚

热门文章

  1. es6-3.webpack应用
  2. ieee trans pami latex模板
  3. 澜起科技加速中国本土数据中心解决方案进程
  4. 基于RPM包的LAMP搭建
  5. ROS(9):机器人开源项目poppy-project
  6. was日志报检测到cpu饥饿
  7. 【Daily】IE弹窗SQL分割字符串
  8. 20个开发人员非常有用的Java功能代码(一)
  9. ieee1284controller怎么添加打印机_讲述3D打印机怎么用 初学者必看
  10. 自定义Promise