网站建设合同 域名,百度关键词优化软件如何,重庆新闻发布会直播,南宁seo多少钱费用操作系统#xff08;OS#xff09;与系统进程 冯诺依曼体系结构操作系统(Operator System)进程基本概念进程的描述#xff08;PCB#xff09;查看进程通过系统调用获取进程标示符#xff08;PID#xff09;通过系统调用创建进程#xff08;fork#xff09;进程状态OS与系统进程 冯诺依曼体系结构操作系统(Operator System)进程基本概念进程的描述PCB查看进程通过系统调用获取进程标示符PID通过系统调用创建进程fork进程状态初识 冯诺依曼体系结构
要去了解操作系统冯诺依曼体系结构是必须掌握的它决定了计算机最底层最基础的设计思路。 首先冯诺依曼体系结构由四大部分构成输入设备存储器中央处理器(CPU)输出设备。CPU里又有控制器和运算器两大器件组成。 这里的存储器指的是内存不考虑缓存情况这里的**CPU能且只能对内存进行读写**不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据也只能写入内存或者从内存中读取。一句话所有设备都只能直接和内存打交道 。
因此一个程序要运行必须加载到内存中。原因就是冯诺依曼体系结构设计就决定了必须是这样的。
那么为什么必须是内存CPU不能直接去外设例如硬盘中读取数据呢原因是存储是分级的。 木桶的短板效应很好理解要考虑到效率问题。
操作系统(Operator System)
任何计算机系统都包含一个基本的程序集合称为操作系统(OS)。笼统的理解操作系统包括内核进程管理内存管理文件管理驱动管理其他程序例如函数库shell程序等等。
设计OS的目的 操作系统本质就是一组软件负责与底层硬件资源交互。与硬件交互管理所有的软硬件资源 为用户程序应用程序提供一个良好的执行环境。
操作系统本质是一款负责管理的软件管理所有的软硬件资源。 用户是不可能直接管理底层硬件资源的因为操作系统不相信任何人要与底层资源交互唯一的方式就是通过系统调用接口通过操作系统去完成。
在开发角度操作系统对外会表现为一个整体但是会暴露自己的部分接口供上层开发使用这部分由操作系统提供的接口叫做系统调用。 系统调用在使用上功能比较基础对用户的要求相对也比较高所以有心的开发者可以对部分系统调用进行适度封装从而形成库有了库就很有利于更上层用户或者开发者进行二次开发 。
总结 操作系统管理硬件方式先描述后组织。 描述将要管理的对象的属性用结构体描述整合起来 组织将一个个的结构体用特定的数据结构进行组织 进程
基本概念
课本概念程序的一个执行实例正在执行的程序等。 内核观点担当分配系统资源CPU时间内存的实体。 简单理解就是加载到内存中的一个个程序最简单直观的就是打开任务管理器就是有很多很多进程。
概念简单理解即可。真正难理解的是进程的各种属性以及操作系统对进程的管理。
进程的描述PCB
一个进程通常有进程信息PCB以及它的数据和代码组成。
进程信息被放在一个叫做进程控制块的数据结构中可以理解为进程属性的集合。课本上称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct 。
在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构它会被装载到RAM(内存)里并且包含着进程的信息。
PCB包含的信息 标示符: 描述本进程的唯一标示符用来区别其他进程。 状态: 任务状态退出代码退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。 IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。 其他信息 组织进程的方式可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里
Linux中是通过双链表的方式将task_struct组织起来的。 查看进程
进程信息都在/proc目录下可以找到如要获取PID为1的进程信息你需要查看 /proc/1 这个文件夹 大多数进程信息同样可以使用top和ps这些用户级工具来获取 并且是比较推荐的。
例如查看全部进程。 怎么查找一个进程呢。 只需要会查找进程即可。上面一行进程的详细信息需要慢慢来理解。
通过系统调用获取进程标示符PID 通过系统调用可以获取自己进程的PID或者PPIDgetpid()和getppid()。 通过系统调用创建进程fork
fork非常的神奇它有两个返回值没错它是个函数但是有两个返回值将子进程的PID返回给父进程子进程返回直接0。 这次你会发现一个神奇的现象代码中写的if else结构竟然同时执行了。难道id既是0又是大于0的数吗。
fork是怎么做到的呢它究竟做了什么事 Linux文档中关于fork的描述是这样的 fork是创建一个有自己PID的子进程但是**子进程和父进程却是共享一份代码的**。
但是我们的创建子进程的目的是为了让两个进程做不同的事情所以需要用一定的方法将两者区别开来所以fork采用了两个返回值的方式但是一个id如何能表示两个值呢
在代码执行完毕最后要return时父进程和子进程每个都返回一次这才实现了fork两个返回值。
但是还有一个问题子进程和父进程却是共享一份代码那么数据也是共享的问题是如果要对数据做修改怎么办呢
Linux下给出的解决方式是在子进程想要对数据进行修改的时候操作系统会阻止并且为子进程单独开辟一块空间将数据拷贝给子进程这种技术叫做写时拷贝。
进程状态初识 为了弄明白正在运行的进程是什么意思我们需要知道进程的不同状态。一个进程可以有几个状态在 Linux内核里进程有时候也叫做任务下面是Kernel源代码中的定义
/*
\* The task state array is a strange bitmap of
\* reasons to sleep. Thus running is zero, and
\* you can test for combinations of others with
\* simple bit tests.
*/
static const char * const task_state_array[] {
R (running), /* 0 */
S (sleeping), /* 1 */
D (disk sleep), /* 2 */
T (stopped), /* 4 */
t (tracing stop), /* 8 */
X (dead), /* 16 */
Z (zombie), /* 32 */
};R运行状态running: 并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里。 S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠(interruptible sleep)。 D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的进程通常会等待IO的结束。 T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。 X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态 。 进程状态有很多种第一次接触进程状态只简单认识三大状态运行、阻塞、挂起。 一个进程要执行要先进到运行队列中排队。
一个进程到CPU上不一定必须等到它执行结束才被拿下去每一个进程都有时间片如果时间到了但是没有结束依然会被拿下来到放到后面重新排队防止一个进程一直占用资源的情况。 而由于后面的进程都在排队但是还占据资源为了保证进程既能正常排队又能节省大量资源所以只留下PCB来排队将对应的代码和数据交换到磁盘中等轮到时再将对应的代码和数据交换过来中间只有PCB的过程就是一种挂起状态。