苏州建设企业网站,如何做网站走查,做厨柜有招聘网站吗,广东东莞邮政编码文章目录基本概念与关键数据结构进程管理进程生命周期进程的关系进程家族树线程组进程组与会话进程的创建与终止Linux中的线程基本概念与关键数据结构 进程#xff1a;静态的#xff0c;存储在磁盘上的代码与数据。 程序#xff1a;动态的#xff0c;执行程序的动态过程静态的存储在磁盘上的代码与数据。 程序动态的执行程序的动态过程资源分配的基本单位。 线程调度的最小单位。 Linux内核把进程列表存放在叫作任务队列(task list)的双向循环链表中。这个双向循环链表重的每一项都为task_struct、称为进程描述符(process descriptor)的结构。该结构的定义在linux/sched.h中可以查看。一个task_struct在32位机器上大约为1.7KB其中存储了一个进程状态进程关系等关键信息。
Linux内核进程描述符task_struct存储了进程正常运行其功能所需要的信息其中包括
进程属性相关信息 state状态pid进程标识符flagsexit_code/exit_signal进程间的关系real_parent, children, sibling, group_leader进程调度相关信息: prio, static_prio, normal_prio, rt_priority, sched_class, sc, rt, dl, polity, cpus_allowed内存与管理相关信息: mm, fs(文件指针files信号相关信息资源限制相关信息
进程管理
进程生命周期 进程有5种可能状态(ps:可以写一个这5种状态互相转换的代码
TASK_RUNNING: 可运行态正在运行或在就绪队列中TASK_INTERRUPTIBLE可中断睡眠被阻塞等待资源TASK_UNINTERRUPTABLE不可中断睡眠对信号没有反应_TASK_STOPPED终止态EXIT_ZOMBIE僵尸态进程已消亡但task_struct结构未释放
进程的关系
进程涉及的关系有3种
进程家族树线程组进程组与会话
进程家族树
线程组
一个线程组中所有线程和该线程组主线程具有相同标识符即其pid它被存入task_struct数据结构的tgid字段。同一个线程组的线程通过进程间通信来共享数据。调用getpid()返回当前进程组的tgid而非每个线程的pid。(ps:这意味着使用getpid()不会把所有线程都返回回来。
进程组与会话
一个进程组由进程组的leader的pid唯一标识。同时多个进程可以构成会话该会话由领导进程的pid唯一标识。
proc1 | proc2
proc3 | proc4 | proc5 这里proc1和proc2是一个后台进程组proc3-proc5是一个前台进程组它们同属一个会话均在同一个终端运行。
进程的创建与终止
ps: 这部分代码再多看看
进程创建包括fork()和execve()函数族。 进程终止包括wait()、waitpid()、kill()、exit()函数族。 为了提升效率fork()又拓展为vfork()和clone()。vfork() 通过保证子进程先运行避免复制浪费从而提升fork的效率。 进程终止有2种方式
主动调用函数终止 main函数返回链接程序会主动添加exit()系统调用主动调用exit() 被动接收终止信号或异常终止 接收无法处理的信号产生异常收到SIGKILL等终止信号
Linux中的线程
linux中线程与进程都由task_struct实现不同的是线程被视为一个与其他进程共享资源的轻量级进程。