一.进程
概念:进程是操作系统间独立运行的单位;
描述:PCB进行描述,Linux下为task_struct;
二.Task_struct分为:
1.进程状态
R:运行状态,要么运行要么在运行队列里;
S:睡眠状态,等待事件完成INTERRUPTIBLR SLEEP
D:磁盘休眠状态,等待I/O结束UNINTERRUPTIBLR SLEEP
T:停止状态,通过发送SIGSTOP停止进程,SUGCONT进程继续运行
X:死亡状态,只是返回状态,任务表不显示
Z:僵尸状态,子进程over父进程未读取子进程状态或子进程在运行父进程over
t:跟踪状态
2.进程调度信息:
1.调度标志
2.静态优先级
3.动态优先级
4.调度策略
5.实时优先级
3.进程标识:
Pid,ppid,uid,gid用户标识符和组织标识符用于系统安全控制;
4.内部通信信息:
1.信号
2.管道
3.通信机制——消息队列,信号量,共享内存;
5.进程指针:
祖先,父/子,弟/兄,散列表,双向循环链表,运行队列;
6.时钟:创建,用户态耗费时间,系统态耗费时间,剩余时间片;
7.文件系统信息:
Struct fs_struct *fs;//可执行映像所在文件系统;
Struct file_struct *files;//打开文件
8.虚拟存储信息:
Mm_struct* mm;//描述进程的地址空间;
Mm_struct *active_mm;//内核线程借用的地址空间;
9.上下文信息:恢复/暂存CPU保存当前内部寄存器/堆栈值;
10.信号......
进程的组织形式:
1.散列表pidhash:以使能快速查找进程标识符所对应的进程控制块PCB结构。散列表中每一表项都是一个双向链表解决pid冲突;
2.双向循环链表:创建顺序以及进程之间亲属关系;
3.运行队列<双向循环链表>:包含所有运行的PCB;
4.进程运行队列链表<当前进程,空进程永远存在>length=0只有空进程
5.等待队列
通用双向链表:可以用此来定义双向链表;
等待队列:快速检索挂起进程;
进程的创建
Pid_t fork(void);//两次返回
父进程:getpid=子进程pid
子进程:getpid=0;getppid=父进程id;
Fork复制当前进程,在内核进程表中创建一个新的进程表项。堆栈指针,标志寄存器相同;
1.共享堆/栈数据和静态数据;
2.数据复制采用所谓的写时拷贝<缺页中断,OS给紫禁城分配内存并复制父进程数据源>;
3.父进程打开的文件描述符在子进程中也是打开的且目录文件等引用计数器+1;
Vfork:用于创建一个子进程,子进程与父进程共享地址空间并保证子进程先运行,在调用exec 或exit之后父进程才会被调度运行。
Fork失败:
1.系统中有太多的进程;
2.实际用户的进程数超过了限制 ulimt -n
进程终止
1.正常终止:
1.从main返回;
2.调用exit {return(n)->exit(n)}
exit执行清理函数;关闭所有流,所有缓冲数据被写入;调用_exit;
3._exit()
Void _exit(int status);//status定义进程终止状态,父进程用wait来获取该值;
2.异常终止:信号终止
进程等待:<例如僵尸进程就是必要性>
1.wait
Pid_t wait(int* status);
成功返回等待进程pid,失败返回-1;status输出参数,获取子进程退出码;
2.Waitpid
Pid_t waitpid(pid_t pid, int *status, int opinions)