云晶Cloud:解说已有的操作系统(三)
04 操作系统中与编程有关的基本知识

进程线程的基本概念
并发和隔离。
程序执行的上下文(Context of Execution)
执行与调度的基本单位:thread
资源所有权:process
进程是资源的容器,包含(一个或)多个线程。内核调度的基本单位是线程(不完全是)、而非进程。
同一进程下的各个线程共享资源(address space、open files、signal handlers,etc),但寄存器、栈、PC指针等不共享。
进程和线程到底有什么区别?
以上其实已经说了一部分,线程是调度和执行的基本单位,最终代码都在线程中执行。而进程是资源的容器,包括一个或多个线程。同一个进程下的各个线程共享资源。
如下图为区别:

Linux的线程进程概念

Linux的线程是用户级别的,也就是内核中不存在线程。
所有的线程管理都在应用层去执行。
内核不关心,实际上也觉察不到线程的存在。
Windows的线程进程概念

而从上图也可以看出,Windows和Linux显然采用不同的理念。
windows的线程是内核级别的。
Windows是这些概念的一个例子。
内核维护着线程和进程的上下文。
调度实际上是基于线程而运行的。
05 进程间的通信
有了线程,进程的隔离,就需要线程进程之间的通信机制来保证协作完成任务,共享访问数据。
Windows进程间的通信
文件映射
共享内存
匿名管道(单项,一端写,一端读)
命名管道。
动态链接库
远程过程调用(可以在一台机器内,也可以跨机器)
UDS(Unix Domain Socket)
基于Windows的消息机制 ……
Linux进程间的通信
管道(Pipe),以及有名管道
信号(Signal)
报文(Message)队列(消息队列)
共享内存(效率最高)
信号量(Semaphore)
主要作用是进程间,以及同一进程的不同线程之间的同步手段(UDS)Socket套接字
以上Window和Linux虽然采用了不同的方式,概念上有所不同的方式进行进程间的通信,实际上,他们的基本原理类似。
06 线程间的通信
共享数据结构。共享内存
事件(Event)传递
消息队列
邮箱(ucosII)
07 线程同步
线程同步,即当有一个线程在对内存或者外设进行操作时,其他线程都不可以对这个内存地址或者外设进行操作,直到该线程完成操作,其他线程才可以进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,如下。
一般使用信号量(Semaphore)。
高级语言如java本身语言的设计就为此考虑,如synchronized关键字,wait,notify方法。
可以使用Mutex。
临界区对象。
08 信号量与互斥锁
Semaphore(信号量,或者信号灯)
以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。
如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。
这时,有一辆车离开停车场,看门人得知后,打开车栏,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。
在微观世界里,计算机世界里,比如访问硬盘空间,读取数据,往往资源有限。可以可以使用该机制,进行有效的对资源的访问进行协调控制。
Mutex(互斥锁)
一次只能有一个线程进入的特殊信号量。性能会比信号量好。对于某些特殊的应用场景,一次只能有一个线程访问,待该线程退出后,其他线程方可继续运行。例如操作系统的IO外设,打印机,现实生活当中的公共卫生间等等。

