为何取这个标题呢?一是进程和线程是做为操做系统里最重要最核心的一部分。二是确实吃冰棍拉冰棍,没话,强行凑标题和以前的标题差很少字数。html
前一章写了系统调用的过程,算是一个小插曲,这个部分无论在哪里应该都是能够的。git
如今的这个系列已经和以前的标题渐行渐远了,本来是想以以前写的一个玩具型操做系统FragileOS为主线,可是在看书学习的过程当中稍微改了一下方向,已经不是特别关注一个操做系统的实现的完整流程和内部的联系,更多的是想系统的学习操做系统的各个模块而后辅以一些代码,可是无论怎么样,都是属于本身在学习操做系统的过程的一个记录github
<!--more-->小程序
进入正题服务器
进程的出现最最主要的缘由就是想要提升CPU的利用率网络
进程的定义数据结构
单核CPU在同一时刻只能运行一条指令,所谓的多进程只是指令来回切换的假象,可是由于速度太快,就能够当作是同时进行的。因此在进程切换的时就须要去组织进程的切换并发
控制进程的切换一个重要的数据结构就是进程控制块(process control block),是与每一个进程相关的还有操做系统用于控制进程的许多属性的集合性能
进程控制块的做用,是使一个在多道程序环境下不能独立进行的程序(含数据),成为一个能独立运行的基本单位,一个能与其余进程并发执行的进程。或者说,操做系统是根据PCB来对并发执行的进程进行控制和管理。学习
通常状况下,PCB中包含如下内容:
通常来讲,可能让进程发生切换有这几种事件:
可是随着PC的发展,这种从两方面状况发生了变化。第一,大多数时间都只有一个活跃的进程。毕竟通常来讲,你在使用Word编辑文件时,不太可能还同时让系统在后台编译程序。这样的状况下,调度器其实不须要作不少工做来决定到底运行哪一个进程——Word几乎就是惟一的选择。第二,计算机的速度愈来愈快,以致于CPU可能已经再也不那么稀缺了。对于不少PC的程序来讲,其限制主要在于用户能进行输入的比例,而不是CPU可以处理的比例。甚至就算是两个程序真的同时进行,其实先调度哪一个运行也无伤大雅,例如,一个Word和一个Excel同时在运行,先调度哪一个都行,由于用户可能同时在等待这两个程序的输出。
可是对于网络服务器来讲,这种状况又不同了。很是多的程序竞争CPU资源,所以,调度又变得很是重要了。举例来讲,调度器须要决定究竟是让平常统计进程运行仍是让响应用户请求的进程运行。
调度器除了须要考虑选择哪一个进程运行,还须要考虑到系统的性能。毕竟,进程之间的切换是开销很大的,这涉及到从用户态到内核状态的切换,进程状态的保存、恢复等等操做。
在进程进行来回切换如何保证当前进程的运行不会影响其它进程的运行,好比对于一个内存进程的读写,就要保证不能越界
因此就须要一个机制来把进程之间的地址空间隔离开
不一样进程间存在着不一样的相互制约关系。为了协调进程之间的相互制约关系,达到资源共享和进程协做,避免进程之间的冲突,就须要进程同步的概念。
多个进程能够共享系统中的各类资源,但其中许多资源一次只能为一个进程所使用,咱们把一次只容许一个进程使用的资源成为临界资源。 对临界资源的访问,必须互斥的进行。每一个进程中,访问临界资源的那段代码成为临界区。 为了保证临界资源的正确使用,能够把临界资源的访问过程分为四个部分。
通常实现进程的同步有这几种方法:
进程是资源分配的最小单位,线程是CPU调度的最小单位
在进程的切换时还须要对内存资源的一个切换,可是线程则不须要对资源的切换,因此引入是为了减少程序在并发执行时所付出的时空开销,提升操做系统的并发性能。
用户级线程是指不须要内核支持而在用户程序中实现的线程,内核对线程包一无所知。从内核角度考虑,就是按正常的方式管理,即单线程进程,可是它不能像内核级线程同样更好的运用多核CPU。
内核级线程创建和销毁都是由操做系统负责、经过系统调用完成的。在内核的支持下运行,不管是用户进程的线程,或者是系统进程的线程,他们的建立、撤销、切换都是依靠内核实现的。
试想一下若是没有内核级线程,当用户级的一个线程进行到I/O阻塞时,将会致使全部的线程都堵塞,由于以操做系统的层面来看,它们都属于用一个进程,因此会直接切换进程,其它的线程就得不到执行
在多处理器系统中,内核级线程可以真正的实现并行,可以执行同一进程内的多个线程
这一篇主要是简略的总结书上的一些概念,没有干货,在后面进行代码实现的时候会再深刻的去看。下一篇可能会去看Linux0.12在进程上面的实现。
原文出处:https://www.cnblogs.com/secoding/p/11417547.html