目录
进程和程序的区别
1、进程是动态的,程序是静态的
2、进程的生命周期是相对短暂的,而程序是永久的
3、一个进程只能对应一个程序,一个程序可以对应多个进程
4、进程还具有并发性和交往性,而程序却是封闭的
linu的进程的5种状态
a.运行状态TASK_RUNNING(正在运行或在运行队列中等待[就绪队列])
b.中断状态TASK_INTERRUPTIBLE(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
c.不可中断状态TASK_UNINTERRUPTIBLE(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
d.僵死状态TASK_ZOMBLE(进程已终止, 但进程描述符存在, 直到父进程调用wait()系统调用后释放)
e.停止状态TASK_STOPPED(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
如何查看系统中进程
1.利用ps相关指令查看
ps 查看正处于Running的进程
ps -A 列出所有的进程
ps -w 显示加宽可以显示较多的资讯
ps -au 显示较详细的资讯
ps -aux 显示所有包含其他使用者的进程
查看指定进程可在命令后+ |grep+指定进程名
2.使用top指令查看
类似于windows的任务管理器,Linux的top命令用于实时显示进程的动态。
常用的top指令:
top 显示进程信息
top -c 显示完整命令
top -b 以批处理模式显示程序信息
top -S 以累积模式显示程序信息
top -n x设置信息更新次数//表示更新x次后终止更新显示
top -d x设置信息更新时间//表示更新周期为x秒
top -p xxxx显示指定的进程信息//显示进程号为xxxx的进程信息
top -n x显示更新x次后退出
什么是进程标识符:
每个进程都有一个非负整数表示的唯一ID,叫做pid,类似于身份证
pid=0:称为交换进程 作用:进程调度
pid=1:init进程 作用:系统初始化
可以通过编程调用getpid获取自身的进程标识符,调用ditppid获取父进程的标识符
具体如下:
#include <stdio.h>
//man 2 getpid查看头文件
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = getpid();
printf("my pid is:%d\n",pid);
while(1);
return 0;
}
编译运行之后使用top指令查看
c语言的存储空间如何分配
·正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其自身的指令。
·初始化数据段。通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。例如,C程序中出现在任何函数之外的声明:
int maxcount = 99;
使此变量带有其初值存放在初始化数据段中。
·非初始化数据段。通常将此段称为bss段,这一名称来源于一个早期的汇编运算符,意思是“block started by symbol”(由符号开始的块),在程序开始执行之前,内核将此段中的数据初始化为0或空指针。出现在任何函数外的C声明
longsum [1000];
使此变量存放在非初始化数据段中。
·栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
·堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。
什么是父子进程
如果进程a创建了进程b,那么进程b叫做子进程,a叫做父进程,父子进程是相对概念