进程
进程概念
为了使程序并发的执行,并且对并发执行的程序加以描述和控制,人们引入了进程的概念,进而提高了硬件设备的利用率与系统的吞吐量。
进程:是指在系统中作为系统资源分配的基本单位,由机器指令、数据和堆栈组成,是一个独立运行的活动实体。
操作系统用于描述和管理进程的一个数据结构,称为进程控制块(Process Control Block, PCB);
进程实例:由程序段, 相关的数据段, 和PCB;
创建进程:实际上是创建相应的PCB, 操作系统分配相配套的资源;
销毁进程:实际上就是释放进程占有的资源,回收PCB;
Linux下:
PCB是task_struct结构体;
在本人linux系统下task_struct定义在
/usr/src/kernels/2.6.32-431.el6.i686/include/linux路径下的sched.h文件
task_struct 描述信息分类:
- 标示符 : 描述本进程的唯一标识符,用来区别其他进程。
- 状态 :任务状态,退出代码,退出信号等。
- 优先级 :相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其它信息;
通过系统调用获取进程ID
- PID :进程ID
- PPID:父进程ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid :%d\n", getpid);
printf("ppid :%d\n", getppid);
return 0;
}
通过系统调用创建进程
函数调用成功 父进程返回子进程ID, 子进程返回0
失败返回-1
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 1;
}
else if(id == 0) //child
{
while(1)
{
sleep(1);
printf("I am child ID : %d, father ID : %d\n", getpid(), getppid() );
}
}
else //father
{
while(1)
{
sleep(1);
printf("I am father ID : %d, father ID : %d\n", getpid(), getppid());
}
}
return 0;
}
可以看到两个进程间是交替运行的。
fork() 创建出来的进程,父子进程代码共享,数据各自开辟空间, 各有一份(写实拷贝)。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
int data = 10;
pid_t pid;
if((pid = fork()) < 0)
{
perror("fork");
return 1;
}
else if(pid == 0)
{
//child
while(1)
{
sleep(1);
printf("child data : %d, pid = %d, ppid = %d\n",\
data, getpid(), getppid());
}
}
else
{
//father
while(1)
{
sleep(1);
printf("father data: %d, pid = %d, ppid = %d\n", data,\
getpid(), getppid());
}
}
return 0;
}
进程状态
linux下进程状态
- R运行状态(running):并不意味进程一定在运行中,它表明进程要么是在运行中要么在运行队列中。
- S睡眠状态(sleeping):意味进程在等待某件事情的完成(有时也叫可中断睡眠(interruptible sleep))。
- D磁盘休眠状态(Disk sleep)有时叫作不可中断睡眠状态(uninterruptible sleep), 通常这个状态的进程会等待IO的结束。
- T停止状态(stopped) : 可以通过发送SIGSTOP信号给进程停止(T)进程,可以通过发送SIGCONT信号让进程继续运行。
- X死亡状态(dead): 这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
进程优先级
CPU分配资源的先后顺序 ,就是指进程的优先级(priority)
ps -l 命令
PRI:表示进程优先级
NI:代表进程nice值
PRI值越小,表示权限越高。
PRI与NI关系:
PRI(new) = PRI(old) + nice
- nice 取值范围-19~20, 一共40个级别。
修改进程优先级命令:
nice/renice/top
nice: 启动进程前设定进程nice值
nice -n -3 ./a.out
设置进程nice为-3
renice: 进程已存在时设定进程nice值
renice -3 -p 2455
设置进程pid为2455的nice值为-3
top: 进程已存在时设定进程nice值
top
进入top后输入 r ——> 输入进程pid -->输入 nice 值
欢迎各位,批评指正。