目录算法
进程管理多线程
进程间有哪些通讯方式?ide
同步、异步与互斥函数
并发与并行操作系统
调度线程
进程调度策略设计
用户级线程(user level thread):对于这类线程,有关线程管理的全部工做都由应用程序完成,内核意识不到线程的存在。在应用程序启动后,操做系统分配给该程序一个进程号,以及其对应的内存空间等资源。应用程序一般先在一个线程中运行,该线程被成为主线程。在其运行的某个时刻,能够经过调用线程库中的函数建立一个在相同进程中运行的新线程。用户级线程的好处是很是高效,不须要进入内核空间,但并发效率不高。
内核级线程(kernel level thread):对于这类线程,有关线程管理的全部工做由内核完成,应用程序没有进行线程管理的代码,只能调用内核线程的接口。内核维护进程及其内部的每一个线程,调度也由内核基于线程架构完成。内核级线程的好处是,内核能够将不一样线程更好地分配到不一样的CPU,以实现真正的并行计算。
事实上,在现代操做系统中,每每使用组合方式实现多线程,即线程建立彻底在用户空间中完成,而且一个应用程序中的多个用户级线程被映射到一些内核级线程上,至关因而一种折中方案。
管道是一种半双工的通讯方式,单向的、先进先出的、无结构的、固定大小的字节流。数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。
命名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。
信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步和通讯。
信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段;课本里面的PV操做就是对信号量的增减。
与其余通讯机制不一样的是,它可用于不一样机器间的进程通讯。
并发:在一个时间段中同时有多个程序在运行,但其实任一时刻,只有一个程序在CPU上运行,宏观上的并发是经过微观的不断切换实现的;
多线程:并发运行的一段代码。是实现异步的手段。
并行(和串行相比):在多CPU系统中,多个程序不管宏观仍是微观上都是同时执行的。
批处理系统
先来先服务 first-come first-serverd(FCFS)
最短做业优先 shortest job first(SJF)
最短剩余时间优先 shortest remaining time next(SRTN)
最高响应比优先 Highest Response Ratio Next(HRRN)
交互式系统
交互式系统有大量的用户交互操做,在该系统中调度算法的目标是快速地进行响应。
时间片轮转 Round Robin
优先级调度算法
多级反馈队列调度算法 Multilevel Feedback Queue
高优先级的进程等待被一个低优先级进程占用的资源时,就会出现优先级反转,即优先级较低的进程比优先级较高的进程先执行。
解决方法:
一个子进程结束后,它的父进程并无等待它(调用wait或者waitpid),那么这个子进程将成为一个僵尸进程。僵尸进程是一个已经死亡的进程,可是并无真正被销毁。它已经放弃了几乎全部内存空间,没有任何可执行代码,也不能被调度,仅仅在进程表中保留一个位置,记载该进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)供父进程收集,除此以外,僵尸进程再也不占有任何内存空间。这个僵尸进程可能会一直留在系统中直到系统重启。
危害:占用进程号,而系统所能使用的进程号是有限的;占用内存。
如下状况不会产生僵尸进程:
WNOHANG
(wait-no-hang)选项,若是没有发现结束的子进程,就会当即返回,不会将调用waitpid的进程阻塞。同时,waitpid还能够选择是等待任一子进程(同wait),仍是等待指定pid的子进程,仍是等待同一进程组下的任一子进程,仍是等待组ID等于pid的任一子进程;SIGCHLD
(signal-child)信号,能够注册一个信号处理函数,在该函数中调用waitpid,等待全部结束的子进程(注意:通常都须要循环调用waitpid,由于在信号处理函数开始执行以前,可能已经有多个子进程结束了,而信号处理函数只执行一次,因此要循环调用将全部结束的子进程回收);signal(SIGCLD, SIG_IGN)
(signal-ignore)通知内核,表示忽略SIGCHLD
信号,那么子进程结束后,内核会进行回收。一个父进程已经结束了,可是它的子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程会被Init(进程ID为1)接管,当这些孤儿进程结束时由Init完成状态收集工做。
陷阱是有意形成的“异常”,是执行一条指令的结果。陷阱是同步的。陷阱的主要做用是实现系统调用。好比,进程能够执行 syscall n
指令向内核请求服务。当进程执行这条指令后,会中断当前的控制流,陷入到内核态,执行相应的系统调用。内核的处理程序在执行结束后,会将结果返回给进程,同时退回到用户态。进程此时继续执行下一条指令。
中断由处理器外部的硬件产生,不是执行某条指令的结果,也没法预测发生时机。因为中断独立于当前执行的程序,所以中断是异步事件。中断包括 I/O 设备发出的 I/O 中断、各类定时器引发的时钟中断、调试程序中设置的断点等引发的调试中断等。
异常是一种错误状况,是执行当前指令的结果,可能被错误处理程序修正,也可能直接终止应用程序。异常是同步的。这里特指由于执行当前指令而产生的错误状况,好比除法异常、缺页异常等。有些书上为了区分,也将这类“异常”称为**“故障”**。
信号是一种更高层的软件形式的异常,一样会中断进程的控制流,能够由进程进行处理。一个信号表明了一个消息。信号的做用是用来通知进程发生了某种系统事件。
1)互斥。一次只有一个进程可使用一个资源。其余进程不能访问已分配给其余进程的资源。
2)占有并等待。当一个进程等待其余进程时,继续占有已经分配的资源。
3)不可抢占。不能强行抢占进程已占有的资源。
4)循环等待。存在一个封闭的进程链,使得每一个进程至少占有此链中下一个进程所须要的一个资源。
内存管理 参考