进程管理(1)

2020-06-14  本文已影响0人  R_est
程序A:a,c->a.exe 程序B:b,c->b.exe
1)... 1)...
2)i=100; 2)i=200;
3)... 3)...
4)printf("A:i=%d,"i) 4)printf("B:i=%d,"i)

i为全局变量,A,B并发运行后:i的值不确定且不能重复

名称 状态
运行状态(Running) 进程已经占有CPU,在CPU上运行
就绪状态(Ready) 具备运行条件但由于无CPU,暂时不能运行
阻塞状态(Block)或等待状态(Wait) 因为等待某项服务完成或信号而不能运行的状态,如等待:系统调用,I/O操作,合作进程信号
状态转变 原因
就绪->运行 进程调度
运行->就绪 时间片耗尽,被抢占
运行->阻塞 请求服务,等待信号
阻塞->就绪 服务完成,信号来到

不存在 阻塞->运行 和 就绪->阻塞,阻塞必须通过就绪才能运行,就绪运行后才能进入阻塞。
更多状态如:新建状态和终止状态


含新建和终止状态的进程状态变迁
名称 状态
可运行态 就绪和运行
阻塞(等待)态 浅度阻塞(可中断),深度阻塞(不可中断,请求文件服务、I/O服务,系统服务)
僵死态 进程终止执行,释放大部分资源
挂起态 进程被临时挂起,暂存
Linux进程状态迁移
PCB的基本成员
name(ID) 进程名称(标识符)
status 状态
next 指向下一个PCB的指针
start_addr 程序地址
priority 优先级
cpu_status 现场保护区(堆栈)
comm_info 进程通信
process_family 家族
own_resource 资源

和进程标识相关的成员变量,LINUX进程标识(PID,PPID父进程ID,PGID进程组ID),用户标识(UID用户ID,GID用户组ID)

//进程创建伪代码
Creat(Si,Mi,Pi) //CPU的状态,内存,优先级
{
  p=Get_New_PCB(); //分配新的PCB
  pid=Get_New_PID(); //分配新的进程PID
  p->ID=pid; //设置进程PID
  p->CPU_state=Si; //CPU的状态
  p->Memory =Mi; //内存
  p->Priority=Pi;//优先级
  p->Status.Type="Ready"; //进程状态
  p->Status.List=RL; 进程队列RL:Ready List
  ...............
  Insert(RL,p); //把进程p插入就绪队列
  Scheduler(); //调度程序
}
int main(void)
{
  pid_t pid
  pid=fork();
  if (pid == 0)
    printf("Hello World!\n")
  else if (pid > 0)
    printf("How are you?\n")
}

在子进程中,pid = 0
在父进程中,pid > 0(等于子进程的ID)
出错,pid = -1

上一篇 下一篇

猜你喜欢

热点阅读