博山做网站,有阿里云服务器 怎么做网站,小说网站如何做seo关键词,用织梦怎么做网站一、先谈硬件——冯诺依曼体系结构 存储器#xff1a;内存#xff08;硬盘是外存#xff09; 输入设备#xff1a;鼠标、键盘、摄像头、话筒、磁盘、网卡…… 输出设备#xff1a;显示器、播放器硬件、磁盘、网卡…… 输入输出设备是外部设备#xff0c;简称外设。 中央…一、先谈硬件——冯诺依曼体系结构 存储器内存硬盘是外存 输入设备鼠标、键盘、摄像头、话筒、磁盘、网卡…… 输出设备显示器、播放器硬件、磁盘、网卡…… 输入输出设备是外部设备简称外设。 中央处理器CPU 运算器对我们的数据进行计算任务算数运算、逻辑运算 控制器对我们的计算硬件流程进行一定的控制。 以上每一个部分都是独立的个体也就是说各个硬件单元必须用“线”链接起来。 “线”分两类1、系统总线CPU和内存之间 2、IO总线内存和外设之间 不考虑缓存的情况CPU只能对内存进行读写不能访问外设。 所有设备都只能直接和内存打交道。 二、再谈软件——操作系统Operator System 操作系统是一款进行管理的软件。 why 1、操作系统帮助用户管理好下面的软硬件资源手段。 2、为了给用户提供一个良好的稳定、高效、安全运行环境目的。 how 先描述再组织。 操作系统里面会有各种数据但操作系统不相信任何用户 操作系统为了保证自己的数据安全也为了保证给用户能够提供服务操作系统以接口的方式给用户提供调用的入口来获取系统内部的数据。 接口是操作系统提供的用C实现的自己内部的函数调用——系统调用。 所有访问操作系统的行为都只能通过系统调用完成。 操作系统的核心功能内存管理、进程管理、文件管理、驱动管理。 三、再谈进程 一个操作系统不仅仅只能运行一个进程可以同时运行多个进程。 操作系统如何将进程管理起来先描述再组织。 任何一个进程加载到内存时形成真正的进程时操作系统要先创建进程属性的结构体对象------PCBprocess control block进程控制块 进程 内核PCB数据结构对象 你自己的代码和数据 描述进程-PCB 进程信息被放在一个叫做进程控制块的数据结构中可以理解为进程属性的集合。 课本上称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct task_struct内容分类 标示符: 描述本进程的唯一标示符用来区别其他进程。 状态: 任务状态退出代码退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。 IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。 其他信息 怎么组织 在Linux中是如何组织进程的Linux内核中最基本的组织进程task_struct的方式是采用双向链表组织的。 查看进程 在Linux中ps axj 指令可查到当前正在运行的进程。 ls /proc 查看当前系统中所有进程 终止一个进程kill -9 PID 怎么获取PID系统调用接口getpid PPIDgetppid 当我们每次登录Xshell时系统会为我们创建一个bash进程即创建一个命令行解释进程我们在对话框中输入的指令都是bash进程的子进程 。 fork创建一个子进程 .\指令层面创建进程 fork代码层面创建进程。 当我们调用fork函数时它会创建一个子进程并给子进程返回0给父进程返回子进程的pid然后分两个执行流id0的进程是老的进程。 1、为什么fork要给子进程返回0给父进程返回子进程的pid 返回不同的返回值是为了区分让不同的执行流执行不同的代码块 一般来说fork之后的代码父子共享。 子进程只有一个父进程它只需要通过getppid就可以确定父进程但是父进程可能有多个子进程所以它需要拿到子进程的pid来确定子进程。 2、一个函数是如何做到两个返回值如何理解 任何平台进程在运行时是具有独立性的。 数据层面的写时拷贝在父子进程刚创建时数据和代码确实是共享的但是当子进程要修改数据时操作系统会另外在拷贝一份它要改的数据来给子进程更改。 4、fork函数在干什么干了什么 5、如果父子进程创建好后谁先运行 谁先运行由调度器决定不确定。 进程状态 1、一般操作系统学科中的运行、阻塞、挂起 1、运行状态 R在CPU上的和在运行队列中的都叫运行态 一个进程把自己放到cpu上运行并不是要运行完才把自己放下来。 每个进程都有一个 时间片的概念在一个时间段内所有进程代码都会被执行并发执行。 所以我们的代码中一定会存在大量的把进程从CPU上拿下来或者放上去的动作------进程切换。 2、阻塞状态 每一个设备都有一个等待队列系统里有很多等待队列进程也有等待队列进程想等那个设备如果状态没有就绪是不可读的此时此时这个进程就自动把自己的PCB链入该设备的等待队列里如果已经可读了这个进程就把自己放运行队列里。 3、阻塞挂起状态 如果操作系统中的内存资源严重不足了就会在保证正常运行的情况下省出来内存资源。 会阻塞状态的进程的PCB保留将代码和数据放到外设中换出此时的状态就叫挂起当下次资源就绪把这个进程要放入运行队列时再把代码和数据从新换入进来。 电脑中除了C\D\E盘这些分区还有一个swap交换分区。 2、具体Linux状态是如何维护的 Rrunning运行状态 R带号表示前台运行。 Ssleeping阻塞状态 浅度睡眠可以被唤醒随时响应外部变化 Ddisk sleep阻塞状态 深度睡眠 该状态下进程不可被kill不响应操作系统的任何请求 Tstopped暂停状态 ttracing stopped暂停状态 打断点时到断点处会变为t状态 kill -19 PID 发19号信号让目标进程处于stop状态 Xdead终止态资源被回收后才会变成X状态 Zzombie僵尸进程一般退出时如果父进程没有主动回收子进程信息子进程会一直让自己处于Z状态进程的相关资源尤其是task_struck结构体不能被释放。 如果父进程一直不回收这个进程的资源那么就会一直占用资源导致内存泄露。 孤儿进程如果父进程先挂了子进程的PPID就变成了11号进程就是操作系统 进程优先级 PRI优先级一个整型数组数字越小优先级越高。 NInice值优先级修正数据 PRI(new) PRIold这个值是80nice 程序进程地址空间 #include stdio.h
#include unistd.h
#include stdlib.h
int g_val 0;
int main()
{pid_t id fork();if(id 0){perror(fork);return 0;}else if(id 0){ //child,子进程肯定先跑完也就是子进程先修改完成之后父进程再读取g_val100;printf(child[%d]: %d : %p\n, getpid(), g_val, g_val);}else{ //parentsleep(3);printf(parent[%d]: %d : %p\n, getpid(), g_val, g_val);}sleep(1);return 0;
}
//与环境相关观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8父子进程输出地址是一致的但是变量内容不一样能得出如下结论: 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 但地址值是一样的说明该地址绝对不是物理地址 在Linux地址下这种地址叫做 虚拟地址 我们在用C/C语言所看到的地址全部都是虚拟地址物理地址用户一概看不到由OS统一管理。 当创建子进程时子进程为什么能继承父进程的环境变量呢 当子进程启动时父进程已经将环境变量信息加载了当你创建子进程时父进程里的数据必定有页表进程虚拟地址到物理地址的映射当子进程创建页表时子进程也自然会将父进程的环境变量信息继承下来。