云计算百科
云计算领域专业知识百科平台

进程和线程

一.进程

1.进程基本概念

  • 程序:存放在硬盘中的一段数据的集合
  • 进程:程序动态执行的过程,包括创建、调度、消亡的整个过程

2.进程相关命令

1).top

根据CPU占用率查看所有进程任务信息

PID:进程ID号(每个进程唯一),该值>0

PIPID:父进程ID号

2).ps -ef

查看当前系统下所有的进程任务信息

ps -ef | grep 进程名

3).ps -aux

查看进程信息(进程状态)

ps -aux | grep 进程名

4).kill

杀死一个进程任务

kill -9 进程PID

killall -9 进程名

5).&

在后台执行任务

./a.out &

6).ps

查看一个终端所有的前后台任务

7).jobs

查看所有后台任务及其编号

8).fg

将后台任务放到前台执行

9).nicce

使用指定优先级(-20,20)执行进程任务

nice -n 优先级 任务

10).renice

重新设置一个正在运行的进程的优先级

renice -n 优先级 进程PID

3.进程的创建

1).虚拟地址:MMU映射后的可以访问的内存空间

2).物理地址:硬件实际的RAm空间地址,用户一般不允许直接访问物理地址,要通过MMU映射为虚拟地址在进行访问

3).虚拟地址空间分布:

每个进程执行,操作系统会为进程分配0-4G虚拟内存空间

  • 文本段(.text):存放代码和相关指令
  • 数据段:
    • 存放字符串常量(.rodata)
    • 以初始化静态变量、全局变量(.data):在编译时分配空间,程序运行时加载到内存空间中
    • 未初始化静态变量、全局变量(.bss):在进程启动后,由进程默认初始化为0值
  • 栈区(.stack):默认为8M,未经初始化值为随机值,超过变量作用域回收变量空间,增长方向自高向低
  • 堆区(.heap):剩余的空间为堆区,可以有程序员手动申请释放,增长方向自低向高
  • 内核:用户无法访问

4).多个进程的空间(进程空间是独立的):

  • 多进程共用同一虚拟空间地址,但物理空间独立
  • 进程1执行时MMU将进程1的物理地址空间映射到虚拟地址空间中
    进程2执行时MMU将进程2的物理地址空间映射到虚拟地址空间中

4.进程的调度

1).先来先执行,后来后执行

2).短作业优先调度算法

3).高优先级调度算法

4).时间片轮转调度算法

  • CPU在任务中运行的一段时间成为时间片(5-10ms)
  • 宏观并行,微观串行

5).多级队列反馈调度算法

6).负载均衡调度算法

7).抢占式调度算法

5.进程的状态:

1).运行态(R):任务正被CPU执行

2).就绪态(R):任务正处于就绪队列中,但未被CPU调度到

3).可唤醒等待态(S):任务等待某个资源被CPU挂起,等待过程中可以被唤醒

4).不可唤醒等待态(D):任务等待某个资源被CPU挂起,等待过程不能被打断

5).停止态(T):用户将某个任务暂停

6).僵尸态(Z):进程执行结束,空间未被回收

7).结束态(X):进程执行结束,空间也被回收

6.进程相关的函数接口:

1).fork

pid_t  fork(vpid);

功能:创建一个子进程空间

参数:缺省

返回值:

        成功父进程返回子进程的PID

               子进程返回0

        失败返回-1

2).getpid

pid_t  getpid(void);

功能:获得调用进程的PID

3).getppid

pid_t  getppid(void);

功能:获得调用进程的父进程PID

7.ex

下为实例应用

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if(-1 == pid)
{
perror("fail to fork");
return -1;
}
if(0 == pid)
{
printf("我是子进程,PID:%d,PPID:%d\\n",getpid(),getppid());
}
else if(0 < pid)
{
printf("我是父进程,PID:%d,PPID:%d\\n",getpid(),pid);
}
printf("hello world\\n");
return 0;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 进程和线程
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!