目录
进程
进程是操作系统中最重要的概念之一。在计算机系统中,进程不仅是最基本的并发执行单位,而且也是分配资源的基本单位。从进程观点出发,对计算机系统进行结构设计,也是软件开发的一种新技术。
进程是对正在运行程序的抽象,其最基本的属性是动态性和并发性,我们将进程定义为程序在并发环境中的执行过程。程序是静态、被动的概念,本身可以作为一种软件资源长期保存。进程是程序的一次执行过程,是动态、主动的概念,有一定的生命周期,会动态的产生和消亡。
fork()函数
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
ps -ef命令的使用
UID:指用户的ID号,实际显示的是系统中的用户名
PID:该进程的ID号
PPID:该进程的父进程的ID
C:该进程所占用CPU的百分比
STIME:进程被触发启动到现在的时间
TTY:该进程所运行的终端,若与终端无关,则显示“?”
TIME:该进程实际使用CPU运行的时间
CMD:命令的名称和参数。
top命令的使用
PID:进程的ID号,是进程的唯一标识符
USER:该进程的用户名
PR:进程的优先级,范围为0-39,优先数越小优先级越高
NI:指nice值,范围为-20~19,负值表示高优先级,正值表示底优先级。在top中PR-NI=20。默认启动一个进程,nice值是0
VIRT:该进程占用的虚拟内存
RES:该进程占用的物理内存
SHR:该进行使用的共享内存
S:表示该进程的状态,S表示休眠,R表示正在运行
%CPU:从上一次更行到当前任务所占用CPU的百分比
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用总的CPU时间,即占用CPU使用时间的累加值,精确到百分之一秒
进程创建——fork()函数
①fork()函数用来创建一个新进程。系统调用格式:
pid_t pid;
pid=fork();
②如果fork()调用成功,它向父进程返回子进程的pid,并向子进程返回0,即fork()被调用了一次,但返回两次。此时操作系统在内存中创建一个新进程,所建的新进程是调用fork()父进程的副本,称为子进程。父进程与子进程并发执行。
③子进程完全复制了父进程地址空间的内容。当它并没有复制代码段,而是和父进程共用代码段,这样做是合理的。由于子进程可能执行不同的流程,会改变数据段和堆栈段,但是代码是只读的,不存在被修改的问题,因此,可以共用
例题一
每个进程输出ABC一次,要求共输出5次ABC
#include<stdio.h>
#include<unistd.h>
int main(){
int p1;
p1=fork();
if(p1==0){
fork();
fork();
}
printf("ABC\n");
while(1);
return 0;
}
例题二
使用fork()创建两个子进程,实现当此程序执行时,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示输出内容,父进程为“A”,子进程分别为“B”和“C
#include<stdio.h>
#include<unistd.h>
int main(){
int p1;
int i;
for(i=0;i<2;i++){
p1=fork();
if(p1==0||p1==-1){
break;
}
}
if(p1==0){
if(i==0){
printf("woshizijincheng1-----B\n");
}
if(i==1){
printf("woshizijincheng2-----C\n");
}
}else
{
printf("woshifujincheng1-----A\n");
}
return 0;
}
例题三
子进程创建之前:pid为1134
子进程创建之后:pid为1134,fork返回值为1135
子进程创建之后:pid为1135,fork返回值为0
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
pid_t pid; //获得父进程pid
printf("子进程创建之前:pid为%d\n", getpid());//创建子进程
pid=fork();
if(pid==-1){
perror("fork() error!\n");
exit(1);
}
//父进程返回子进程的pid,子进程返回0
printf("子进程创建之后:pid为%d,fork返回值为%d\n", getpid(), pid);
sleep(3);
return 0;
}