当前位置: 首页 > news >正文

网站建设多少钱杭州青岛seo公司

网站建设多少钱杭州,青岛seo公司,怎么做网站端口代理,毕业设计 旅游网站建设目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符  通过系统调用创建进程——fork() 四、进程的状态  操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进程状态 孤儿进程  五、进程的优先级 查看进程优先级的命令 优先级的极值 进程的竞争、独立和并发 六、进程切换 Linux真实调度算法O(1)调度算法  一、冯诺依曼体系 我们所知的计算机大部分都遵循冯诺依曼体系他们都是由一个个硬件组成的  输入单元包括键盘鼠标扫描仪等 中央处理器CPU含有运算器和控制器等 输出单元显示器打印机 图1  理解 这里的存储器指的是内存。 不考虑缓存情况这里的CPU能且只能对内存进行读写不能访问外设。 外设输入或输出设备要输入或者输出数据也只能写入内存或者从内存中读取。 CPU在数据层面只和内存打交道所有的设备都只能和内存打交道。 知识点 1、 体系结构规定软件没有运行的时候在外设磁盘里面运行的时候再把它加载到内存里面来CPU再从内存读取数据来执行代码所以数据流动的本质就是从一个设备“拷贝”到另一个设备体系结构效率的高低由设备的“拷贝”效率决定。 2、为什么数据不直接从输入设备直接到CPU在从CPU直接到输出设备呢 因为存储分级的时候不同的设备对应的“拷贝”效率越靠近CPU效率就越高CPU的速率要远远高于IO设备CPU都把数据处理完了而IO设备还在写入或者读取数据所以就会导致整个体系的效率由IO设备决定那为什么不把整个体系中需要处理数据的设备都安排存储分级更高的寄存器呢因为成本太高了冯诺依曼体系结构的历史意义就是在保证一定的效率前提下使成本减低。 图2  3、在数据流层面上理解冯诺依曼体系 如我们用qq发信息的数据流动过程先把qq加载到内存上把从键盘上的数据存入到内存中CPU接收到内存中的数据后经过计算处理后写回内存再通过qq流入到输出设备也就是网卡通过网络传给另一台计算机的输入设备网卡存到内存后通过CPU解码后写回到存储器再刷新到外设显示器上。 二、操作系统(OS) 任何一个计算机体系都包含一个基本的程序集合称之为操作系统。 包括内核进程管理内存管理文件管理驱动管理 及其他程序例如数据库shell程序等等 图3  设计操作系统的目的 体系结构 图4  对下 与硬件交互管理所有的软硬件资源。 硬件部分根据冯诺依曼体系结构组成访问不同的硬件就要不同的驱动程序这些工作就是由操作系统完成。 对上为用户提供一个良好的执行环境。 知识点 1、软硬件体系结构都是层状结构。 2、访问操作系统必须使用系统调用其实就是由系统提供的函数。 3、我们写的程序只要你判断出它访问了硬件它必须贯穿整个软硬件体系结构。 4、库在底层封装了系统调用。 核心功能 在整个计算机软硬件架构中操作系统的定位就是一款纯正的搞管理的软件。 管理把它理解为“先描述再组织”。 描述就是把被管理者的属性罗列出来放在一个结构体中。 组织就是把结构体用指针或者其他方式连接起来。 操作系统在对软硬件管理的时候其实就是“先描述再组织”先把软硬件属性、状态等以结构体的方式罗列出来再把结构体用队列或者链表等方式组织起来所以操作系统对软硬件的管理就变成了对队列或者链表的增删改查 系统调用 在开发角度操作系统对外会表现为一个整体但是会暴露自己的部分接口供上层开发使用这部分由操作系统提供的接口就叫做系统调用 系统调用在使用上功能比较基础对用户的要求相对比较高所以有心的开发者可以对部分系统调用进行适度的封装从而形成库有了库就更利于上层用户或者开发者进行二次开发所以库函数和系统调用是一种上下层的关系 系统调用本质上就是操作系统和用户之间进行某种形式的数据交换如果让用户直接去访问操作系统的系统调用接口成本高而且不安全。 其实就是保证在整个环境的安全运行环境下给用户提供服务。 三、进程的概念与基本操作 简介 进程PCB自己代码和数据 PCB是存放进程的状态代码地址数据地址id优先级等信息的里面包含进程的所有属性通过PCB提供的属性来对辰戌进行管理在Linux操作系统中PCB是task_struct. 我们历史上执行的所有指令工具自己的程序运行起来全部都是进程 查看进程 1、可以通过 /proc系统文件查看如要获取PID为1的进程信息ls /proc/1 2、大多数进程可以通过top、ps这些用户级工具来查 补充知识点  图5 exe是进程对应的可执行文件  cwd是当前工作目录在使用fopen函数对一个没有创建的文件进行写操作时可以带路径也可以不带路径因为进程启动时会找到cwd并把新文件创建到cwd下chdir可以改变cwd 通过系统调用获取进程标识符  gitpid(),获取进程id gitppid(),获取父进程id 输入的命令、代码运行起来后它们的父进程都是bash也就是命令行解释器。 OS会给每一个登录用户分配一个bash。 通过系统调用创建进程——fork() fork()有两个返回值进程创建成功会把子进程的pid返回给父进程0返回给子进程失败返回-1给父进程。 默认情况下父进程与子进程共享代码在子进程创建成功后子进程会把父进程的pcb拷贝下来再做与其属性对应的修改 #include stdio.h #include sys/types.h #include unistd.h int main() {int ret fork();if (ret 0) {perror(fork);return 1;}else if (ret 0) { //childprintf(I am child : %d!, ret: %d\n, getpid(), ret);}else { //fatherprintf(I am father : %d!, ret: %d\n, getpid(), ret);}sleep(1);return 0; } 代码1  运行结果 图6  知识点 对于代码1 1、为什么要给父进程和子进程返回不同的值 一个父进程可能有多个子进程父进程要通过子进程的pid对他进行管理所以要返回子进程的pid给父进程 子进程只有一个父进程他可以通过ppid获取父进程所有只需要通过返回值来知道它是否被创建成功即可 2、为什么一个函数函数会返回两次 在执行fork函数时在执行return语句之前子进程已经被创建好了他和父进程共享代码所以父子进程都会执行return语句 3、为什么一个变量既大于0又等于0代码1的if 和else同时成立 进程具有独立性他们的PCB不同默认指向相同的代码和数据代码是常量不能修改在数据修改时不管是父子的哪一方进行数据修改os都会把对修改的数据在底层拷贝一份让目标进程修改这个拷贝来保证进程的独立性这种形式叫做写时拷贝。 四、进程的状态  图7  操作系统中的运行、阻塞和挂起 图8 运行只要进程在调度队列中它的状态就是running。 阻塞进程在等待某种设备或者资源就绪如键盘、网卡、磁盘等比如程序运行到scanf或者cin这条语句现在进程就是在等到键盘的反应而cpu对硬件的管理也会进行结构体描述再组织一个队列这个结构体中就包含了 “等待队列” 这个成员在os没有收到键盘的反应时进程就会从调度队列被链入到等待队列直到os收到键盘的反应后再重新链入到调度队列。 挂起如果更多的进程被链入到等待队列导致cpu资源紧张的时候在磁盘中有一个“swap交换分区”OS会把阻塞状态的进程的代码和数据唤出到这个分区而PCB不动此时他就处于阻塞挂起状态等收到资源的反应时再把对应的代码和数据唤入回来如果是调度队列的太多导致资源紧张os也会按照进程重要性与“swap交换分区”进行唤入和唤出操作此时进程就属于运行挂起状态。 进程状态的变换表现之一就是要在不同的队列中进行流动。本质上都是对某种数据结构的增删查改。 理解linux内核链表 在task_struct里面还存在一个list_head的结构体  正是因为有了它我们的task_struct就可以以这样的方式连接起来 图9 找到首地址的方式(struct task_struct*)(next-(struct task_struct*)0)。  task_struct中也可以有多个不同的list_head所以一个PCB可以隶属于多种数据结构。 图10 Linux的进程状态 进程状态就是task_struct内的一个整数 R状态对应的就是操作系统中运行状态。 S和D状态对应的就是操作系统中阻塞状态在linux中叫休眠状态。 其中S状态是可中断休眠浅睡眠。 D状态是不可中断休眠深睡眠比如有一个进程需要在磁盘中写入数据在写的过程中进程属于S状态此时内存的资源紧张os就把这个进程释放掉了而磁盘恰好又写入失败了在CPU中控制这个任务的进程不在了接收不到成功与否的信息的同时数据也不知道如何管理就有可能会丢失而D状态的就可以保证这时候的进程不被“杀死”规避了数据丢失的风险。 T和t是暂停状态输入Linux操作系统的特有状态当操作系统觉得当前进程有问题或者其他情况就会把它暂停在由用户决定这个进程是否继续。 使用gdb时对语句打断点就会使得程序被debug,此时进程就是 “t” 状态在键盘中输入ctrlr就进入T状态 X状态死亡状态对应操作系统中的结束状态 Z状态僵尸状态在Linux操作系统中所有的进程一定是某一个进程的子进程创建子进程的目的是为了让子进程执行任务的任务的结果父进程需要知道子进程的数据可以清除掉但是他的PCB必须要维持起来所以在子进程退出之后父进程获取退出信息之前子进程的状态就是Z状态 僵尸状态的模拟 #include stdio.h #include stdlib.h int main() {pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) { //parentprintf(parent[%d] is sleeping...\n, getpid());sleep(30);}else {printf(child[%d] is begin Z...\n, getpid());sleep(5);exit(EXIT_SUCCESS);}return 0; } 结果 图11 可以看到子进程变成了Z状态当时他还有PID所以如果父进程对子进程的状态一直不管 信息一直不回收那么子进程就会一直处于僵尸状态PCB就一直需要维护并会造成内存资源的浪费。 slab机制 当一个进程结束后他的PCB选择可以不释放而是把他放到一个表中存起来当再有新进程运行起来的时候就可以再表里面把PCB拿出来把它初始化后就可以使用了节省了一定的效率 孤儿进程  父进程比子进程先退出子进程就叫做 “孤儿进程” 模拟孤儿进程代码 #include stdio.h #include unistd.h #include stdlib.h int main() {pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) {//childprintf(I am child, pid : %d\n, getpid());sleep(10);}else {//parentprintf(I am parent, pid: %d\n, getpid());sleep(3);exit(0);}return 0; } 进程的结果 可以看到 当父进程退出后子进程就被一个PID为1的进程“领养”了对于1号进程暂时可以把它理解为操作系统如果不被“领养”的话子进程进入僵尸状态后就会造成资源浪费被“领养”后子进程就可以被1号进程回收了被1号进程“领养”后子进程就会自动变成后台进程ctrlc就不能关闭它用 “kill -9 pid”才可以关闭这个进程。 对于1号进程在前面的 “进程概念” 中提到当我们登录Linux操作系统时操作系统会给用户分配一个bash这个bash就是1号进程分配的0号进程也是存在的它在开机的时候就被1号进程给替换掉了。 五、进程的优先级 优先级是进程得到CPU资源的先后顺序。 优先级也是一种数字是int类型在task_struct里面。 值越低优先级越高反之优先级越低。 计算机的操作系统是基于时间片的分时操作系统规定了每个进程的调度时间问题时间片到了就会把进程从CPU上面剥离下来因为要考虑公平性所以改变优先级的幅度不能太大。 使用ps -l命令查看优先级的时候能看到UID、PRI和NI等属性  UID就是用户名 PRI是进程的优先级默认值为80 NI是进程优先级的修正数据 进程的真实优先级PRI的默认值也就是80)NI 查看进程优先级的命令 进入top后按“r”再输入进程PID再输入nice值。 也可以通过系统调用 优先级的极值 Linux进程的优先级范围是[60,99] nice值[-20,19] 基于时间片的分时操作系统规定了每个进程的调度时间问题,如果优先级设计的不合理就会导致优先级低的进程长时间的得不到CPU资源进而导致进程饥饿。 进程的竞争、独立和并发 竞争性:系统进程数目众多而CPU资源只有少量甚至1个所以进程之间是具有竞争属性的。为了高效完成任务更合理竞争相关资源便具有了优先级  独立性:多进程运行需要独享各种资源多进程运行期间互不干扰并行:多个进程在多个CPU下分别同时进行运行这称之为并行 并行:多个进程在多个CPU下分别同时进行运行这称之为并行 并发:多个进程在一个CPU下采用进程切换的方式在一段时间之内让多个进程都得以推进称之为并发 六、进程切换 引言 1、死循环进程不会打死系统它不会一直占有CPU因为存在时间片规定时间到了就把进程切换了。 2、一个CPU里有很多寄存器它就是CPU内部的临时空间可以用来存放正在运行的进程的临时数据但寄存器并不等于寄存器里面的数据 图12  进程切换最核心的就是保存和恢复当前进程的硬件上下文的数据即CPU内存的内容 当前进程要把自己的进程硬件上下文数据保存起来就是保存到task_struct里面 图13  Linux真实调度算法O(1)调度算法  图14 解释 1、一个CPU拥有一个调度队列 2、queue[140] 一个元素就是一个进程队列相同优先级的进程按照FIFO规则进行排队调度所以数组下标就是优先级其中[099]下标主要用于实时操作系统应用于制造业、工业等领域[100,140]就是我们要了解的进程在进程队列的下标等于进程优先级-60140-40 3、bitmap[5] 称之为位图unsing int bitmap[5],它有32x5个比特位每个比特位里面的数据1/0表示在queue的队列有没有进程比如101.......111,就表示queue数组中下标为0的数组里面有数据下标为1的数组里面没有数据所以调度器调用进程就变成了遍历比特位中的数据再看queue数据使调度的时间复杂度为O(1) 4、*active和*expired 操作系统具有分时的特性当一个进程在它的调度时间片用完后就被按优先级放入到了*expired所指向的队列中*active队列中所有的进程时间片用完后在把两个队列进行交换swap(active,expired),像这样一直循环这个操作 七、环境变量  概念 环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数 如在编写c/c代码的时候链接过程中我们不知道所链接的动静态库在哪里但是照样可以链接成功输出可执行程序原因就是有相关的环境变量帮助编译器进行查找 环境变量通常具有某些特殊用途它在系统中通常具有全局特性 命令行参数 main函数的两个参数argcargv[ ]作用 图15 用上图15的理论来实现自己写的code的不同子功能 //指令选项的原理 //main函数的参数就是用来实现程序不同子功能的 int main(int argc,char* argv[]) {if (argc ! 2){printf(Usage: %s [-a|-b|-c], argv[0]);return 1;}const char* arg argv[1];if (strcmp(argv, -a) 0)printf(这是功能1\n);else if (strcmp(argv, -b) 0)printf(这是功能2\n);else if (strcmp(argv, -c) 0)printf(这是功能3\n);elseprintf(Usage: %s [-a|-b|-c], argv[0]);return 0; } 结果  所以得出结论进程会拥有一张命令行表argv表来实现功能选项。 5个问题切入环境变量 问题1:为什么我们自己写的程序需要带路径才能执行./表示当前路径而系统自带的不用带路径就可以执行 答:因为系统自带的配置了环境变量 问题2:根据问题1的回答现在ls这个指令在/usr/bin目录下面那我们把自己写的code也把它拷贝进入/urs/bin“目录下面是不是就可以和系统的指令一样不用带路径了呢? 答是的但是不建议  问题3:它为什么会自己去“use/bin”目录下面去查呢? 答还是因为配置了环境变量:PATHPATH的作用是告诉系统怎么找文件  env查看所有的环境变量 echo 环境变量名仅查看一个环境变量 问题4那如果我把我的code”文件的路径加入到这个PASH环境变量里面是不是也可以达到上面的效果? 答是的! 方法 问题5把Xshell关掉重新进来的时候发现PASH路径又回复原有的样子了为什么? 答这要在从存储的角度去理解环境变量。 当我们登录的时候系统给我们创建了一个bash进程bash必须从系统中读取所有环境变量的 信息随后在bash进程的内部就形成了一种环境变量表当我们输入命令时bash先拿到命令把命令进行拆分后放入到命令行参数表再找需要执行的命令是否存在。 env命令查的就是这张环境变量表bash进程就有命令行表和环境变量表 所以要执行一个程序bash要先通过环境变量找到他。 获取环境的方法 操作 export 变量名变量值自己导入环境变量它是一个内建命令它在执行时不需要创建子进程由bash自己执行不会经手子进程 env查看所有环境变量 echo 变量名仅查看一个环境变量 unset 变量名删除环境变量 代码 1、main函数的参数共有三个除了“argc”和“argv”还有一个“char* env[ ]”(环境变量指针数组),这三个参数都是父进程传给main的。 int main(int argc,char* argv[]) {//env数组的最后一个元素也是NULLfor (int i 0; env[i]; i){printf(env[%d] - %s\n, i, enc[i]);}return 0; } 2、getenv“变量名” 环境变量为什么是全局变量可以传给子进程呢因为它可以让子进程有一些个性化的操作 比如我想让代码只能由我一个人使用 int main(int argc, char* argv[]) {const char* who getenv(USER);if (who NULL) return 1;if (strcmp(who, whb) 0){printf(正常执行);}elseprintf(only whb\n);return 0; } 3、变量environ //libc中定义的全局变量environ指向环境变量表, //environ没有包含在任何头⽂件中, 所以在使⽤时 要⽤extern声明。 int main(int argc, char* argv[]) {extern char** environ;int i 0;for (; environ[i]; i) {printf(%s\n, environ[i]);}return 0; } 八、程序地址空间 引言 学习c语言的时候脑海中会有这样的图 它就是程序地址空间图也就是进程地址空间图(虚拟地址空间图)它属于系统层面的概念 其中字符串是只读的原因就是它被编码成了代码在代码区只读 static修饰的变量本质就是全局变量只是让他只能在某个函数内被访问而已 那程序地址空间是内存吗 跟随代码 int gval 100; int main() {pid_t id fork();if (id 0){//子进程创建成功while (1){printf(子:gval:%d,gval%p,pid:%d,ppid:%d\n, gval, gval, getpid(), getppid());sleep(1);gval;}}else{//父进程while (1){printf(父:gval:%d,gval%p,pid:%d,ppid:%d\n, gval, gval, getpid(), getppid());sleep(1);}} } 结果 图16 结论父子进程地址一样如果这个地址是内存地址的话同一个地址空间怎么会有两个不同的值呢 所以这个地址一定不是内存地址它是虚拟地址所学的c/c指针用的地址全都是虚拟地址 通过一张图了解页表、物理地址和虚拟地址的关系 图17  解释 一个进程就有一个虚拟地址空间和一套页表。 页表当中存了虚拟地址和对应的物理地址用户是看不到物理地址的当用户要访问这块数据时页表就会通过虚拟地址映射到物理地址。 子进程的PCB、虚拟地址、页表全部都是拷贝父进程的所以在默认情况下。父进程和子进程的代码和数据都是共享的。 对图16的运行结果子进程在进行gval时他会把物理地址的数据拷贝到一块新空间在对新空间里面的数据进行修改并且会更新页表这叫做写时拷贝。 虚拟地址空间是什么 虚拟地址空间本质就是操作系统给进程创建的一个结构体对象一部分数据如下 问题为什么要有虚拟地址空间呢为什么不直接去物理空间上找而是要通过虚拟地址映射找呢? 因为 1、页表当中除了虚拟地址和物理地址之外还有对应地址的权限在 地址转化的过程中也可以对地址的的操作合法性进行判断进而保护 内存所以在对字符常量区的数据写入失败时的原因就是查找页表的 时候权限拦截了 2、将地址从“无序”变为“有序” 物理空间的地址可以不是连续的因为每一个物理空间地址对应的虚拟空间是有序的 3、节省内存空间缺页中断动态加载 4、让进程管理和内存管理进程解耦合 知识点 1、在创建一个进程时可以不加载代码和数据只有task struct,mm struct和页表  因为当虚拟地址想要通过页表映射找物理地址时没有发现物理地址时进程就会暂停进行缺页中断们进行补全如果代码和数据非常大就达到可节省内存空间的目的 2、创建进程先有task struct,mm_struct等再加载代码和数据 3、进程挂起时进程的唤出换入swap分区操作时只把代码和数据换入/唤出保存PCB这就是解耦合的作用 4、在mm_struct里面还有一个vm_area_struct它里面细分了每一段地址空间的起始和结束地址而mm_struct就是包含整体的栈、堆、代码段等空间的起始地址。
http://www.w-s-a.com/news/532093/

相关文章:

  • 上海seo网站推广公司wordpress 小米商城主题
  • 搭建服务器做网站什么网站可以请人做软件
  • 上海建筑建材业网站迁移公家网站模板
  • 仿制别人的网站违法吗网站防火墙怎么做
  • 杨浦网站建设 网站外包公司如何进行网络推广
  • wordpress+仿站步骤超详细wordpress常用函数
  • 浙江手机版建站系统哪个好怎样黑进别人的网站
  • 企业网站搜索引擎推广方法装修网络公司
  • 网站运营优化建议wordpress 添加媒体
  • 用asp.net做网站计数器施工企业会计的内涵
  • 网站被黑咋样的网站建设 设计业务范围
  • 网站开发学哪种语言网站编辑器失效
  • WordPress插件提示信息江阴网站优化
  • 网站开发用的软件如何做网站内容管理
  • 扬州网站建设公司网站推广是什么岗位
  • 双线网站管理咨询公司是做什么
  • asia域名的网站贵州光利达建设工程有限公司局网站
  • 梅州南站济南做网络安全的公司
  • 网站源代码 phpseo营销推广费用
  • 南京专业制作网站深圳整装装修公司排名
  • 网站制作在哪里比较好网页设计的要点有哪些
  • 自己做网站原始代码高端品牌服装
  • 九度企业网站推广软件龙泉市建设局网站
  • 做个企业网网站怎么做专业3合1网站建设公司
  • 龙岩网站建设teams熊掌号公司网站的实例
  • 电商模板网站免费省级精品课程网站建设
  • 网站建设的规划书桂林生活最新网
  • 广东省建设工程执业中心网站wordpress的分类目录和标签
  • 甘肃省两学一做专题网站广东外发加工网
  • 用python导入wordpress公司网络优化方案