重庆网站建设网搜科技,WordPress网易云外链音,网页制作代码模板html,陕西网站建设哪家好一.进程
1.进程调度
Linux把所有进程通过双向链表的方式连接起来组成任务队列#xff0c;操作系统和cpu通过选择一个task_struct执行其代码来调度进程。
2.进程的状态
1.运行态#xff1a;pcb结构体在运行或在运行队列中排队。 2.阻塞态#xff1a;等待非cpu资源就绪操作系统和cpu通过选择一个task_struct执行其代码来调度进程。
2.进程的状态
1.运行态pcb结构体在运行或在运行队列中排队。 2.阻塞态等待非cpu资源就绪硬盘网卡等资源 3.挂起态一个进程对应的代码和数据被操作系统因为资源不足而导致操作系统将该进程的代码和数据临时地置换到磁盘当中进程的pcb还在内存中。
3.linux下进程的状态 R:对应上面的运行态 S可中断睡眠对应上面的阻塞状态 D:深度睡眠不可被中断。深度睡眠的状态进程只能通过 “一觉睡到自然醒” 自己醒来OS 无权唤醒或杀死之。 T暂停状态调试 Xdead终止瞬时性非常强 Z:僵尸状态 二.深入理解fork
1.介绍fork
fork通过复制一份当前进程父进程来创建一份全新的进程子进程父进程创建成功返回子进程的pid失败返回-1,子进程创建成功返回0失败返回-1。
2.为何会有两个返回值 fork可以分为以上三步1.操作系统先将用户态转为内核态通过系统调用create创建一个空进程。2.调用clone将父进程的代码和数据数据段堆栈等完全拷贝给子进程。3.return 返回。 当父进程通过前两步创建出子进程并把代码数据复制完成后父进程便return返回子进程的pid。子进程有了父进程的所有数据堆栈信息pcb由于pcb中记录了父进程代码执行到的位置因此子进程会接着执行后续return语句失败返回-1成功返回0.
3.fork底层剖析 三个调用的区别在于传入的参数不同 具体细节参考 资料1 资料2 资料3 1.fork() 和 vfork() 参数是写死的而 clone() 是可选的它可以选择当前创建的进程哪些部分是共享的哪些部分是独立的 2. vfork() 是历史的产物当调用 fork() 的时候需要将父进程的线性区和页表都拷贝一份而调用 exec()执行新程序后又要把所有页表删除重置新的页表建立映射关系效率很低 3.所以要有 vfork()vfork() 的 clone_flags 位置了 CLONE_VM 表示共享父进程的地址空间vfork()中创建的进程没有分配自己的地址空间而是通过一个 mm_struct 指针指向父进程的地址空间这个进程是为了在之后调用 exec() 执行新的程序 而在有了 Copy-on-write 技术后fork()出的子进程只创建了自己的地址空间然后用父进程的地址空间初始化每个页表的项置为父进程的页表项共享父进程的物理页面并将所有 私有/可写页面改为只读 4.当我们改变父子进程的数据后cpu 在运行过程中会发生一个缺页错误cpu 转交控制权给操作系统操作系统查找 VMA。发现该页权限为只读但所在段又是可写的产生一个矛盾这就是识别 Copy-on-write 的方法接着 OS给子进程分配一个新的物理页并将页表该页的地址修改成新的物理页地址这样 fork() 后再调用 exec() 就不用那么麻烦了可以直接将新的物理页与子进程的虚拟空间建立映射。 三.linux中的pcb实体task_struct
参考资料4
四.进程优先级
1.优先级 优先级PRIniceold(pri)PRI越小优先级越高。 linux下调整优先级就是调整nice值nice值从-20到19。 2.并发和并行 并行多个进程在多个cpu下分别同时运行。 并发多个进程采用进程切换通过一个cpu在一段时间下时间片让多个进程推进。 上下文cpu内存在寄存器当一个进程a在运行时cpu内的寄存器里面一定保存的是进程a的临时数据这些数据就叫该进程的上下文。为了实现并发当进程a暂时被切换的时候进程a会带走自己的上下文数据保存在pcb中目的是为了下次切换回来时能快速恢复。 五.环境变量
1.概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。 环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。
2.常见环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) SHELL : 当前Shell,它的值通常是/bin/bash 3.操作
1.查看环境变量echo $ PATH 2.显示所有环境变量:env 3.清除环境变量unset 4.设置一个新的环境变量export
4.获取环境变量
#include stdio.h
int main(int argc, char *argv[], char *env[])
{
int i 0;
for(; env[i]; i){
printf(%s\n, env[i]);
}
return 0;
}#include stdio.h
int main(int argc, char *argv[])
{
extern char **environ;
int i 0;
for(; environ[i]; i){
printf(%s\n, environ[i]);
}
return 0;
}libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
#include stdio.h
#include stdlib.h
int main()
{
printf(%s\n, getenv(PATH));
return 0;
}常用getenv和putenv函数来访问特定的环境变量